2023年第四届MathorCup大数据挑战赛(B题)|电商零售商家需求预测及库存优化问题|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2021年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。

希望这些想法对大家的做题有一定的启发和借鉴意义。
让我们来看看MathorCup的B题!
在这里插入图片描述

问题重述

这是一个电商零售商家需求预测及库存优化问题的描述。这个问题涉及到电商平台上的上千个商家,它们将商品放在不同的仓库中,而电商平台需要进行供应链管理,以降低库存成本并保证按时交货。主要问题包括需求预测和库存优化。

问题一:使用历史出货量数据(附件1)和相关附件中的信息,需要预测各商家在各仓库的商品在2023年5月16日至2023年5月30日的需求量。预测的结果需要填写在结果表1,并上传至竞赛平台。同时,需要对模型的预测性能进行评价,并讨论如何对这些时间序列进行分类以找到相似特征。

问题二:有一些新的商家+仓库+商品维度出现(附件5),需要根据历史数据(附件1)找到相似序列并预测这些新维度在2023年5月16日至2023年5月30日的需求量。预测结果需要填写在结果表2,并上传至竞赛平台。

问题三:每年6月有大型促销,给需求预测和履约带来挑战。附件6提供了去年双十一期间的需求量数据,需要参考这些数据并给出2023年6月1日至2023年6月20日的需求量预测值,填写在结果表3中并上传至竞赛平台。

问题一

问题一涉及对各商家在各仓库的商品需求进行预测,此题我们使用ARIMA模型来进行预测。

步骤1:数据预处理
首先,对历史出货量数据进行预处理,包括数据清洗、缺失值处理等,以确保数据的质量和一致性。对附件2-4的信息也进行必要的数据关联,以便使用商品、商家和仓库的特征信息。

步骤2:时间序列分类
根据问题描述,需要对不同商家、仓库和商品的时间序列进行分类,以找到相似的特征。这可以通过以下步骤来实现:

a. 对每个商家在各仓库的商品需求量序列进行聚类分析,例如使用K均值聚类。

b. 对聚类后的序列进行统计特征提取,如平均值、标准差、季节性等。

c. 基于提取的特征,使用聚类结果将序列分为不同的类别。

步骤3:需求预测

对于每个时间序列类别,使用ARIMA模型进行需求预测。

步骤4:模型评价
评估模型的性能可以使用各种指标,如1-wmape,MAE,RMSE等。1-wmape在问题描述中已经给出,可以计算每个序列的预测误差并汇总为模型整体性能。

ARIMA模型

  • ARIMA(AutoRegressive Integrated Moving Average)模型是一种经典的时间序列分析方法,用于对时间序列数据进行建模和预测。它结合了自回归(AR)、差分(I)和滑动平均(MA)三个组成部分,用于处理具有趋势和季节性的时间序列数据。ARIMA模型旨在捕捉数据中的自相关性和移动平均性,从而生成未来时间点的预测。

下面是ARIMA模型的核心概念:

  1. 自回归(AR)部分:ARIMA模型中的"AR"代表"自回归"。这部分考虑了时间序列中的自相关性,即过去时间点的观测值对当前时间点的影响。AR部分表示为p,它表示在模型中考虑多少期的过去观测值。例如,ARIMA(p, d, q)中的p。

  2. 差分(I)部分:ARIMA模型中的"I"代表"差分"。这部分用于处理非稳定的时间序列,即具有趋势和季节性的序列。通过差分,可以将非稳定序列转化为稳定的序列。d表示差分的次数。例如,ARIMA(p, d, q)中的d。

  3. 滑动平均(MA)部分:ARIMA模型中的"MA"代表"滑动平均"。这部分考虑了时间序列中的滑动平均性,即过去时间点的预测误差对当前时间点的影响。MA部分表示为q,它表示在模型中考虑多少期的滑动平均误差。例如,ARIMA(p, d, q)中的q。

ARIMA模型的建模步骤通常包括以下几个关键步骤:

  1. 观察时间序列数据:首先,分析时间序列数据,检查是否存在趋势、季节性以及自相关性。

  2. 差分操作:如果时间序列数据不是稳定的,需要进行差分操作,直到数据变得稳定。差分的次数由参数d决定。

  3. 模型识别:通过观察自相关函数(ACF)和偏自相关函数(PACF)的图表,确定ARIMA模型的阶数(p、d、q)。

  4. 拟合ARIMA模型:使用选定的参数,拟合ARIMA模型到时间序列数据。

  5. 模型诊断:检查模型的残差,确保其是白噪声,没有自相关性。

  6. 预测:使用拟合好的ARIMA模型生成未来时间点的预测。

