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

简介: 本文提供了第十一届泰迪杯数据挖掘挑战赛B题问题二的详细解题步骤,包括时间序列预测模型的建立、多元输入时间预测问题的分析、时间序列预测的建模步骤、改进模型的方法,以及使用Python进行SARIMA模型拟合和预测的具体实现过程。

请添加图片描述

相关链接

【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, timedelta

train_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_diff

train_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_mean
    predict_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, timedelta

train_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_mean
    predict_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)
目录
相关文章
|
1天前
|
设计模式 缓存 开发者
Python中的装饰器:简化代码,提高可读性
【9月更文挑战第10天】在Python编程的世界中,装饰器是一种强大的工具,它允许开发者在不修改原函数代码的情况下增加额外的功能。本文将通过简单易懂的语言和生动的例子,带你了解装饰器的概念、使用方法及其在实际开发中的应用价值。我们将一起探索如何利用装饰器来简化代码结构,提升代码的可读性和可维护性,让你的编程之旅更加顺畅。
|
2天前
|
开发者 Python
Python中的装饰器:简化你的代码
【9月更文挑战第9天】本文将介绍Python中的一种强大工具——装饰器。我们将从基础概念开始,逐步深入到装饰器的实际应用,包括函数装饰器和类装饰器。我们将通过实例来展示如何利用装饰器简化代码,提高代码的可读性和可维护性。最后,我们将探讨装饰器的一些高级用法,以及如何避免在使用时可能遇到的问题。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更好地理解和使用装饰器。
12 6
|
3天前
|
Python
揭秘!Python系统编程里那些让代码自由穿梭的神奇代码行
【9月更文挑战第9天】在Python的世界里,一些简洁的代码行却蕴含着强大的功能,如列表推导式让列表生成仅需一行代码:`squares = [x**2 for x in range(10)]`。`with`语句则能自动管理文件和网络连接的关闭,如`with open(&#39;example.txt&#39;, &#39;r&#39;) as file:`。`lambda`函数和装饰器则允许快速定义函数和增强功能,而上下文管理器更是资源处理的利器。这些特性让Python代码更加优雅高效。
12 4
|
5天前
|
缓存 测试技术 开发者
探索Python中的装饰器:简化你的代码之旅
【9月更文挑战第6天】本文将深入探讨Python中一个强大而神秘的特性——装饰器。我们将通过实际例子揭示装饰器的工作原理,并展示如何利用它们来简化和增强你的代码。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇门,让你的代码更加优雅和高效。
|
2天前
|
安全 数据安全/隐私保护 Python
Python系统编程实战:文件系统操作与I/O管理,让你的代码更优雅
【9月更文挑战第10天】Python不仅在数据分析和Web开发中表现出色,在系统编程领域也展现出独特魅力。本文将带你深入探讨Python中的文件系统操作与I/O管理,涵盖os、shutil和pathlib等模块的基础使用方法,并通过示例代码展示如何优雅地实现这些功能。通过掌握缓冲、异步I/O等高级特性,你将能够编写更高效、安全且易于维护的Python代码。示例包括使用pathlib遍历目录、设置缓冲区提升文件写入性能以及使用aiofiles实现异步文件操作。掌握这些技能,让你在Python系统编程中更加得心应手。
10 2
|
2天前
|
Linux 开发者 Python
从Windows到Linux,Python系统调用如何让代码飞翔🚀
【9月更文挑战第10天】在编程领域,跨越不同操作系统的障碍是常见挑战。Python凭借其“编写一次,到处运行”的理念,显著简化了这一过程。通过os、subprocess、shutil等标准库模块,Python提供了统一的接口,自动处理底层差异,使代码在Windows和Linux上无缝运行。例如,`open`函数在不同系统中以相同方式操作文件,而`subprocess`模块则能一致地执行系统命令。此外,第三方库如psutil进一步增强了跨平台能力,使开发者能够轻松编写高效且易维护的代码。借助Python的强大系统调用功能,跨平台编程变得简单高效。
9 0
|
5天前
|
机器学习/深度学习 人工智能 算法
探索人工智能:机器学习的基本原理与Python代码实践
【9月更文挑战第6天】本文深入探讨了人工智能领域中的机器学习技术,旨在通过简明的语言和实际的编码示例,为初学者提供一条清晰的学习路径。文章不仅阐述了机器学习的基本概念、主要算法及其应用场景,还通过Python语言展示了如何实现一个简单的线性回归模型。此外,本文还讨论了机器学习面临的挑战和未来发展趋势,以期激发读者对这一前沿技术的兴趣和思考。
|
30天前
|
数据采集 数据可视化 数据挖掘
数据分析大神养成记:Python+Pandas+Matplotlib助你飞跃!
在数字化时代,数据分析至关重要,而Python凭借其强大的数据处理能力和丰富的库支持,已成为该领域的首选工具。Python作为基石,提供简洁语法和全面功能,适用于从数据预处理到高级分析的各种任务。Pandas库则像是神兵利器,其DataFrame结构让表格型数据的处理变得简单高效,支持数据的增删改查及复杂变换。配合Matplotlib这一数据可视化的魔法棒,能以直观图表展现数据分析结果。掌握这三大神器,你也能成为数据分析领域的高手!
42 2
|
1月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
|
1月前
|
机器学习/深度学习 算法 数据挖掘
2023 年第二届钉钉杯大学生大数据挑战赛初赛 初赛 A:智能手机用户监测数据分析 问题二分类与回归问题Python代码分析
本文介绍了2023年第二届钉钉杯大学生大数据挑战赛初赛A题的Python代码分析,涉及智能手机用户监测数据分析中的聚类分析和APP使用情况的分类与回归问题。
46 0
2023 年第二届钉钉杯大学生大数据挑战赛初赛 初赛 A:智能手机用户监测数据分析 问题二分类与回归问题Python代码分析