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)
点是观测数据,实线是预测数据,灰色区域,是置信区间。这个是年变周期是365,预测时间也是未来1年。
这个图是划分趋势性分量,年变分量,周分量。这个年变成分是之前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分解结果
一阶差分后decompose分解结果