[python] Rolling
기간이동 계산 (rolling)
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None, method='single')
rolling은 일정량의 데이타에서 구간별로 값을 구하는 것을 말한다.
예를 들자면 1~100 까지의 숫자에서 3개씩 합을 구하자고 한다면
- [NaN, NaN, 1], [NaN, 1, 2], [1, 2, 3]... [97 + 98 + 99], [98 + 99 + 100] 식으로 값을 구하는 것이다.
먼저 설명에 사용할 2가지 종류의 데이타를 만들겠습니다.
import pandas as pd
period = pd.period_range(start='2024-01-13 00:00:00',end='2024-01-13 02:30:00',freq='30T')
data = {'col1':[1,2,3,4,5,6],'period':period}
idx = ['row1','row2','row3','row4','row5','row6']
df1 = pd.DataFrame({'col1':[1, 2, 3, 4, 5, 6]}, index = period)
df2 = pd.DataFrame(data= data, index = idx)
df3 = pd.DataFrame({'col1':[1, 2, 3, 4, 5, 6], 'col2':[10, 20, 30, 40, 50, 60]}, index = period)
- 데이타 df1
index가 dateTime으로 설정되어 있고 하나의 col1 있는 경우 입니다.
col1
2024-01-13 00:00 1
2024-01-13 00:30 2
2024-01-13 01:00 3
2024-01-13 01:30 4
2024-01-13 02:00 5
2024-01-13 02:30 6
- 데이타 df2
df1은 별도의 index가 있고 두개의 column인 col1, period가 있는 경우 입니다.
col1 period
row1 1 2024-01-13 00:00
row2 2 2024-01-13 00:30
row3 3 2024-01-13 01:00
row4 4 2024-01-13 01:30
row5 5 2024-01-13 02:00
row6 6 2024-01-13 02:30
- 데이타 df3
df3은 index가 dateTime으로 설정되어 있고 두개의 컬럼 col1, col2 있는 경우 입니다.
col1 col2
2024-01-13 00:00 1 10
2024-01-13 00:30 2 20
2024-01-13 01:00 3 30
2024-01-13 01:30 4 40
2024-01-13 02:00 5 50
2024-01-13 02:30 6 60
위의 데이타를 가지고 각각의 예를 들어 보겠습니다.
Parameters
window
한 윈도우 안에 들어갈 갯수
df.rolling(window=2, on='period').sum()
df.rolling(2, on='period').sum() # window를 생략할 수 있다.
df.rolling(window='60T', on='period').sum() # 시간 간격이 들어 갈 수 있다
df.rolling('60T', on='period').sum()
df.rolling(2, on='period').sum() # 정수인 경우
[결과]
col1 period
row1 NaN 2024-01-13 00:00
row2 3.0 2024-01-13 00:30
row3 5.0 2024-01-13 01:00
row4 7.0 2024-01-13 01:30
row5 9.0 2024-01-13 02:00
row6 11.0 2024-01-13 02:30
df.rolling(window='60T', on='period').sum() # 시간간격인 경우
[결과]
col1 period
row1 1.0 2024-01-13 00:00
row2 3.0 2024-01-13 00:30
row3 5.0 2024-01-13 01:00
row4 7.0 2024-01-13 01:30
row5 9.0 2024-01-13 02:00
row6 11.0 2024-01-13 02:30
on
DataFrame의 인덱스가 아닌 다른 것을 사용할때 사용합니다.
df1.rolling(window='60T').sum() # df1의 경우 인덱스가 data type 이므로 생략가능
df2.rolling(window='60T', on='period').sum() # df2의 경우 인덱스가 date type이 아니므로 반드시 정의 해주어야 한다.
df3.rolling(window=2).sum() # col1 및 col2 결과값이 모두 sum된다.
df3.rolling(window=2, on='col2').sum() # col2는 sum 없이 디스플레이만 된다.
win_type
df.rolling(window=3, on='period', win_type='gaussian').sum(std=3) # 가우시안 분포로 가중치 부여
[결과]
col1 period
row1 NaN 2024-01-13 00:00
row2 NaN 2024-01-13 00:30
row3 5.783838 2024-01-13 01:00
row4 8.675757 2024-01-13 01:30
row5 11.567676 2024-01-13 02:00
row6 14.459595 2024-01-13 02:30
Function application
apply
rolling 의 결과 값을 재 가공할때 사용합니다.
from utils import *
def cal(prices):
return np.log(prices) # 현재 값에 각각의 로그 값을 처리합니다.
result = df1.rolling(2).sum().apply(cal) # rolling 후 cal 함수를 호출합니다.
col1
2024-01-13 00:00 NaN
2024-01-13 00:30 1.098612
2024-01-13 01:00 1.609438
2024-01-13 01:30 1.945910
2024-01-13 02:00 2.197225
2024-01-13 02:30 2.397895
Computations
https://pandas.pydata.org/docs/reference/frame.html 의 computatins 편을 참조 바랍니다.
이곳에서는 대표적인 몇가지 예만 설명 드리겠습니다.
mean
n개 값의 평균을 구한다..
DataFram.rolling(n).mean()
sum
n개 값의 합을 구한다.
DataFram.rolling(n).sum()
min
n개 값중 최소 값을 구한다.
DataFram.rolling(n).min()
max
n개 값중 최대 값을 구한다.
DataFram.rolling(n).max()