[python] Rolling updated_at: 2024-12-15 21:44

기간이동 계산 (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()
평점을 남겨주세요
평점 : 5.0
총 투표수 : 1

질문 및 답글