Python/NumPy | Pandas

[Python] Pandas - 시계열 자료 다루기 2

비번변경 2023. 1. 7. 11:57

resample

시간 간격을 재조정하는 함수이다. 시간 구간이 작아지면 데이터 양이 증가하여 업 샘플링이라고 하고, 시간 구간이 커지면 데이터 양이 감소하여 다운 샘플링이라고 한다.

 

 

다운 샘플링

예로 들어 아래와 같은 일자별 데이터가 있다고 하자.

ts = pd.Series(np.random.randn(100), index=pd.date_range(
    "2018-1-1", periods=100, freq="D"))
ts.tail(10)

# 실행 결과
2018-04-01    0.422802
2018-04-02    1.948651
2018-04-03   -0.567525
2018-04-04    1.592544
2018-04-05    1.947456
2018-04-06    0.966879
2018-04-07    0.136668
2018-04-08   -0.423170
2018-04-09   -0.762016
2018-04-10    0.630708
Freq: D, dtype: float64

다운 샘플링은 원래 데이터가 그룹으로 묶이므로, 그룹 연산을 통해 대푯값을 구해야 한다.

ts.resample('W').mean()

# 실행 결과
2018-01-07    0.244912
2018-01-14   -0.098097
2018-01-21    0.071648
2018-01-28    0.041405
2018-02-04   -0.019551
2018-02-11    0.071691
2018-02-18   -0.100277
2018-02-25    0.170700
2018-03-04    0.016076
2018-03-11    0.124381
2018-03-18   -0.857374
2018-03-25   -0.906912
2018-04-01    0.695970
2018-04-08    0.800215
2018-04-15   -0.065654
Freq: W-SUN, dtype: float64

시/분 단위 데이터는 왼쪽 한계값은 포함되나 오른쪽 한계값은 구간에 포함되지 않는다. 왼쪽이 아니라 오른쪽 한계값을 구간에 포함하려면 closed='right'로 지정해야 한다.

ts = pd.Series(np.random.randn(60), index=pd.date_range(
    "2018-1-1", periods=60, freq="T"))
ts.head(10)
ts.resample('10T').sum()
ts.resample('10T', closed="right").sum()

# 실행 결과
2018-01-01 00:00:00   -0.391221
2018-01-01 00:01:00   -0.308474
2018-01-01 00:02:00    1.486798
2018-01-01 00:03:00    1.016321
2018-01-01 00:04:00   -1.033446
2018-01-01 00:05:00    0.331255
2018-01-01 00:06:00   -0.860644
2018-01-01 00:07:00   -0.163382
2018-01-01 00:08:00   -0.386474
2018-01-01 00:09:00   -1.648472
Freq: T, dtype: float64

2018-01-01 00:00:00   -1.957738
2018-01-01 00:10:00   -3.070620
2018-01-01 00:20:00    0.873202
2018-01-01 00:30:00   -3.959713
2018-01-01 00:40:00   -0.755731
2018-01-01 00:50:00   -0.997518
Freq: 10T, dtype: float64

2017-12-31 23:50:00   -0.391221
2018-01-01 00:00:00   -1.723923
2018-01-01 00:10:00   -2.862883
2018-01-01 00:20:00    0.953177
2018-01-01 00:30:00   -3.177519
2018-01-01 00:40:00    0.120274
2018-01-01 00:50:00   -2.786022
Freq: 10T, dtype: float64

 

ohlc

구간의 시고저종(open, high, low, close) 값을 구한다.

ts.resample('10T').ohlc()

# 실행 결과
                         open      high       low     close
2018-01-01 00:00:00 -0.391221  1.486798 -1.648472 -1.648472
2018-01-01 00:10:00 -0.157405  1.331567 -2.502106 -0.486980
2018-01-01 00:20:00  0.050331  1.423427 -0.945756  0.552434
2018-01-01 00:30:00  0.130306  1.017582 -2.085093  0.660956
2018-01-01 00:40:00  0.912500  1.378262 -1.533520  0.036351
2018-01-01 00:50:00  1.788504  1.788504 -1.692339  0.697612

 

 

업 샘플링

업 샘플링은 존재하지 않는 데이터를 만들어야 한다. 데이터를 만들 때는 앞에서 나온 데이터를 그대로 쓰는 forward filling과 뒤에서 나올 데이터를 미리 쓰는 backward filling을 사용한다. 각각 ffill, bfill 함수를 사용한다.

ts.resample('30s').ffill().head(10)
ts.resample('30s').bfill().head(10)

# 실행 결과
2018-01-01 00:00:00   -0.391221
2018-01-01 00:00:30   -0.391221
2018-01-01 00:01:00   -0.308474
2018-01-01 00:01:30   -0.308474
2018-01-01 00:02:00    1.486798
2018-01-01 00:02:30    1.486798
2018-01-01 00:03:00    1.016321
2018-01-01 00:03:30    1.016321
2018-01-01 00:04:00   -1.033446
2018-01-01 00:04:30   -1.033446
Freq: 30S, dtype: float64

2018-01-01 00:00:00   -0.391221
2018-01-01 00:00:30   -0.308474
2018-01-01 00:01:00   -0.308474
2018-01-01 00:01:30    1.486798
2018-01-01 00:02:00    1.486798
2018-01-01 00:02:30    1.016321
2018-01-01 00:03:00    1.016321
2018-01-01 00:03:30   -1.033446
2018-01-01 00:04:00   -1.033446
2018-01-01 00:04:30    0.331255
Freq: 30S, dtype: float64

 

 

참고 문서

데이터 사이언스 스쿨 - 4.8 시계열 자료 다루기