在问题一中,使用ARIMA模型的主要原因是针对历史出货量数据进行需求预测。原因在于:

  1. 存在趋势和季节性:ARIMA模型适用于具有趋势和季节性的时间序列数据,这在电商领域通常是普遍存在的情况。历史出货量数据往往受季节性促销、市场趋势等因素的影响,因此需要模型来捕捉这些影响。

  2. 稳定性处理:ARIMA模型中的"差分"(I)部分用于将非稳定的时间序列数据转化为稳定的序列。这对于处理数据中的趋势和季节性非常重要,以便模型能够准确预测未来需求。

  3. 自相关性和滑动平均性:ARIMA模型的"自回归"(AR)和"滑动平均"(MA)部分分别考虑了时间序列数据中的自相关性和滑动平均性,从而更好地捕捉数据的内在模式。

  4. 参数调整:ARIMA模型的参数(p、d、q)可以根据时间序列数据的特点进行调整,以获得更准确的预测。这使得ARIMA模型非常灵活,适应不同类型的时间序列。

因为它可以帮助预测各商家在各仓库的商品需求,考虑了历史趋势、季节性和自相关性,有助于更好地管理库存和满足客户需求。此外,ARIMA模型的参数可以根据不同商家、仓库和商品的需求模式进行调整,从而提高预测的准确性。
代码如下:

import pandas as pd
import numpy as np
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller# 读取历史出货量数据
historical_data = pd.read_csv('附件1.csv')
# 假设历史数据按日期升序排列
historical_data['date'] = pd.to_datetime(historical_data['date'])# 定义检测时间序列稳定性的函数
def test_stationarity(timeseries):# 进行滚动统计检验(Rolling Statistics)rolmean = timeseries.rolling(window=30).mean()  # 选择合适的窗口大小rolstd = timeseries.rolling(window=30).std()# 绘制滚动统计检验结果orig = plt.plot(timeseries, color='blue', label='原始数据')mean = plt.plot(rolmean, color='red', label='滚动均值')std = plt.plot(rolstd, color='black', label='滚动标准差')plt.legend(loc='best')plt.title('滚动均值和滚动标准差')plt.show()# 进行Dicky-Fuller检验print('Dicky-Fuller检验结果:')dftest = adfuller(timeseries, autolag='AIC')dfoutput = pd.Series(dftest[0:4], index=['Test Statistic', 'p-value', '#Lags Used', 'Number of Observations Used'])for key, value in dftest[4].items():dfoutput['Critical Value (%s)' % key] = valueprint(dfoutput)# 做时间序列稳定性检验
test_stationarity(historical_data['qty'])# 进行时间序列差分以达到稳定性
# 通常需要多次差分,直到时间序列变得稳定
differenced_data = historical_data['qty'].diff().dropna()# 再次进行稳定性检验
test_stationarity(differenced_data)# 使用ARIMA模型进行预测
model = sm.tsa.ARIMA(historical_data['qty'], order=(1, 1, 1))  # 选择合适的ARIMA参数
results = model.fit()# 输出模型的统计摘要
print(results.summary())

问题二

问题二要求针对新出现的商家+仓库+商品维度进行需求预测,这些维度在历史数据中没有出现过。建模思路可以分为以下几个步骤:

步骤1:数据准备

  • 首先,需要识别出历史数据中不存在的商家+仓库+商品维度。这些新维度可能代表新上市的商品或改变了商品存放的仓库。

步骤2:相似序列查找

  • 针对每个新出现的商家+仓库+商品维度,需要查找历史数据中与之相似的时间序列。相似性可以通过多种方式来衡量,如时间序列模式、统计特征等。以下是一种计算相似性的思路:

    a. 对于每个新维度,计算其与历史数据中所有商家+仓库+商品维度的相似性分数。这可以使用各种距离度量方法(如欧氏距离、相关系数等)来计算。

    b. 选择与新维度相似性得分最高的一组历史时间序列。这组历史序列将被用作预测新维度的参考。

步骤3:需求预测

  • 使用选定的相似历史序列,可以应用相同的需求预测模型(例如,ARIMA、加权移动平均或其他时间序列模型)来预测新维度的需求。预测的时间段为2023-05-16至2023-05-30。

步骤4:结果记录

  • 将预测结果填写在结果表2中,并上传至竞赛平台。

