Ch11. 시계열
datetime, scipy 패키지 사용
대부분의 시계열은 고정빈도(fixed frequency)로 표현되는데 데이터가 존재하는 지점이 15초 혹은 하루마다 특정 규칙에 따라 고정 간격을 가지게 된다.
날짜, 시간 자료형, 도구
from datetime import __(datetime, timedelta 등등) 날짜, 시간형 변환 및 연산은 SQL과 비슷. datetime 객체는 나라 혹은 언어에 따라 다양한 포멧을 제공한다. ex) 독일과 프랑스는 영문 시스템과 다르다
시계열 기초 색인, 선택, 부분 선택은 pandas.Series와 동일하게 동작 해석할 수 있는 날짜를 문자열로 넘겨서 편리하게 사용할 수 있다
import pandas as pd
import numpy as np
from datetime import datetime
dates=[datetime(2011,1,2),datetime(2011,1,5),datetime(2011,1,7),
datetime(2011,1,8),datetime(2011,1,10),datetime(2011,1,12)]
ts=pd.Series(np.random.randn(6), index=dates)
ts+ts[::3]
>> ts + ts의 0, 3,...3n번째 수가 더해진다. (다른 객체들은 null값으로 처리된다)
--해석할 수 있는 날짜를 문자열로 넘겨서 편리하게 사용할 수 있다
ts['1/10/2011']
ts['20110110']
-- 범위 선택할 수 있다, 2000-1-1부터 1000일까지 출력. 2002년 9월 26일까지 출력
longer_ts = pd.Series(np.random.randn(1000),
index=pd.date_range('1/1/2000'), periods=1000)
--2001년만 출력
longer_ts['2001']
--1월 6일부터 1월 10일까지 출력
ts['1/6/2011' : '1/11/2011']
--2011/9/1일 이후의 데이터 삭제
ts.truncate(after='1/9/2011')
--2019.01.01 부터 수요일 데이터를 10개 뽑는다
dates=pd.date_range('1/1/2019',periods=10, freq='W-WED')
-- 이 중 2월달 데이터만 뽑는다.
-- !!DataFrame 으로 변환 한 후, index에 dates 값을 넣어야한다
long_df=pd.DataFrame(np.random.randn(10,4), index=dates, columns=['newyork','texas','la','ohio'])
long_df.loc['2-2019']
중복된 색인을 갖는 시계열
.is_unique 속성을 통해 확인 가능.
유일하지 않은 타임 스템프를 집계하는 방법 중 한가지는 groupby(level=0) 사용하는 것
ex) grouped = ts.groupby(level=0)
날짜 범위, 빈도, 이동
date_range는 기본적으로 시작 시간이나 종료 시간의 타임스탬프(존재한다면)를 보존한다 시간을 자정에 맞추어 타임스탬프를 정규화 하고 싶으면 normalize=True 옵션을 사용한다
--4월 1일부터 시작해서 20개 데이터 조회
pd.date_range(start='2019-04-01', periods=20)
--4월 1일 끝나는 20개 데이터 조회
pd.date_range(after='2019-04-01', periods=20)
--1월부터 11월 기간 중, 월 마지막일 조회
pd.date_range('2019-01-01', '2019-12-01', freq='M')
-- freq를 사용해서 월 마지막 일, 시작 일, 영업마감일 등 기본 시계열 빈도를 다양하게 가질 수 있다
빈도는 날짜 오프셋이라는 불리는 객체 사용한다
from pandas.tseries.offsets import Hour, Minute
hour = Hour()
four_hours=Hour(4)
-- 1월 1일부터 1월 3일 23:59 까지 4시간 단위로 출력
pd.date_range('2019-01-01','2019-01-03 23:59', freq='4h')
-- 여러 오프셋을 합칠 수 있다
Hour(2) + Minute(30)
>> <150 * Minutes>
데이터 시프트
시프트는 데이터를 시간 축에서 앞이나 뒤로 이동하는 것
출력된 결과에서 이동하고 는값은 null로 표현되는 것을 볼 수 있다
ex) ts=pd.Series(np.random.randn(4),index=pd.date_range('1/1/2019',periods=4, freq='M'))

tz_localize : 지역화 시간으로 변환 tz_convert : 시계열이 특정 시간대로 지역화한 후 다른 시간대로 변환 가능
리샘플링 시계열의 빈도를 변환하는 과정 다운 샘플링 - 상위 빈도의 데이터를 하위 빈도로 집계 1) 각 간격의 양끝 중에서 어느 쪽을 닫을 것인지 2) 집계하려는 구간 라벨을 간격의 시작으로 할지 여부 업 샘플링 - 하위 빈도의 데이터를 상위 빈도로 집계 1) 다운 샘플링의 경우 대산 빈도는 반드시 원본 빈도의 하위 기간이어야 한다 2) 업샘플링의 경우 대상 빈도는 반드시 원본 빈도의 상위기간이어야 한다

ts.resample('5min', closed='right').sum() close 옵션은 단위의 어느쪽을 끝으로 결과를 내느냐가 결정. left , right 에 따라 sum이나 average 결과에 따라 다르다
누락된 데이터를 함수를 이용하여 매끄럽게 다듬을 수 있다 이동창 함수, 확장창 함수 ex) rolling(), expanding()
균등한 가중치를 가지는 관찰과 함께 고정 크기 창을 사용하는 다른 방법은 감쇠인자 상수에 좀 더 많은 가중치를 둬서 더 최근 값을 관찰하는 것
SciPy 패키지를 설치하여 사용자 정의 이동창 함수를 사용할 수 있다
Last updated
Was this helpful?