import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense
import tensorflow.compat.v2 as tf
# 读取数据
data = pd.read_csv('test.csv')

# 数据预处理
data['销售日期'] = pd.to_datetime(data['销售日期'])
data['销售量(千克)'] = data['销售量(千克)'].astype(float)
data = data.groupby(['销售日期', '单品编码']).sum().reset_index()

# 提取特征
data['年'] = data['销售日期'].dt.year
data['月'] = data['销售日期'].dt.month
data['日'] = data['销售日期'].dt.day
data['星期'] = data['销售日期'].dt.weekday

# 构建训练集和测试集
train_data = data[data['销售日期'] < '2023-06-24']
test_data = data[data['销售日期'] >= '2023-06-24']

# 归一化处理
scaler = MinMaxScaler(feature_range=(0, 1))
train_scaled = scaler.fit_transform(train_data['销售量(千克)'].values.reshape(-1, 1))

# 构建训练数据
train_X, train_y = [], []
for i in range(7, len(train_scaled)):
    train_X.append(train_scaled[i-7:i, 0])
    train_y.append(train_scaled[i, 0])
train_X, train_y = np.array(train_X), np.array(train_y)
train_X = np.reshape(train_X, (train_X.shape[0], train_X.shape[1], 1))

# 构建模型
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(train_X.shape[1], 1)))
model.add(LSTM(units=50))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mean_squared_error')

# 模型训练
model.fit(train_X, train_y, epochs=100, batch_size=32)

# 预测未来一天的销售量
inputs = train_data[len(train_data)-7:]['销售量(千克)'].values
inputs = inputs.reshape(-1,1)
inputs = scaler.transform(inputs)
X_test = []
X_test.append(inputs[-7:])
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
predicted_sales = model.predict(X_test)
predicted_sales = scaler.inverse_transform(predicted_sales)

# 补货计划
replenishment = test_data.groupby('单品编码').sum().reset_index()
replenishment['预测销售量(千克)'] = predicted_sales.flatten()
replenishment = replenishment[replenishment['预测销售量(千克)'] >= 2.5]
replenishment = replenishment.sample(n=np.random.randint(0, 34))

# 定价策略
replenishment['定价策略'] = replenishment['批发价格'] * 1.2

# 输出结果
replenishment[['单品编码', '预测销售量(千克)', '定价策略']]

代码说明:

  1. 读取数据并进行数据预处理,包括日期格式转换和数据类型转换。
  2. 提取特征,包括年、月、日和星期等信息。
  3. 将数据分为训练集和测试集,并对训练集进行归一化处理。
  4. 构建LSTM模型,并使用训练集进行训练。
  5. 使用训练集的最后7天数据预测未来一天的销售量。
  6. 根据预测结果制定补货计划,包括补货数量和定价策略。
  7. 输出补货计划结果。

报错解决:

代码中出现ValueError: a must be greater than 0 unless no samples are taken的报错是由于np.random.randint(27, 34)生成的随机数范围没有包含0,而replenishment的长度可能小于27,导致无法从中随机采样。解决这个问题的方法是在生成随机数范围时将下限设为0,即np.random.randint(0, 34)。这样即使replenishment的长度小于27,也可以从中随机采样0个元素。

修改后的代码:

# 补货计划
replenishment = test_data.groupby('单品编码').sum().reset_index()
replenishment['预测销售量(千克)'] = predicted_sales.flatten()
replenishment = replenishment[replenishment['预测销售量(千克)'] >= 2.5]
replenishment = replenishment.sample(n=np.random.randint(0, 34))

# 定价策略
replenishment['定价策略'] = replenishment['批发价格'] * 1.2

# 输出结果
replenishment[['单品编码', '预测销售量(千克)', '定价策略']]

代码功能:

这段代码主要实现了基于LSTM模型的销售预测和补货计划制定。它根据历史销售数据训练LSTM模型,预测未来一天的销售量,并根据预测结果制定补货计划,包括补货数量和定价策略。

代码用途:

该代码可以用于零售、电商等需要进行销售预测和补货计划制定的场景。

代码优势:

  1. 使用LSTM模型能够有效地捕捉到时间序列数据中的趋势和季节性因素,提高预测精度。
  2. 代码逻辑清晰,易于理解和修改。
  3. 能够根据预测结果自动制定补货计划,减少人工操作,提高效率。

代码不足:

  1. 代码中的模型参数需要根据实际情况进行调整,才能达到最佳效果。
  2. 代码只预测了未来一天的销售量,如果需要预测更长的时间段,需要修改代码。
  3. 代码中的补货计划制定策略比较简单,可以根据实际情况进行改进。

改进建议:

  1. 使用更复杂的模型,例如GRU或双向LSTM,提高预测精度。
  2. 尝试不同的模型参数,找到最佳配置。
  3. 增加对不同时间段的预测,例如预测未来一周或一个月。
  4. 完善补货计划制定策略,例如考虑库存成本、运输成本等因素。

总结:

这段代码是一个基于LSTM模型的销售预测和补货计划制定示例,它展示了如何利用深度学习技术解决实际问题。通过对代码进行改进和完善,可以使其更加实用和高效。

基于LSTM模型的销售预测与补货计划制定

原文地址: https://www.cveoy.top/t/topic/eheX 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录