公式表示:

  1. 相似性计算(可以使用欧氏距离作为相似性度量的一个示例):

    欧氏距离公式:

Distance ( X , Y ) = ∑ i = 1 n ( X i − Y i ) 2 \text{Distance}(X, Y) = \sqrt{\sum_{i=1}^{n} (X_i - Y_i)^2} Distance(X,Y)=i=1n(XiYi)2

其中,X 和 Y是两个时间序列, X i X_i Xi Y i Y_i Yi分别是它们的对应时间点的值,(n) 是时间序列长度。

  1. 需求预测

    对于新维度,使用选定的相似历史序列中的模型(如ARIMA)进行需求预测。

这个建模思路允许你根据历史数据中的相似性来预测新维度的需求,而不需要依赖完全没有历史数据的新维度。因此,你可以根据相似性找到最合适的历史数据,并基于这些历史数据来进行需求预测。

其中,(X) 和 (Y) 是两个时间序列, X i X_i Xi Y i Y_i Yi分别是它们的对应时间点的值,(n) 是时间序列长度。

  1. 需求预测

    对于新维度,使用选定的相似历史序列中的模型(如ARIMA)进行需求预测。
    Demand Forecast ( X ) = Model ( X similar ) \text{Demand Forecast}(X) = \text{Model}(X_{\text{similar}}) Demand Forecast(X)=Model(Xsimilar)
    代码:

import pandas as pd
import numpy as np
from scipy.spatial.distance import euclidean
from statsmodels.tsa.arima_model import ARIMA# 读取历史数据、新维度数据
historical_data = pd.read_csv('附件1.csv')
new_dimension_data = pd.read_csv('附件5.csv')# 存储新维度的预测结果
result_table_2 = pd.DataFrame(columns=['seller_no', 'warehouse_no', 'product_no', 'date', 'predicted_demand'])# 针对每个新维度进行需求预测
for index, new_dimension_row in new_dimension_data.iterrows():# 获取新维度的商家、仓库、商品信息seller = new_dimension_row['seller_no']warehouse = new_dimension_row['warehouse_no']product = new_dimension_row['product_no']# 查找与新维度相似的历史数据,使用欧氏距离进行相似性计算historical_data['similarity'] = historical_data.apply(lambda row: euclidean([row['seller_no'], row['warehouse_no'], row['product_no']],[seller, warehouse, product]),axis=1)# 选择相似性得分最高的历史序列most_similar_row = historical_data.loc[historical_data['similarity'].idxmin()]# 获取历史相似序列的需求历史数据historical_demand = most_similar_row['qty'].values# 使用ARIMA模型进行需求预测# 这里需要根据你的数据和需求进一步调整ARIMA模型的参数arima_model = ARIMA(historical_demand, order=(5,1,0))  # 举例使用ARIMA(5,1,0)arima_fit = arima_model.fit(disp=0)# 预测新维度的需求forecast = arima_fit.forecast(steps=15)  # 预测未来15天的需求# 构建预测结果并添加到结果表2forecast_dates = pd.date_range(start='2023-05-16', end='2023-05-30')forecast_data = pd.DataFrame({

问题三

问题三要求预测商家+仓库+商品维度在2023-06-01至2023-06-20期间的需求,考虑到大型促销对需求的影响。以下是问题三的建模思路:

步骤1:数据准备

  • 读取历史数据,包括商家+仓库+商品维度在去年双十一期间的需求量数据(附件)。

步骤2:特定日期范围的历史数据选择

  • 从历史数据中筛选出与目标日期范围(2023-06-01至2023-06-20)相对应的数据,这些数据将用于建模。

步骤3:需求预测

  • 使用时间序列模型(如ARIMA)或其他适当的模型,对商家+仓库+商品维度在目标日期范围内的需求进行预测。需要考虑大型促销对需求的影响,可以将促销期视为外部变量。

步骤4:结果记录

  • 将预测结果填写在结果表3中,并上传至竞赛平台。

以下是一些公式示例,用于表示ARIMA模型中的差分(用于稳定性处理)和需求预测:

差分(Differencing)

差分用于将非稳定的时间序列数据转化为稳定的序列,以便ARIMA模型能够准确预测。差分一次通常表示将时间序列减去其前一时刻的值。

差分公式:

Difference ( Y t ) = Y t − Y t − 1 \text{Difference}(Y_t) = Y_t - Y_{t-1} Difference(Yt)=YtYt1

需求预测:

