오늘은 파이썬의 window function을 배워보고자 한다.
window function이란 행과 행 간에 비교, 연산, 정의를 하기 위해 사용되는 함수이다.
파이썬에서 사용하는 window function에는 shift, rolling, expanding이 있다.
시계열 데이터의 인덱스를 원하는 기간만큼 끌어당기는 메서드(시계열 데이터가 아니어도 가능하지만 시계열 데이터에 주로 사용된다)
df.shift(1).head() # 이전 값 땡김df.shift(**-**1).head() # 이후 값 땡김df.shift(periods=3,freq='D') # 3일 이동df.shift(periods=3,freq='infer') # df의 날짜간격을 분석해서 적당한 주기를 이동
데이터 프레임 내 범위를 지정하여 값을 연산해주는 메서드
df.rolling(window=3).mean() # 3일 이동평균 구하기df.rolling(window=3).sum() # 3일 누적합 구하기df.rolling(window=3, center=Ture, closed='left').mean() # 3일 이동평균을 중간 행을 기준으로 계산하고, 왼쪽 값을 포함하여 계산

# closed 옵션 비교하기
a = pd.DataFrame({'values': [10, 20, 30, 40, 50]})
# 현재 위치를 포함하여 데이터가 3개인 순간부터 계산
aa = a.rolling(window=3).sum() # closed='right'
# 현재 위치를 포함하지 않고 데이터가 3개인 순간부터 계산
b = a.rolling(window=3, closed='left').sum()
# right 와 동일하게 동작. 현재위치와 양쪽 경계를 포함하여 데이터가 3개인 순간부터 계산
c = a.rolling(window=3, closed='both').sum()
# 양쪽 경계와 현재위치를 사용하지않고 윈도우 크기 3을 만족할 경우에만 출력
# window 가 3인 상태에서, 양쪽 경계값을 제외하면 1개의 데이터가 남으므로 모든 값이 NaN으로 출력.
# 무의미
d = a.rolling(window=3, closed='neither').sum()
#결과표 한번에 보여주기
e = pd.concat([a,aa, b,c,d], axis=1)
e.columns = ['원본','right','left','both','neither']
e

window는 최소한의 데이터 개수이다.
both가 자기 자신 포함 양쪽 데이터를 다 합친 개수이기 때문에 인덱스 1에 60이 생성되어야 할 것 같지만, window=3이기 때문에 인덱스 1은 최소 데이터 개수를 충족하지 못하여 NaN으로 뜬다
neither은 window에서 양쪽 데이터를 뺀 것인데, window=3이므로 양쪽을 빼면 자기 자신만 남는다. 그런데 rolling에서는 기본적으로 3개 이상의 데이터가 있어야 한다고 지정되어 있기 때문에 전부 NaN이 뜬다.
d = a.rolling(window=3, closed='neither', min_periods=1).sum()
코드를 수정하면 데이터가 뜨는 걸 볼 수 있다.

Rolling은 범위를 지정해주지만 Expanding은 범위를 지정하지 않고 계속해서 값을 누적해서 연산을 해주는 메서드이다
df.expanding(axis=1).sum() #열 기준으로 누적합 계산