Loading

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运行配置

    img

配置ipynb脚本

  • 上移下移
img

运行

引入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
img

脚本

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()
posted @ 2021-11-19 11:21  FynnWang  阅读(207)  评论(0编辑  收藏  举报