배고픈 개발자 이야기

[2021/08/30] 파이썬 머신러닝 (시계열 분석_이동평균) 본문

인포섹 아카데미

[2021/08/30] 파이썬 머신러닝 (시계열 분석_이동평균)

이융희 2021. 8. 30. 16:41
728x90

Simple Moving Average

 

다음과 같이 pandas 메소드를 쓰면 일요일이 주단위로 8개 출력된다.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
%matplotlib inline

# 2020년 8월 부터 일요일 8개를 조회
# start : 시작일, periods : 생성할 날짜의 개수, freq : 생성할 날짜의 주기
pd.date_range(start="2020-08", periods=8, freq="W")

 

다음은 데이터 프레임 컬럼으로 사용했을 때와 3주치 평균 컬럼을 추가한것이다.

df = pd.DataFrame({
    "week":pd.date_range(start="2020-08", periods=8, freq="W"),
    "sales":[39,44,40,45,38,43,39,np.nan],
    "3MA":[0]*8
})
# 0~2주차 평균을 3주차에 shift해서 적용
df["3MA"] = df[["sales"]].rolling(3).mean().shift(1)
df

 

 

Simple Moving Average를 이용한 월별 애플사 주식가격 예측

plt.style.use("ggplot")
df = pd.read_csv('apple_stock.csv')
df["Date"] = pd.to_datetime(df["Date"])
df.set_index("Date", inplace=True)
df[['Close']].plot(figsize=(20,10))
df['Close_7Days_Mean'] = df['Close'].rolling(7).mean()
plt.title('Close Price for Apple')

2010~2020년까지 애플의 종가 그래프이다.

 

7일전 평균값을 shift 하여 이동평균 그래프를 추가하였다.

last_day = datetime(2019, 1, 2)
df.loc[last_day, "Close"] = np.nan
df['Close_7Days_Mean'] = df['Close'].rolling(7).mean().shift(1)
df[['Close', 'Close_7Days_Mean']].plot(figsize=(30,20))
# 7일전 평균값 그래프 + 종가 그래프

조금 알아보기 힘들지만 이전 7일평균값으로 부드러워진 곡선 그래프를 볼 수 있다.

 

 

또 pandas dataframe에는 resample이라는 데이터프레임의 시계열 인덱스 기준으로 샘플링을 편하게 해주는 메소드가 있다. 아래와 같이 하면 월단위로 시계열 데이터를 다시 만들어 준다.

# 월단위로 주식 가격의 평균을 샘플링
df_monthly = df.resample(rule='M').mean()
# 마지막 컬럼(Close_7Days_Mean) 제외
df_monthly = df_monthly.iloc[:,:-1]
# 월별 주가(종가)를 시각화
df_monthly[['Close']].plot(figsize=(20,10))
plt.title('Monthly Mean Close Price for Apple')

월별값이 적용되어 매우 매끄러워진 그래프

 

 

다음은 월단위 평균값을 또 3개월치씩 이동평균을 적용하는 코드이다.

df_monthly[['Close_3Month_Mean']] = df_monthly[['Close']].rolling(3).mean().shift(1)
df_monthly[['Close', 'Close_3Month_Mean']].plot(figsize=(15,20))

이전 3개월 데이터의 평균을 오른쪽으로 1개월씩 shift 시킨 그래프의 모습이다.

Comments