본문 바로가기
Python/Basic Data Analysis

[Python] 이동평균 계산 (pandas.Series.rolling)

by JKyun 2017. 12. 28.

안녕하세요. 우주신 입니다.


오늘은 알아두면 매우 유용한 함수 pandas.Series.rolling에 대해 포스팅 하겠습니다.

데이터분석을 하다보면 일정 범위에서 규칙적으로 연산(예: 이동평균)을 해야할 일이 많습니다.

예를 들어, 날마다 일주일 간의 주가 평균을 알고 싶을 때, 매일 일일이 다 계산하는 것은 매우 비효율적 입니다.


이 때, 유용하게 쓸 수 있는 함수가 .rolling 이라고 보시면 됩니다.

예전에 이 함수를 모를 때는 for문을 이용하여 rolling 함수의 기능을 구현 하다보니 코드도 길고 실행하는 데도 시간이 꽤 걸렸던 기억이 있네요;;


우선, 이번 시간에 사용할 금융 데이터를 웹에서 불러오겠습니다.

(금융 데이터 불러오기: http://ordo.tistory.com/57)



현대차 종가 'Close' 열만 추출하여 데이터프레임 hd_close를 만들고,

print(hd_close.head())를 통해 처음 몇 개 데이터만 출력했습니다.





Series.rolling(window, min_periods=None, freq=None, center=False, win_type=None, on=None, axis=0, closed=None)


.rolling 함수에 많은 기능들이 포함되어 있지만, 주요 기능 몇가지만 살펴보겠습니다.

나머지 기능들은 https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.rolling.html 에서 확인할 수 있어요!


먼저, 데이터프레임 hd_close의 데이터들을 순차적으로 12개씩 이동평균을 내보겠습니다.

hd_close.rolling(window=12).mean()

window: 몇 개씩 연산할지 입력

.mean(): 평균내라


출력값을 보면 2010-01-19 부터 값이 나오는 것을 확인할 수 있는데, 이는 이전 12개의 데이터가 2010-01-19부터 존재하기 때문 입니다.

즉, 데이터가 12개 미만인 값들은 NaN으로 표시 됐습니다.

2010-01-19의 결과값 106875.0은 2010-01-04부터 2010-01-19까지의 현대차 주가(종가 기준)를 평균한 것 입니다.


데이터가 1개라도 존재하면 평균을 내고 싶을 때는, min_period 기능을 이용하면 됩니다.

hd_close.rolling(window=12, min_periods=1).mean()


이전 출력값과 달리 이번에는 2010-01-04부터 데이터가 1개 이상이면 모두 평균하여 계산되었습니다.


지금까지는 순차적으로 window의 개수에 따라 평균 계산되었습니다.

중간을 기준으로 이동평균하고 싶을 때는 center 기능을 이용하면 됩니다.

hd_close.rolling(window=12, center=True).mean()



출력값을 보면 2010-01-12부터 데이터가 출력이 되었고, 끝에는 2016-12-23까지 데이터가 출력이 됐습니다.

앞선 결과와 비교했을 때, NaN의 개수는 모두 11개로 같지만, center 기능을 통해 자동으로 중간을 중심으로 12개씩 계산 됐습니다.


그 외, .mean() 대신 .std()를 입력함으로써 평균 대신 분산을 이동하며 계산할 수 있습니다.

hd_close.rolling(window=12).std()







수고하셨습니다.


댓글