IDEA使用fbprophet预测展示图表
三步:安装 - 配置 - 运行
目录
安装
IDEA python插件安装
- IDEA python插件包含了Jupyter NoteBook运行配置组件
Anaconda
Anaconda包含了python
-
下载安装Anaconda:使用清华镜像库,选择
Anaconda3-2021.05-Windows-x86_64.exe
下载 -
安装python
conda create -n py38 python=3.8
fbprophet
conda install pystan
conda install -c conda-forge fbprophet
Jupyter Notebook
conda install jupyter notebook
配置
Anaconda python
File
-Project Structure
-SDKs
-+
-python SDK
-Virtualenv Enviroment
- 选择Anaconda中的python.exe
Jupyter Notebook
-
添加一个Jupyter NoteBook运行配置
配置ipynb脚本
- 上移下移
运行
引入plot
-
图形展示需要引入plot
from fbprophet.plot import plot, plot_components ## 展示趋势 plot(model, y_pred).show() ## 展示分析 plot_components(model, y_pred).show()
运行ipynb脚本
- 先运行上面添加的Jupyter NoteBook运行配置
- 再运行具体ipynb脚本
- 中间可能会出现
No module named 'XXX'
,请自行根据提示安装module,使用conda install XXX
脚本
from fbprophet.plot import plot, plot_components
import numpy as np
import pandas as pd
from fbprophet import Prophet
import matplotlib.pyplot as plt
# 读取数据
train_data = pd.read_excel(r'D:\data.xlsx', sheet_name='data')
test_data = pd.read_excel(r'D:\data.xlsx', sheet_name='data')
train_data.columns = ['ds', 'y']
test_data.columns = ['ds', 'y']
prf_params = {
# 季节性趋势
"seasonality_mode": 'multiplicative', # 周期性叠加方式:additive - 加法, multiplicative - 乘法
"seasonality_prior_scale": 10, # 周期性权重
"daily_seasonality": True, # 是否增加日周期性
'weekly_seasonality': True, # 是否增加月周期性
'yearly_seasonality': False, # 是否增加年周期性
# 趋势项模型
'changepoint_prior_scale': 0.05, # 趋势项变更点权重
'changepoint_range': 1, # 趋势项变更点位于训练数据的时间范围
'n_changepoints': 12, # 趋势项变更点数量
# 节假日效应
'holidays_prior_scale': 0.05, # 节假日权重
'holidays': pd.concat([
pd.DataFrame({
"holiday": "dragon_boat_festival",
"ds": pd.to_datetime(['2021-06-14']),
"lower_window": -2,
"upper_window": 0
}), pd.DataFrame({
'holiday': 'jd_618',
'ds': pd.to_datetime(['2021-06-18']), # 节假日中心点
'lower_window': 0, # 节假日开始时间距中心天数
'upper_window': 5 # 节假日结束时间距中心天数
})
]) # 设置节假日
}
# 训练
model = Prophet(**prf_params)
model.fit(train_data)
# 预测7天
periods = 10080
future = model.make_future_dataframe(periods=periods, freq='min', include_history=True).dropna()
y_pred = model.predict(future)
# 评估
y_pred = pd.merge(y_pred, test_data, on='ds', how='left')
mae = np.mean((np.abs(y_pred["y"] - y_pred["yhat"])))
print("平均测试误差(MAE):{}".format(mae))
plot(model, y_pred).show()
plot_components(model, y_pred).show()