fb-Prophet
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
학습하고 그래프 그리는 코드는 모두 같다.

오차범위 - 연한 하늘색으로 표시된 부분
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);


