fbprophet
시계열 분석 : 시간의 흐름에 따라 정렬된 데이터에서 의미있는 요약과 통계 정보를 추출, 분석, 예측하는 방법론
fbprophet 란? 페이스북에서 만든 오픈 소스로 시계열 분석 예측(모델링) 라이브러리 (파이썬, R모듈)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
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.head()
#시계열 학습
import fbprophet from Prophet
m = Prophet(yearly_seasonlity = True, daily_seasonality=True)
m.fit(df)
#예측
future = m.make_future_dataframe(periods=30) #30일을 예측
forecast = m.predict(future)
#예측 시 make_futrue_dataframe을 이용해 미래의 datafram 만들어줌 predict로 채워넣기(?)
m.plot(forecast)
.
.
: prophet를 사용하기 위해서는 ds(datastamp)와 수치로 작성한 데이터 자료(y)가 필요하다.
m.plot_components(forecast)
예측 구성요소를 볼 때 사용하며 시계열 추세, 연간 계절성, 주간 계절성 (공휴일 포함)을 볼 수 있다.
seasonality_prior_scale
yearly_seasonality, weekly_seasonality, daily_seasonality 와 관련 있는 파라미터로 날짜 데이터의 패턴의 유무를 표시
changepoint_prior_scale
추세에 따라 데이터를 유연하게 반영할 것인지 여부를 결정, 추세에 덜 유연하게 반응하려면 0.05보다 작게 설정
+주변 날짜를 포함시키기 위해 lower_window, upper_window를 사용해 업데이트의 영향을 조절 가능
예) 기준일에 전 날을 포함하면 lower_window = -1, upper_window = 0, 기준일에 다음 날까지 포함 lower_window = 0, upper_window = 1
holiday_prior_scale
default = 10.0 주기성을 가지지 않지만 큰 영향을 주는 독립적인 이벤트가 존재할 경우
+add_country_holidays(country_name='KR') 으로 한국의 휴일반영 가능
make_futrue_dataframe(periods=30, freq='D')
미래를 예측할 데이터프레임 자리를 만들어 놓는 것
forecast_data.yhat.values[-120:]
예측
forecast_data.yhat_lower.values[-120:]
불확실성 구간 lower
forecast_data.yhat_upper.values[-120:]
불확실성 구간 upper
참고1 참고2 / 활용방법 나중에 보자
.
.
함수의 기초
예)
-return을 사용하면,
def test_def(a, b):
return a+b
c = test_def(2, 3)
print(10 + c)
--result
10
-print를 사용하면,
def test_def(a, b):
print a+b
c = test_def(2, 3)
print(10 + c)
--result
TypeError
def 내에서의 변수와 밖에서의 변수는 이름이 같아도 다른 것이다. (지역변수 / 전역변수)
$$ 식 $$
를 하면 수학 식(가운데 정렬)로 만들 수 있다.
%%writefile ./drawSinWave.py
로 파일을 만들 수 있다.
jupyter 에서 def 설명보기 shift + tap
기능을 만들고 설명을 추가하려면 ~~
(점 3개 찍기) 로 적으면 된다.
.
.
def plotSinWave(**kwargs): # **가 중요하고 그 뒤에 영어는 상관없음
```
plot sin wave
y = a sin(2 pi f t + t_0) + b
```
endTime = kwargs.get('endTime', 1)
sampleTime = kwargs.get('sampleTime', 0.01)
amp = kwargs.get('amp', 1)
freq = kwargs.get('freq', 1)
startTime = kwargs.get('startTime', 1)
bias = kwargs.get('bias', 1)
figsize = kwargs.get('figsize', 1)
time = np. arange(startTime, endTime, sampleTime)
result = amp + np.sin(2 * np.pi * freq * time + startTime) + bias
plt.figure(figsize=(12,6))
plt.plot(time, result)
plt.grie(True)
plt.xlabel('time')
plt.ylabel('sin')
plt.title(str(amp) + '*sin(2*pi' + str(freq) +
'*t+' + str(startTime) + ')+' + str(bias))
plt.show()
.
.
(1) .py로 파일을 만들어야 함.
(2) if __name__ == "__main__": 이 있어야 함수가 실행됨 (함수를 돌리라는 명령)
-> __name__ 에서는 어디서 실행했는지가 저장됨
직접 실행한 것인지, 다른 코드에서 import로 불러와지는 것인지 판단해서 직접 실행한 경우 동작을 함, main 이면 직접 실행했다는 소리
위 코드 이어서
if __name__ == "__main__":
print("Hello Word")
print("This is test graph")
plotSinWave(amp=1, endTime=2) #여기서 실행!