相关链接

【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题一
【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题二

1 题目

完整题目参考问题一的文章
基于问题一的分析,建立数学模型,对附件预测数据(predict_sku1.csv)中给出的产品,预测未来 3 月(即 2019 年 1 月、2 月、3 月)的月需求量,将预测结果按照表 3 的格式保存为文件 result1.xlsx,与论文一起提交。请分别按天、周、月的时间粒度进行预测,试分析不同的预测粒度对预测精度会产生什么样的影响。

2 问题二解析

2.1 问题分析

这是一个时间预测模型,常用的时间序列预测模型包括:

  • 自回归移动平均模型(ARMA)
  • 自回归积分移动平均模型(ARIMA)
  • 季节性自回归积分移动平均模型(SARIMA)
  • 自回归条件异方差模型(ARCH)
  • 长短期记忆模型(LSTM)

在此任务中,是一个多输入的时间预测问题,在时间序列预测模型中,采用多个输入的模型主要包括以下几种:

  1. ARIMAX模型:在ARIMA模型的基础上,增加外生变量作为模型的输入,以考虑外部因素对时间序列的影响。
  2. VAR模型:矢量自回归模型(Vector Autoregression Model,VAR)是一种多元时间序列模型,能够考虑多个时间序列之间的相互影响关系。
  3. LSTM模型:长短期记忆网络(Long Short-Term Memory,LSTM)是一种循环神经网络,能够对时间序列的长期依赖性进行建模,同时也支持多个输入的模型。
  4. Prophet模型:由Facebook开发的预测模型,采用加性模型,并且可以考虑多个外生变量,具有较好的可解释性。
  5. SARIMAX模型:季节性自回归移动平均模型(Seasonal ARIMA with External Regressors,SARIMAX)是ARIMAX模型的扩展,能够考虑季节性变化,并且也支持多个外生变量的输入。

这些模型可以通过引入多个外部变量来提高时间序列预测的准确性和可解释性,但也需要注意过拟合和变量选择的问题。在具体应用中,需要根据数据特点和预测目标选择合适的模型。

2.2 时间序列预测问题的建模步骤

  1. 数据清洗和处理:对历史数据进行清洗和处理,包括去除异常值、缺失值处理等。此外,还需要将数据按照时间序列的方式进行排序。
  2. 时间序列分解:将时间序列数据分解为趋势、季节和随机成分。这可以通过拟合加法模型或乘法模型来实现。其中加法模型假定季节成分与趋势成分之和等于原始数据,而乘法模型假定季节成分与趋势成分的乘积等于原始数据。
  3. 模型选择和拟合:选择合适的时间序列模型对趋势、季节和随机成分进行拟合。一般常用的模型包括ARIMA模型、指数平滑模型等。
  4. 模型诊断:对拟合好的模型进行诊断,检验其残差是否符合正态分布、是否存在自相关性等。
  5. 模型预测:使用已经拟合好的模型进行未来需求量的预测,并计算预测精度。

在此任务中,首先,读取训练集和预测集数据,并将训练集中的日期列转换为日期类型,并将其设置为数据集的索引。接着,将数据按照一定的维度进行分组,并将每个组的时间序列进行了平稳性检验,若不平稳则进行一阶或者多阶差分,直到序列平稳。然后,使用 SARIMA 模型对每个分组的差分序列进行拟合,并预测未来三个月的需求量。在预测过程中,针对每个预测样本,根据其销售区域、产品、大类和细类,生成外部变量,用于对模型进行外部扰动。最后,将预测结果保存到 Excel 文件中。

2.3 改进的角度

