반응형

02-10. 기간이동 계산 (rolling)

DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None, method='single')

 

개요


rolling 메서드는 현재 열에 대하여 일정 크기의 창(window)를 이용하여 그 window안의 값을 추가 메서드를 통해 계산하는 메서드 입니다.

 

사용법


기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None, method='single')
window : 계산할 창(window)의 크기 입니다. 열 기준으로 계산할 경우 행의 수입니다.
min_periods : 계산할 최소 크기(기간) 입니다. window 안의 값의 수가 min_periods의 값보다 작을경우 NaN을 출력합니다.
기본적으로 window 크기와 동일합니다.
center : {True / False} 레이블을 window의 중간에 둘지 여부입니다. 기본값은 False로 레이블이 창 우측에 위치합니다.
win_type : {'triang' / 'gaussian' / ...} 가중치를 넣어 계산할 경우 계산 방식 입니다. 때에따라 연산 메서드에 추가 인수를 지정해야할수도 있습니다.
on : 시계열 인덱스나, 시계열과 유사한 열이 있을 경우 이 열을 기준으로 rolling을 수행할 수 있습니다.
axis : 계산의 기준이 될 축입니다.
closed : {'left' / 'right' / 'both' / 'neither'} window가 닫히는 방향입니다. 자세한건 아래 예시 참고바랍니다
method :{'single' / 'table'} numba 를 이용하여 테이블 계산을 진행하여 속도를 높힐지 여부입니다. 현재 'single'만 사용가능합니다.
※ method 인수의 numba 사용은 02-09 누적계산(expending)에서 자세히 다루고 있습니다.

반응형

 

예시


먼저 기본적인 사용법 예시를위하여 6x2 짜리 데이터를 만들어 보겠습니다.
col2는 on 인수의 사용을 위해 시계열 값으로 작성하였으나, 일반 계산에서는 진행되지 않습니다.

period = pd.period_range(start='2022-01-13 00:00:00',end='2022-01-13 02:30:00',freq='30T')
data = {'col1':[1,2,3,4,5,6],'col2':period}
idx = ['row1','row2','row3','row4','row5','row6']
df = pd.DataFrame(data= data, index = idx)
print(df)
>>
      col1              col2
row1     1  2022-01-13 00:00
row2     2  2022-01-13 00:30
row3     3  2022-01-13 01:00
row4     4  2022-01-13 01:30
row5     5  2022-01-13 02:00
row6     6  2022-01-13 02:30


기본적인 사용법
window 크기를 지정해주면, 현재 행 이전으로 window 크기 만큼의 계산을 수행합니다.

print(df.rolling(window=3).sum()) # 뒤에 추가 메서드를 이용하여 연산을 지정해주어야합니다.
>>
      col1
row1   NaN # min_period의 크기는 지정하지 않을경우 window크기와 동일하므로 NaN출력
row2   NaN 
row3   6.0 # 1행, 2행, 3행의 sum값 출력
row4   9.0 # 2행, 3행, 4행의 sum값 출력
row5  12.0
row6  15.0

 

closed인수의 사용
closed는 계산의 닫는 위치를 지정합니다. 만약 6행을 기준으로 window=3을 계산한다고 하면 아래와 같은 범위로 window경계가 지정됩니다.
left : 3 ≤ x < 6
right : 3 < x ≤ 6
both : 3 ≤ x ≤ 6
neither : 3 < x < 6
closed='left'인 경우

print(df.rolling(window=3, closed='left').sum())
>>
      col1
row1   NaN
row2   NaN
row3   NaN
row4   6.0
row5   9.0
row6  12.0

closed='right'인 경우

print(df.rolling(window=3, closed='right').sum())
>>
      col1
row1   NaN
row2   NaN
row3   6.0
row4   9.0
row5  12.0
row6  15.0

closed='both'인 경우

print(df.rolling(window=3, closed='both').sum())
>>
       col1
row1   NaN
row2   NaN
row3   6.0
row4  10.0
row5  14.0
row6  18.0

closed='neither'인 경우 min_period보다 window 크기가 작으므로 min_period를 지정해주어야합니다.

print(df.rolling(window=3, closed='neither').sum())
>>
      col1
row1   NaN
row2   NaN
row3   NaN
row4   NaN
row5   NaN
row6   NaN

print(df.rolling(window=3, closed='neither',min_periods=2).sum()) # min_period 지정
>>
      col1
row1   NaN
row2   NaN
row3   3.0
row4   5.0
row5   7.0
row6   9.0

 

center인수의 사용
center을 이용하여 레이블이 window의 중앙에 올지를 정할 수 있습니다.
자세한건 아래 이미지를 참고하면 이해하기 쉽습니다.


center=True인 경우 레이블이 window의 중앙에 위치한 것을 알 수 있습니다.

print(df.rolling(window=3, center=True).sum())
>>
      col1
row1   NaN
row2   6.0
row3   9.0
row4  12.0
row5  15.0
row6   NaN

 

win_type인수의 사용
win_type을 지정할 경우 가중치를 주며 계산을 할 수 있습니다.

print(df.rolling(window=3, win_type='triang').sum()) # 삼각함수로 가중치 부여
>>
      col1
row1   NaN
row2   NaN
row3   4.0
row4   6.0
row5   8.0
row6  10.0

print(df.rolling(window=3, win_type='gaussian').sum(std=3)) # 가우시안 분포로 가중치 부여
>>
           col1
row1        NaN
row2        NaN
row3   5.783838
row4   8.675757
row5  11.567676
row6  14.459595

 

on 인수의 사용
on='col2'를 이용하여 col2열의 시계열 인덱스를 기준으로 rolling의 수행이 가능합니다.

print(df.rolling(window='60T',on='col2').sum())
>>
      col1              col2
row1   1.0  2022-01-13 00:00 # col2를 기준으로 rolling이 수행됨
row2   3.0  2022-01-13 00:30
row3   5.0  2022-01-13 01:00
row4   7.0  2022-01-13 01:30
row5   9.0  2022-01-13 02:00
row6  11.0  2022-01-13 02:30
반응형

+ 최근 글