天天看點

python時間序列分析工具prophet,分析年周期變化和未來趨勢預測

作者:高騰嶽

prophet是facebook開發的一款開源時間序列分析預測工具。它根據已有序列分析,預測未來一段時間資料變化趨勢,并給出年變化趨勢,季節因素,節假日因素等。

安裝

conda install pystan
conda install fbprophet           

這個庫需要先安裝pystan這個庫,再進行安裝。

測試

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

path_file = f'./23003_3_3211.60'
df = path_to_df(path_file,'60')

m = Prophet(yearly_seasonality=True,changepoint_range=1,seasonality_mode='multiplicative',seasonality_prior_scale=365) 
# 訓練模型
m.fit(df)
#print(m)
# 建構預測集,預測未來一年的漲勢
future = m.make_future_dataframe(periods=365)
#print (future.tail())

# 進行預測
forecast = m.predict(future)
#forecast = m.predict(test)
m.plot(forecast)
plt.savefig('forecast.png',dpi=300)

#print (forecast.tail(10))
#forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail(10)
m.plot_components(forecast,figsize=(8,6))
plt.savefig('plot_components.png',dpi=300)
#m.add_seasonality()
#fig2 = m.plot(forecast)
#print()
fig, axes = plt.subplots(2,1,figsize=(6,8), dpi= 200)
axes[0].plot(forecast['ds'],forecast['yearly']) #lags=50,
axes[1].plot(forecast['ds'],forecast['trend'])
plt.savefig('plot_fig.png',dpi=300)           
python時間序列分析工具prophet,分析年周期變化和未來趨勢預測

點是觀測資料,實線是預測資料,灰色區域,是置信區間。這個是年變周期是365,預測時間也是未來1年。

python時間序列分析工具prophet,分析年周期變化和未來趨勢預測

這個圖是劃分趨勢性分量,年變分量,周分量。這個年變成分是之前decompose得到的趨勢性成分不太一樣,原理應該是類似的。

X1diff = df['y'].diff().dropna()

## 檢驗ARIMA模型的參數d
X1d = pm.arima.ndiffs(df['y'], alpha=0.05, test="kpss", max_d=3)
print("使用KPSS方法對序列X1的參數d取值進行預測,d = ",X1d)

X1diffd = pm.arima.ndiffs(X1diff, alpha=0.05, test="kpss", max_d=3)
print("使用KPSS方法對序列X1一階差分後的參數d取值進行預測,d = ",X1diffd)

X2d = pm.arima.ndiffs(df['y'], alpha=0.05, test="kpss", max_d=3)
print("使用KPSS方法對序列X2的參數d取值進行預測,d = ",X2d)

X1d = pm.arima.nsdiffs(df['y'], 365, max_D=2)
print("對序列X1的季節階數D取值進行預測,D = ",X1d)

X1diffd = pm.arima.nsdiffs(X1diff, 12, max_D=2)
print("序列X1一階差分後的季節階數D取值進行預測,D = ",X1diffd)
X1decomp = pm.arima.decompose(df["y"].values,"multiplicative", m=365)
## 可視化出分解的結果
ax = pm.utils.decomposed_plot(X1decomp,figure_kwargs = {"figsize": (10, 6)},
show=False)
ax[0].set_title("乘法模型分解結果")
plt.show()
## 使用加法模型分解結果(通常适用于平穩趨勢的序列)
X1decomp = pm.arima.decompose(X1diff.values,"additive", m=365)
## 可視化出分解的結果
ax = pm.utils.decomposed_plot(X1decomp,figure_kwargs = {"figsize": (10, 6)},
show=False)
ax[0].set_title("加法模型分解結果")
plt.show()
            

decompose分解結果

python時間序列分析工具prophet,分析年周期變化和未來趨勢預測

一階差分後decompose分解結果

python時間序列分析工具prophet,分析年周期變化和未來趨勢預測