有许多方法可以改进时间序列预测模型,下面列出了几种常见的方法:

  1. 调整模型参数:可以通过调整模型的参数来改善模型的性能。例如,对于ARIMA模型,可以调整p、d、q参数,对于LSTM模型,可以调整神经元数量、学习率、迭代次数等参数。需要注意的是,参数调整需要进行交叉验证等方法来评估模型的性能和泛化能力。
  2. 增加特征:通过增加更多的特征来提高模型的预测准确度。除了历史数据特征和时间特征之外,还可以考虑其他相关特征,例如,天气数据、经济数据等,可以对时间序列的预测结果产生影响。
  3. 数据增强:通过增加更多的历史数据来提高模型的预测准确度。可以通过扩展历史数据范围或增加数据精度等方式来增加历史数据。
  4. 模型融合:将多个模型的预测结果进行加权平均或堆叠等方式来提高模型的预测准确度。模型融合可以通过多个模型的优点互补来提高整体的预测效果。
  5. 使用集成学习:集成学习是一种通过将多个基本模型进行组合来提高整体预测效果的方法。例如,可以通过Bagging、Boosting等方式将多个决策树、LSTM等基本模型进行组合。
  6. 调整训练数据:可以通过对训练数据进行平滑处理、滑动窗口等方式来提高模型的预测准确度。例如,可以通过移动平均、指数平滑等方式对训练数据进行平滑处理。

需要注意的是,模型改进需要进行交叉验证等方法来评估模型的性能和泛化能力,以避免模型过拟合或欠拟合的情况。

3 python实现

由于目前未提供完整数据,在运行以下代码时,会报错:ValueError: sample size is too short to use selected regression component,是因为此时数据集中的某个区域下的产品样本太少,不足以构成时间序列,所以不能差分。

3.1 以月为时间粒度

对以下代码进行注释,并说明思路:
import pandas as pd
import statsmodels.api as sm
from datetime import datetime, timedeltatrain_data = pd.read_csv('data/order_train0.csv')
predict_data = pd.read_csv('data/predict_sku0.csv')train_data['order_date'] = pd.to_datetime(train_data['order_date'])
train_data = train_data.set_index('order_date')。。。略,请下载完整代码def make_stationary(ts):# 一阶差分ts_diff = ts.diff().dropna()# 进一步差分,直到平稳while not sm.tsa.stattools.adfuller(ts_diff)[1] < 0.05:ts_diff = ts_diff.diff().dropna()return ts_difftrain_ts_diff = train_ts.groupby(['sales_region_code', 'item_code', 'first_cate_code', 'second_cate_code']).apply(make_stationary)order = (1, 1, 1)
seasonal_order = (1, 0, 1, 12)model = sm.tsa.statespace.SARIMAX(train_ts_diff, order=order, seasonal_order=seasonal_order, enforce_stationarity=False, enforce_invertibility=False)
result = model.fit()# 预测未来三个月的数据start_date = datetime(2019, 1, 1)
end_date = datetime(2019, 3, 31)
predict_dates = pd.date_range(start=start_date, end=end_date, freq='M')# 预测每个销售区域、产品、大类和细类的需求量predict = pd.DataFrame()
for i in range(len(predict_data)):# 生成外部变量predict_exog = pd.DataFrame(predict_data.iloc[i, :]).T.set_index(['sales_region_code', 'item_code', 'first_cate_code', 'second_cate_code'])predict_exog.index = pd.MultiIndex.from_tuples(predict_exog.index)predict_exog = predict_exog.reindex(index=train_ts_diff.index.union(predict_exog.index), fill_value=0).sort_index()predict_exog = predict_exog.loc[predict_dates]# 预测未来三个月的需求量predict_diff = result.get_forecast(steps=len(predict_dates), exog=predict_exog, dynamic=True)# 将预测出的差分值加上训练集最后一月的差分值predict_diff_predicted = predict_diff.predicted_meanpredict_diff_predicted = predict_diff_predicted + train_ts_diff.iloc[-1]# 将差分值转换为预测值predict_predicted = predict_diff_predicted.cumsum() + train_ts.iloc[-1]# 将预测结果保存到DataFrame中predict_temp = pd.DataFrame({'sales_region_code': [predict_data.iloc[i, 0]], 'item_code': [predict_data.iloc[i, 1]],'2019年1月预测需求量': predict_predicted.loc['2019-01-01':'2019-01-31'].sum(),'2019年2月预测需求量': predict_predicted.loc['2019-02-01':'2019-02-28'].sum(),'2019年3月预测需求量': predict_predicted.loc['2019-03-01':'2019-03-31'].sum()})predict = pd.concat([predict, predict_temp], ignore_index=True)# 将预测结果保存到Excel文件中
predict.to_excel('result1.xlsx', index=False)

