基于 LSTM 的单品补货量预测及定价策略
基于 LSTM 的单品补货量预测及定价策略
本代码使用 Python 和 Keras 库,基于 LSTM 模型实现单品销售量的时间序列预测,并根据预测结果给出补货量建议和定价策略。
代码实现
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import Dense, LSTM
# 读取数据
data = pd.read_csv('test.csv')
# 数据预处理
data['销售日期'] = pd.to_datetime(data['销售日期'])
data['销售量(千克)'] = data['销售量(千克)'].astype(float)
data = data[['销售日期', '单品编码', '销售量(千克)']]
data = data.groupby(['销售日期', '单品编码']).sum().reset_index()
# 构建时间序列数据
timeseries_data = data.pivot(index='销售日期', columns='单品编码', values='销售量(千克)')
timeseries_data = timeseries_data.fillna(0)
# 归一化
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(timeseries_data)
# 划分训练集和测试集
train_data = scaled_data[:-7]
test_data = scaled_data[-7:]
# 构建输入和输出
def create_dataset(dataset, lookback=1):
X, Y = [], []
for i in range(len(dataset)-lookback):
X.append(dataset[i:(i+lookback)])
Y.append(dataset[i+lookback])
return np.array(X), np.array(Y)
lookback = 3
train_X, train_Y = create_dataset(train_data, lookback)
test_X, test_Y = create_dataset(test_data, lookback)
# 构建模型
model = Sequential()
model.add(LSTM(50, input_shape=(lookback, train_X.shape[2])))
model.add(Dense(train_X.shape[2]))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(train_X, train_Y, epochs=100, batch_size=16, verbose=0)
# 预测
train_predict = model.predict(train_X)
test_predict = model.predict(test_X)
# 反归一化
train_predict = scaler.inverse_transform(train_predict)
train_Y = scaler.inverse_transform(train_Y)
test_predict = scaler.inverse_transform(test_predict)
test_Y = scaler.inverse_transform(test_Y)
# 输出预测结果
print('7月1日的单品补货量和定价策略:')
for i in range(len(test_predict)):
for j in range(len(test_predict[i])):
if test_predict[i][j] > 2.5:
print('单品编码:', timeseries_data.columns[j])
print('补货量:', test_predict[i][j])
print('定价策略:根据市场需求和成本进行定价')
print('---')
# 报错解决
# 该错误是因为train_data已经是一个numpy数组,不需要使用.values方法。将第37行的代码修改为:
train_X, train_Y = create_dataset(train_data, lookback)
代码说明
- 数据读取和预处理
- 读取 CSV 文件中的销售数据
- 将'销售日期'列转换为日期类型
- 将'销售量(千克)'列转换为浮点型
- 按'销售日期'和'单品编码'分组并求和,得到每个日期每个单品的销售量
- 构建时间序列数据
- 使用
pivot()函数将数据转换为时间序列格式,以'销售日期'为索引,以'单品编码'为列,以'销售量(千克)'为值 - 使用
fillna(0)填充缺失值
- 使用
- 归一化
- 使用
MinMaxScaler()将数据归一化到 0 到 1 之间,方便模型训练
- 使用
- 划分训练集和测试集
- 将数据分为训练集和测试集,用于模型训练和评估
- 构建输入和输出
- 定义
create_dataset()函数,将时间序列数据转换为 LSTM 模型所需的输入和输出格式 - 设置
lookback参数,表示每个样本包含多少个时间步长
- 定义
- 构建模型
- 使用
Sequential()构建模型 - 添加 LSTM 层,设置输入形状为
(lookback, train_X.shape[2]) - 添加 Dense 层,输出维度与输入维度相同
- 使用 'mean_squared_error' 作为损失函数,使用 'adam' 作为优化器
- 使用
fit()方法训练模型
- 使用
- 预测
- 使用
predict()方法对训练集和测试集进行预测
- 使用
- 反归一化
- 使用
inverse_transform()方法将预测结果反归一化到原始数据范围
- 使用
- 输出预测结果
- 输出 7 月 1 日的每个单品的补货量建议和定价策略
总结
该代码利用 LSTM 模型实现了单品销售量的时间序列预测,并根据预测结果给出了补货量建议和定价策略,可以帮助企业更好地管理库存和制定价格策略。
报错解决
代码中出现错误 AttributeError: 'numpy.ndarray' object has no attribute 'values' 是因为 train_data 已经是一个 NumPy 数组,不需要使用 .values 属性。将第 37 行代码修改为 train_X, train_Y = create_dataset(train_data, lookback) 即可解决。
注意事项
- 该代码只是一个示例,需要根据实际情况进行调整
- 建议使用更多数据进行训练,以提高模型的预测精度
- 可以尝试使用其他深度学习模型,例如 GRU 和 CNN
- 可以使用其他特征,例如价格、促销信息等,以提高模型的预测精度
- 可以使用更复杂的定价策略,例如动态定价策略
- 可以使用可视化工具,例如 Matplotlib 和 Seaborn,对预测结果进行可视化分析
原文地址: http://www.cveoy.top/t/topic/ehqL 著作权归作者所有。请勿转载和采集!