배고픈 개발자 이야기
[2021/08/30] 파이썬 머신러닝 (시계열 분석_이동평균) 본문
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 시킨 그래프의 모습이다.
'인포섹 아카데미' 카테고리의 다른 글
[2021/09/06] DNN_CNN (선형회귀 분석) (0) | 2021.09.06 |
---|---|
[2021/08/31] 파이썬 머신러닝 (시계열 분석_지수이동평균) (0) | 2021.08.31 |
[2021/08/27] 파이썬 머신러닝 (XGBoost 유방암 분류) (1) | 2021.08.27 |
[2021/08/25~26] 파이썬 머신러닝 랜덤포레스트 (0) | 2021.08.25 |
[2021/08/24] 파이썬 머신러닝 Decision Tree (0) | 2021.08.24 |
Comments