Time series analysis (fb-Prophet 기초)

J·2024년 8월 27일

fb-Prophet

예제1 - 삼각함수

1.필요한 모듈 호출

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

먼저 fbprophet에 맞는 데이터가 필요하니, 시계열 형태로 삼각함수 그래프를 표시

time = np.linspace(0, 1, 365*2)
result = np.sin(2*np.pi*12*time)
ds = pd.date_range("2018-01-01", periods=365*2, freq="D")
df = pd.DataFrame({"ds":ds, "y":result})

df["y"].plot(figsize=(10,6));

위 그래프 상태에서 30일 후의 데이터를 예측하고 그래프에 나타내기

#학습
m = Prophet(yearly_seasonality=True, daily_seasonality=True)
m.fit(df);

#30일 후 데이터 예측
future = m.make_future_dataframe(periods=30)
forecast = m.predict(future)

m.plot(forecast);

  • 그래프에 표시된 검은색 점은 실제 학습에 이용된 데이터이고, 점이 사라진 시점부터는 예측된 데이터의 그래프이다.
  • 기존 데이터 기반 그래프처럼 잘 그려진 것을 확인할 수 있다.

bias 넣고 예측하기

위의 코드와 같은데 처음에 df의 result에 bias를 붙여서 바꿨다.
result = np.sin(2np.pi12time) + time + np.random.randn(3652)/4

학습하고 그래프 그리는 코드는 모두 같다.

오차범위 - 연한 하늘색으로 표시된 부분

예제2 - 주식 데이터 fbprophet 분석

yahoo finance 주식 데이터 크롤링

from bs4 import BeautifulSoup
from urllib.request import urlopen, Request

url = "https://finance.yahoo.com/quote/035420.KS/history?p=035420.KS&guccounter=1"
req = Request(url, headers={"User-Agent":"Chrome"})
page = urlopen(req).read()
soup = BeautifulSoup(page, "html.parser")
table = soup.find("table")
df_raw = pd.read_html(str(table))[0]

위 데이터 프레임에서 종가 데이터를 활용해 forecast를 진행

fbprophet 사용 형식에 맞추기

df_tmp = pd.DataFrame({"ds":df_raw["Date"], "y":df_raw["Close*"]})
df_target = df_tmp[:-1]	# 끝에 NaN 값을 제거함

# 혹시 모를 데이터 손실 보호를 위해 hardcopy
# 날짜 형태 변경
df = df_target.copy()
df["ds"] = pd.to_datetime(df_target["ds"], format="%b %d, %Y")

# .info()로 확인하면 object이기 때문에 숫자로 바꿔줌
df["y"] = df["y"].astype("float")

prophet 적용 & 예측

m = Prophet(yearly_seasonality=True, daily_seasonality=True)
m.fit(df);

future = m.make_future_dataframe(periods=30)
forecast = m.predict(future)
forecast[["ds", "yhat", "yhat_lower", "yhat_upper"]].tail()

기존 100개의 데이터가, 예측 데이터 추가되어 총 130개로 늘어남

데이터 시각화

plt.figure(figsize=(12,6))
plt.plot(df["ds"], df["y"], label="real")
plt.grid(True)
plt.show()

forecast component별 시각화 (trend, weekly, yearly)

m.plot_components(forecast);

profile
Full of adventure

0개의 댓글