需求预测可以使用ARIMA模型中的预测方法。具体的预测公式取决于ARIMA模型的参数和历史数据的性质。

ARIMA模型的预测公式:

Y ^ t + h = μ + ∑ i = 1 p ϕ i Y t + h − i − ∑ j = 1 q θ j Y ^ t + h − j \hat{Y}_{t+h} = \mu + \sum_{i=1}^{p} \phi_i Y_{t+h-i} - \sum_{j=1}^{q} \theta_j \hat{Y}_{t+h-j} Y^t+h=μ+i=1pϕiYt+hij=1qθjY^t+hj

其中, Y ^ t + h \hat{Y}_{t+h} Y^t+h表示在时间 t + h t+h t+h 的预测值, μ \mu μ 是模型的均值,(p) 和 (q) 是ARIMA模型的阶数, ϕ i \phi_i ϕi θ j \theta_j θj 是模型的参数。

import pandas as pd
import numpy as np
from statsmodels.tsa.arima_model import ARIMA# 读取历史数据(附件6)
historical_data = pd.read_csv('附件6.csv')# 存储预测结果
result_table_3 = pd.DataFrame(columns=['seller_no', 'warehouse_no', 'product_no', 'date', 'predicted_demand'])# 针对每个商家+仓库+商品维度进行需求预测
for index, row in historical_data.iterrows():seller = row['seller_no']warehouse = row['warehouse_no']product = row['product_no']# 获取历史需求数据,以便建立ARIMA模型historical_demand = row['qty'].values# 使用ARIMA模型进行需求预测# 这里需要根据你的数据和需求进一步调整ARIMA模型的参数arima_model = ARIMA(historical_demand, order=(5,1,0))  # 举例使用ARIMA(5,1,0)arima_fit = arima_model.fit(disp=0)# 预测2023-06-01至2023-06-20的需求forecast_dates = pd.date_range(start='2023-06-01', end='2023-06-20')forecast = arima_fit.forecast(steps=len(forecast_dates))# 构建预测结果并添加到结果表3forecast_data = pd.DataFrame({'seller_no': [seller] * len(forecast_dates),'warehouse_no': [warehouse] * len(forecast_dates),'product_no': [product] * len(forecast_dates),'date': forecast_dates,#见完整代码

更多完整版代码+思路
2023年第四届MathorCup大数据挑战赛(B题)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/120595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高级路由配置

目录 路由协议认证 Ripv2的认证配置 OSPF认证 BGP认证 OSPF特殊区域 BGP的选路规则 路由策略(route-policy和filter-policy) IP-Prefix List:前缀列表 Filter-Policy 路由引入(import-route) Filter-policy和route-pol…

目标跟踪ZoomTrack: Target-aware Non-uniform Resizing for Efficient Visual Tracking

论文作者:Yutong Kou,Jin Gao,Bing Li,Gang Wang,Weiming Hu,Yizheng Wang,Liang Li 作者单位:CASIA; University of Chinese Academy of Sciences; ShanghaiTech University; Beijing Institute of Basic Medical Sciences; People AI, Inc 论文链接&…

Java 反射机制详解

目录 一. 前言 二. 反射基础 2.1. Class 类 2.2. 类加载 三. 反射的使用 3.1. Class类对象的获取 3.2. Constructor类及其用法 3.3. Field类及其用法 3.4. Method类及其用法 四. 反射机制执行的流程 4.1. 反射获取类实例 4.2. 获取构造器的过程 4.3. 反射获取方法…