3.2 以天为时间粒度

import pandas as pd
import statsmodels.api as sm
from datetime import datetime, timedeltatrain_data = pd.read_csv('data/order_train0.csv')
predict_data = pd.read_csv('data/predict_sku0.csv')
train_data['order_date'] = pd.to_datetime(train_data['order_date'])
train_data = train_data.set_index('order_date')
train_ts = train_data.groupby(['sales_region_code', 'item_code', 'first_cate_code', 'second_cate_code'])['ord_qty'].resample('D').sum()def make_stationary(ts):# 一阶差分ts_diff = ts.diff().dropna()# 进一步差分,直到平稳while not sm.tsa.stattools.adfuller(ts_diff)[1] < 0.05:ts_diff = ts_diff.diff().dropna()return ts_diff。。。略,请下载完整代码
order = (1, 1, 1)
seasonal_order = (1, 0, 1, 12)model = sm.tsa.statespace.SARIMAX(train_ts_diff, order=order, seasonal_order=seasonal_order, enforce_stationarity=False, enforce_invertibility=False)
result = model.fit()# 预测未来三个月的数据
start_date = datetime(2019, 1, 1)
end_date = datetime(2019, 3, 31)
predict_dates = pd.date_range(start=start_date, end=end_date, freq='D')# 预测每个销售区域、产品、大类和细类的需求量
predict = pd.DataFrame()
for i in range(len(predict_data)):# 生成外部变量predict_exog = pd.DataFrame(predict_data.iloc[i, :]).T.set_index(['sales_region_code', 'item_code', 'first_cate_code', 'second_cate_code'])predict_exog.index = pd.MultiIndex.from_tuples(predict_exog.index)predict_exog = predict_exog.reindex(index=train_ts_diff.index.union(predict_exog.index), fill_value=0).sort_index()predict_exog = predict_exog.loc[predict_dates]# 预测未来三个月的需求量predict_diff = result.get_forecast(steps=len(predict_dates), exog=predict_exog, dynamic=True)# 将预测出的差分值加上训练集最后一天的差分值predict_diff_predicted = predict_diff.predicted_meanpredict_diff_predicted = predict_diff_predicted + train_ts_diff.iloc[-1]# 将差分值转换为预测值predict_predicted = predict_diff_predicted.cumsum() + train_ts.iloc[-1]# 将预测结果保存到DataFrame中predict_temp = pd.DataFrame({'sales_region_code': [predict_data.iloc[i, 0]], 'item_code': [predict_data.iloc[i, 1]],'first_cate_code': [predict_data.iloc[i, 2]], 'second_cate_code': [predict_data.iloc[i, 3]],'2019年1月预测需求量': predict_predicted.loc['2019-01-01':'2019-01-31'].sum(),'2019年2月预测需求量': predict_predicted.loc['2019-02-01':'2019-02-28'].sum(),'2019年3月预测需求量': predict_predicted.loc['2019-03-01':'2019-03-31'].sum()})predict = pd.concat([predict, predict_temp], ignore_index=True)# 将预测结果保存到Excel文件中
predict.to_excel('result1.xlsx', index=False)

