相关文章推荐
爽快的炒粉  ·  使用Python和LSTM模型实现商品销量时 ...·  3 月前    · 
性感的镜子  ·  基于ARIMA、SVM、随机森林销售的时间序 ...·  3 月前    · 
玉树临风的野马  ·  Python时间序列分析全面指南(附代码)开 ...·  3 月前    · 
焦虑的白开水  ·  什么是 ARIMA 模型?| IBM·  3 月前    · 
文雅的炒饭  ·  Power BI Desktop ...·  2 年前    · 
胆小的小蝌蚪  ·  Android系统主题总结和使用_tuke_ ...·  2 年前    · 
留胡子的柠檬  ·  Oracle ORA-00904:标识符无效 ...·  2 年前    · 
博学的豌豆  ·  ORA-00933:SQL ...·  2 年前    · 
腹黑的篮球  ·  Ansible ...·  2 年前    · 
Code  ›  时间序列预测(一)基于Prophet的销售额预测开发者社区
时间序列
https://cloud.tencent.com/developer/article/2291494
俊秀的路灯
2 年前
作者头像
HsuHeinrich
0 篇文章

时间序列预测(一)基于Prophet的销售额预测

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > HsuHeinrich > 时间序列预测(一)基于Prophet的销售额预测

时间序列预测(一)基于Prophet的销售额预测

作者头像
HsuHeinrich
发布 于 2023-05-25 17:06:50
179 0
发布 于 2023-05-25 17:06:50
举报

时间序列预测(一)基于Prophet的销售额预测

小O:小H,有没有什么方法能快速的预测下未来的销售额啊 小H:Facebook曾经开源了一款时间序列预测算法 fbprophet ,简单又快速~

传统的时间序列算法很多,例如AR、MA、ARIMA等,对于非专业人员来说显得很难上手。而Prophet相对来说就友好多了,而且预测效果又很不错,所以用它来预测时间序列数据再适合不过了。本文主要参考 基于facebook的时间序列预测框架prophet的实战应用[1] 。

Prophet的安装需要先安装pystan

conda install pystan # 终端上安装,需要执行procced选择y
pip install fbprophet

数据探索

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
from fbprophet import Prophet
from sklearn.metrics import mean_squared_error
from math import sqrt
import datetime
from xgboost import XGBRegressor
from sklearn.metrics import explained_variance_score, mean_absolute_error, \
mean_squared_error, r2_score  # 批量导入指标算法
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM
from tensorflow.keras.layers import Dense, Dropout
from sklearn.preprocessing import MinMaxScaler
from keras.wrappers.scikit_learn import KerasRegressor
from sklearn.model_selection import GridSearchCV
# 读取数据
raw_data = pd.read_csv('train.csv')
raw_data.head()

image-20230206153328512

# 转化为日期
raw_data['datetime'] = raw_data['datetime'].apply(pd.to_datetime)
# 查看历史销售趋势
plt.figure(figsize = (15,8))
sns.lineplot(x = 'datetime', y = 'count', data = raw_data, err_style=None)
plt.show()

output_10_0

特征工程

# 构造prophet需要的ds/y数据
df_model = raw_data[['datetime', 'count']].rename(columns = {'datetime': 'ds','count': 'y'})

模型拟合

# 模型拟合
model_fb = Prophet(interval_width = 0.95).fit(df_model)
# 构造预测日期
future_dates = model_fb.make_future_dataframe(periods = 100, freq='H')
# 预测结果
forecast = model_fb.predict(future_dates)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
# 预测最后几周的日期
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()

image-20230206153349362

结果展示

# 观察预测效果
model_fb.plot(forecast);

output_16_0

# 观察趋势因素
model_fb.plot_components(forecast);

output_17_0

# 模型评估 MSE
metric_df = forecast.set_index('ds')[['yhat']].join(df_model.set_index('ds').y).reset_index()
metric_df.dropna(inplace=True)
error = mean_squared_error(metric_df.y, metric_df.yhat)
print('The MSE is {}'. format(error))
The MSE is 12492.842870220222

添加假期因素

# 定义假期因素
def is_school_holiday_season(ds):    
    date = pd.to_datetime(ds)
    starts = datetime.date(date.year, 7, 1)
    ends = datetime.date(date.year, 9, 9)
    return starts < date.to_pydatetime().date() < ends
df_model['school_holiday_season'] = df_model['ds'].apply(is_school_holiday_season)
df_model['not_school_holiday_season'] = ~df_model['ds'].apply(is_school_holiday_season)
model_fb = Prophet(interval_width=0.95)
# 添加假期因素
model_fb.add_seasonality(name='school_holiday_season', period=365, fourier_order=3, condition_name='school_holiday_season')
model_fb.add_seasonality(name='not_school_holiday_season', period=365, fourier_order=3, condition_name='not_school_holiday_season')
model_fb.fit(df_model)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
<fbprophet.forecaster.Prophet at 0x7ff4e48833d0>
# 构造日期
future_dates = model_fb.make_future_dataframe(periods=100, freq='H')
future_dates['school_holiday_season'] = future_dates['ds'].apply(is_school_holiday_season)
future_dates['not_school_holiday_season'] = ~future_dates['ds'].apply(is_school_holiday_season)
# 预测
forecast = model_fb.predict(future_dates)
plt.figure(figsize=(10, 5))
model_fb.plot(forecast);
<Figure size 720x360 with 0 Axes>

output_24_1

# 观察趋势因素
model_fb.plot_components(forecast);

output_25_0

# 模型评估 MSE
 
推荐文章
爽快的炒粉  ·  使用Python和LSTM模型实现商品销量时间序列预测-开发者社区-阿里云
3 月前
性感的镜子  ·  基于ARIMA、SVM、随机森林销售的时间序列预测|附代码数据开发者社区
3 月前
玉树临风的野马  ·  Python时间序列分析全面指南(附代码)开发者社区
3 月前
焦虑的白开水  ·  什么是 ARIMA 模型?| IBM
3 月前
文雅的炒饭  ·  Power BI Desktop 中的自動日期/時間 - Power BI | Microsoft Learn
2 年前
胆小的小蝌蚪  ·  Android系统主题总结和使用_tuke_tuke的博客-CSDN博客
2 年前
留胡子的柠檬  ·  Oracle ORA-00904:标识符无效解决方法(太坑了!!)_oracle_脚本之家
2 年前
博学的豌豆  ·  ORA-00933:SQL 命令未正确结束(1)_ora-009933_小志的博客的博客-CSDN博客
2 年前
腹黑的篮球  ·  Ansible 详解(三):Playbooks - 知乎
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号