吐血整理,Jmeter服务端性能测试-线程阻塞问题案例分析(超细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、Jstack打印快照…

【微信小程序】数字化会议OA系统之投票模块(附源码)

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《微信小程序开发实战》。🎯&#x1f3a…

FoneDog iOS Unlocker(ios解锁工具) 适用macos电脑

FoneDog iOS Unlocker是一款专业的iOS设备解锁工具,旨在帮助用户解决iOS设备上的解锁问题。该软件支持解锁各种锁定类型,如数字密码锁、手势密码锁、Touch ID和Face ID等,可以解除iPhone、iPad和iPod Touch等设备的锁定状态。FoneDog iOS Unl…

react-组件间的通讯

一、父传子 父组件在使用子组件时&#xff0c;提供要传递的数据子组件通过props接收数据 class Parent extends React.Component {render() {return (<div><div>我是父组件</div><Child name"张" age{16} /></div>)} }const Child …

NEWCC:新时代的区块链生态新币私募造势平台

在当今区块链领域&#xff0c;这项技术已经为金融资产注入了全新的生机&#xff0c;同时也为初创企业提供了新的商业模式和融资机会。通过代币的金融属性&#xff0c;企业和项目方得以实现资本的初期积累&#xff0c;同时在区块链空间以更低成本和更高效率进行交易和服务创新。…

【广州华锐互动】VR公司工厂消防逃生演练带来沉浸式的互动体验

在工业生产过程中&#xff0c;安全问题始终是我们不能忽视的重要环节。特别是火灾事故&#xff0c;不仅会造成重大的经济损失&#xff0c;更会威胁到员工的生命安全。传统的消防安全训练方法&#xff0c;如讲座、实地演练等&#xff0c;虽然具有一定的效果&#xff0c;但是无法…

ZooKeeper中节点的操作命令(查看、创建、删除节点)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

docker部署prometheus+grafana服务器监控(二) - 安装数据收集器 node-exporter

在目标服务器安装数据收集器 node-exporter 1. 安装数据收集器 node-exporter wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gztar xvf node_exporter-1.6.1.linux-amd64.tar.gzmv node_exporter-1.6.1…

短视频矩阵系统搭建/源头----源码

一、智能剪辑、矩阵分发、无人直播、爆款文案于一体独立应用开发 抖去推----主要针对本地生活的----移动端(小程序软件系统&#xff0c;目前是全国源头独立开发)&#xff0c;开发功能大拆解分享&#xff0c;功能大拆解&#xff1a; 7大模型剪辑法&#xff08;数学阶乘&#xff…

SQL Server Management Studio (SSMS)的安装教程

文章目录 SQL Server Management Studio (SSMS)的安装教程从Microsoft官网下载SQL Server Management Studio安装程序。选中安装程序右键并选择“以管理员的身份运行”选项选择安装目录&#xff0c;单击“安装”按钮开始安装过程安装成功界面安装完成后&#xff0c;您可以启动S…

银河麒麟v10x86或者arm离线安装服务

银河麒麟v10x86或者arm离线安装服务 最近有个项目&#xff0c;甲方的服务器用的全是国产化服务器银河麒麟&#xff0c;架构是x86的然后也无法连接外网&#xff0c;需要离线安装服务正常思路就是找到离线安装的包&#xff0c;然后拷贝到现场的服务器中进行安装所以问题就在于如…

机器学习——正则化

正则化 在机器学习学习中往往不知道需要不知道选取的特征个数&#xff0c;假如特征个数选取过少&#xff0c;容易造成欠拟合&#xff0c;特征个数选取过多&#xff0c;则容易造成过拟合。由此为了保证模型能够很好的拟合样本&#xff0c;同时为了不要出现过拟合现象&#xff0…

Macos视频增强修复工具:Topaz Video AI for mac

Topaz Video AI是一款使用人工智能技术对视频进行增强和修复的软件。它可以自动降噪、去除锐化、减少压缩失真、提高清晰度等等。Topaz Video AI可以处理各种类型的视频&#xff0c;包括低分辨率视频、老旧影片、手机录制的视频等等。 使用Topaz Video AI非常简单&#xff0c;…

基于SSM的二手车交易系统

基于SSM的二手车交易系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 登录界面 管理员界面 摘要 基于SSM&#xff08;Spring、SpringMVC、MyBatis&a…

如何进行微服务测试?一文4个知识点带入门微服务测试!

关注留言点赞&#xff0c;带你了解最流行的软件开发知识与最新科技行业趋势。 本文将讨论微服务测试的重要性、挑战和最佳实践。 微服务架构是一种越来越流行的构建复杂分布式系统的方法。在此体系结构中&#xff0c;大型应用程序被分成较小的、独立的服务&#xff0c;这些服务…

大数据平台架构及规划

梳理了数据平台及未来规划&#xff0c;具体如下&#xff1a; 整体架构&#xff1a; 当前建设进展&#xff1a; 部署架构 部署架构2&#xff1a; Flink 实时计算平台架构 版本1&#xff1a; 版本2&#xff1a; 离线平台架构&#xff1a; 未来规划&#xff1a;

公有云容灾,中小企业最具性价比的选择

备份容灾的成本门槛 业务数据是企业的核心&#xff0c;为了防止意外灾难引发的数据损失、业务系统宕机等情况&#xff0c;企业可以选择部署备份容灾&#xff0c;以此保证系统和服务不会在意外发生时断线&#xff0c;以及数据的完整性。 在过去&#xff0c;只有大型企业会部署…