목차
[Python] Pandas 이동평균 함수 사용법 (Rolling)
파이썬의 판다스에서 제공하는 함수 중에 Rolling이라는 함수가 있습니다. 테이블에 많은 데이터가 있고 전체에 대한 평균이나 최소 최대값을 알고 싶은 것이아니라 Window 창이 이동하듯이 X축의 창을 이동하면서 Y값의 평균 최소 최대 값을 구해야 하는 경우들이 있습니다.
일반적인 코딩은 for문을 여러번 사용하여 복잡하게 계산하지만 Pandas rolling을 사용하게 되면 간단하게 이동하는 윈도우의 수치결과를 얻을 수 있습니다.
참고로 앞서 포스트에서 rolling 함수를 사용해서 30일간 이동 평균 Window를 이동시키면서 코스피 고점 대비 하락률을 계산하고 그리는 예제를 하였습니다. 해당 내용이 궁금하시면 아래 링크 참조 하시길 바랍니다.
https://scribblinganything.tistory.com/382
[Python] Pandas Rolling Syntax
Rolling 함수의 Syntax는 아래와 같습니다.
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None, method='single')
Dataframe의 값을 수정하는데 Dataframe에 대한 내용을 확인하고 싶으시면 아래 링크 참조 하시길 바랍니다.
https://scribblinganything.tistory.com/371
Syntax에서 중요한 입력 값은 아래와 같습니다.
- window
- min_periods
- win_type
window는 앞서 언급한 윈도우의 크기입니다. 앞서 주식에서 30일에 대한 평균을 이동하면서 구할때 윈도우 사이즈는 30이 되는 것입니다.
min_period는 윈도우 사이즈보다 데이터가 작을 때 NaN(Not a Number)으로 표기할 것인지 최소한의 개수만 있으면 데이터를 처리할지를 선정해 줍니다.
win_type은 윈도우에 weighting을 주는 형태입니다. 가령 Gaussian(가우시안) 형태로 무게를 다르게 주고 싶으면 Window 내에서 값들이 Gaussian으로 weighting을 받고 수식이 결정 됩니다.
Rolling의 결과는 아래와 같은 수식을 계산할 수 있습니다.
- mean(평균)
- max(최대값)
- sum(총합)
- min(최소값)
- median(중간값)
- std(표준편차)
아래 예제를 통해 쉽게 이해해보도록 하겠습니다.
[Python] Pandas 이동평균 함수 사용법 (Rolling) : 예제(window)
코드>>
import pandas as pd
dic_var = {'A': [0, 1, 2, 3, 4, 5], 'B': [6, 7, 8, 9, 10, 11]}
data = pd.DataFrame(dic_var)
result = data.rolling(3)
print(data)
print(result.min())
print(result.sum())
결과>>
A B
0 0 6
1 1 7
2 2 8
3 3 9
4 4 10
5 5 11
A B
0 NaN NaN
1 NaN NaN
2 0.0 6.0
3 1.0 7.0
4 2.0 8.0
5 3.0 9.0
A B
0 NaN NaN
1 NaN NaN
2 3.0 21.0
3 6.0 24.0
4 9.0 27.0
5 12.0 30.0
코드 주석>>
라인 3: 분석할 테이블값을 입력합니다.
라인 4: Dataframe 모듈을 사용해서 테이블화 합니다.
라인 6: 입력값으로 window= 3 만을 넣었습니다.
결과 주석>>
첫번째 테이블 결과는 원 데이터입니다.
두번째 테이블 결과는 윈도우 3개를 사용해서 최소값을 구한 것인데 앞에 2개는 윈도우3개를 만족하지 못하여서 NaN(Not a Numer)가 나왔습니다. 2번 Index 부터 총 3개의 데이터를 받아서 최소값을 구할 수 있습니다.
[Python] Pandas 이동평균 함수 사용법 (Rolling) : 예제(min_periods, win_type)
다음 예제는 min_periods와 win_type을 사용한 예제를 살표 보겠습니다.
코드>>
import pandas as pd
dic_var = {'A': [0, 1, 2, 3, 4, 5], 'B': [6, 7, 8, 9, 10, 11]}
data = pd.DataFrame(dic_var)
result = data.rolling(3,min_periods=1, win_type='gaussian').sum(std=1)
print(result)
결과>>
A B
0 0.000000 3.639184
1 0.606531 10.245715
2 2.213061 15.491429
3 4.426123 17.704491
4 6.639184 19.917552
5 8.852245 22.130613
코드 주석>>
6번째 라인 : 가우시안 형태의 윈도우를 3개의 윈도우창 결과에 씌움니다. 윈도우창에1개의 데이터만 있어도 진행합니다. 그리고 가우시안의 표준편차는 1로 정했습니다.
결과 주석>>
이번에는 min_periods를 1로 설정했기 때문에 데이터가 모자라도 분석이 진행되었습니다. 그리고 win_type이 가우시안이므로 가운데가 볼록한 구조이므로 가운데 값의 비중을 높여서 계산된 것입니다.
이외에 다른 window는 scipy에서 정의한 형태는 사용이 가능합니다. 아래를 참조하셔서 윈도우를 선정하시면 됩니다.
https://docs.scipy.org/doc/scipy/reference/signal.windows.html#module-scipy.signal.windows
'파이썬(Python) > pandas' 카테고리의 다른 글
[Python] Pandas 여러가지 정렬방법(Multi Column, Index 제외 정렬 등) (0) | 2022.02.24 |
---|---|
[Python]Pandas에서 CSV 파일 읽기 에러 해결 (0) | 2022.02.23 |
[Python] 코스피 1년 차트 그리기(Pandas, Matplotlib) (0) | 2021.10.30 |
[Python] 코스피, 코스닥 값 불러와서 분석하기(pandas) (0) | 2021.10.28 |
[Python] Pandas DataFrames이란? 선언, 데이터 찾기, 정렬하기 예제(find, sort) (0) | 2021.10.26 |