【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题二相关推荐

  1. 【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 23页论文及实现代码

    [2023年第十一届泰迪杯数据挖掘挑战赛]B题:产品订单的数据分析与需求预测 23页论文及实现代码 相关链接 (1)建模方案 [2023年第十一届泰迪杯数据挖掘挑战赛]B题:产品订单的数据分析与需求预 ...

  2. 2023年泰迪杯数据挖掘挑战赛B题--产品订单数据分析与需求预测(1.数据处理)

    1. 前言 本题相对来说比较适合新手,包括针对数据的预处理,数据分析,特征提取以及模型训练等多个步骤,完整的做下来是可以学到很多东西的. 2.问题一思路分析 本题要求利用附件中的训练数据进行深入的分析 ...

  3. 2023年泰迪杯数据挖掘挑战赛B题--产品订单数据分析与需求预测(2.数据探索性分析)

    前言 继续上一片数据预处理进行续写,利用预处理之后的数据进行数据分析并且解决问题一相关的问题.问题一主要目的是让研究各种因素对于需求量的影响,然后找到确定影响需求量的主要因素并且进行数据分析和主要特征 ...

  4. 【2023年第十一届泰迪杯数据挖掘挑战赛】A题:新冠疫情防控数据的分析 32页和40页论文及实现代码

    [2023年第十一届泰迪杯数据挖掘挑战赛]A题:新冠疫情防控数据的分析 32页和40页论文及实现代码 相关链接 (1)建模方案 [2023年第十一届泰迪杯数据挖掘挑战赛]A题:新冠疫情防控数据的分析 ...

  5. 【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题一

    相关链接 [2023年第十一届泰迪杯数据挖掘挑战赛]B题:产品订单的数据分析与需求预测 建模及python代码详解 问题一 [2023年第十一届泰迪杯数据挖掘挑战赛]B题:产品订单的数据分析与需求预测 ...

  6. 【2023年第十一届泰迪杯数据挖掘挑战赛】C题:泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题一

    相关链接 [2023年第十一届泰迪杯数据挖掘挑战赛]C题泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题一 [2023年第十一届泰迪杯数据挖掘挑战赛]C题泰迪内推平台招聘与求职 ...

  7. 【2023年第十一届泰迪杯数据挖掘挑战赛】A题:新冠疫情防控数据的分析 建模方案及python代码详解

    更新时间:2023-3-30 1 题目 一.背景 自2019年底至今,全国各地陆续出现不同程度的新冠病毒感染疫情,如何控制疫情蔓 延.维持社会生活及经济秩序的正常运行是疫情防控的重要课题.大数据分析为 ...

  8. 【第十一届“泰迪杯”数据挖掘挑战赛】泰迪杯c题爬虫采集数据(源码+数据)

    ["第十一届"泰迪杯"数据挖掘挑战赛-- C 题:泰迪内推平台招聘与求职双向推荐系统构建(采集数据)] 问题: 数据详情: 根据工作id获取详细数据(1571条).csv ...

  9. 第十一届“泰迪杯”数据挖掘挑战赛携“十万”大奖火热来袭

    第十一届"泰迪杯"数据挖掘挑战赛 竞赛组织 主办单位: 泰迪杯数据挖掘挑战赛组织委员会 承办单位: 广东泰迪智能科技股份有限公司 人民邮电出版社 协办单位: 重庆市工业与应用数学学 ...

最新文章

  1. Linux操作系统上lsof命令详解
  2. 理解和配置 Linux 下的 OOM Killer
  3. 大学python用什么教材-python大学里用哪本教材比较好?
  4. JVM必备指南(转)
  5. 练习11.1 奥运五环色 7-1 藏头诗
  6. php yii2 finfo file,FileHelper:文件系统助手
  7. RMAN-06026报错解决方法
  8. python 单例模式的实现方法_python中单例模式的四种实现方式
  9. .NET6发布了Preview2,这点超越过去10年!
  10. HttpStatusCode
  11. MySQL在like查询中是否使用到索引
  12. NGUI字体贴图压缩以及相关Shader解读
  13. sql删除主键_产品经理的第一节SQL课——ID到底是干什么的?!
  14. 基于python的分布式扫描器_一种基于python的大数据分布式任务处理装置的制作方法...
  15. USTC 1119 graph 图的同构
  16. Android基站定位——单基站定位(二)
  17. 51nod 1099 任务执行顺序
  18. vscode解决方案 关闭源代码管理
  19. 计网-基于Cisco模拟器
  20. 苹果手机人脸识别不了是什么原因_苹果:iPhone人脸识别能秒了所有安卓手机!...

热门文章

  1. 首发【python写的一键共享打印机】
  2. Android如何获取第三方app的控件id
  3. STM32 keil下载程序后不自动运行程序,必须复位(或重新上电)一下才可以运行
  4. 智能家居项目(六)之摄像头模块
  5. red5 html5,RHEL5 流媒体服务器的搭建--Red5
  6. Java常见异常种类及产生原因
  7. 前端JS调用Android相机相册问题解决
  8. matplotlib 修改字体,解决中文显示乱码的问题
  9. 阿里云网盘与相册服务企业版介绍
  10. MATLAB中aVec是干啥的,实验一 MATLAB基本操作及运算(含实验报告)