3. 零售销售预测模型

零售销售预测模型 学习卡片

任务说明

基于历史日销售额数据,训练时间序列模型预测未来7天的日销售额,并以平均误差(MAE)和均方根误差(RMSE)评估预测效果。本案例采用SARIMA模型(季节性自回归积分滑动平均),适用于带有周季节性的日销售数据。

环境依赖

需要 pandas、numpy、statsmodels、scikit-learn。安装命令:

pip install pandas numpy statsmodels scikit-learn

完整实现


import numpy as np
import pandas as pd
from statsmodels.tsa.statespace.sarimax import SARIMAX
from sklearn.metrics import mean_absolute_error, mean_squared_error

# 1. 生成模拟历史销售数据(90天,含周季节性+趋势+噪声)
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=90, freq='D')
trend = np.linspace(100, 130, 90)
weekly = 20 * np.sin(np.linspace(0, 2*np.pi*90/7, 90))
noise = np.random.normal(0, 5, 90)
sales = trend + weekly + noise
df = pd.DataFrame({'date': dates, 'sales': sales})
df.set_index('date', inplace=True)

# 2. 划分训练集(前83天)和测试集(后7天)
train = df.iloc[:-7]
test = df.iloc[-7:]

# 3. 训练SARIMA模型(周季节性,周期=7)
model = SARIMAX(train['sales'],
                order=(1, 1, 1),
                seasonal_order=(1, 1, 1, 7),
                enforce_stationarity=False,
                enforce_invertibility=False)
fitted = model.fit(disp=False)

# 4. 预测未来7天
forecast = fitted.forecast(steps=7)
forecast = pd.Series(forecast, index=test.index)

# 5. 评估误差
mae = mean_absolute_error(test['sales'], forecast)
rmse = np.sqrt(mean_squared_error(test['sales'], forecast))

print("预测值(未来7天):")
print(forecast.round(2).to_string())
print(f"\nMAE: {mae:.2f}")
print(f"RMSE: {rmse:.2f}")

运行方式

将上述代码保存为 sales_forecast.py,在命令行执行:

python sales_forecast.py

验证方法

程序输出未来7天的预测值及MAE、RMSE指标。判定通过条件:

  • 程序无报错正常结束;
  • 输出7个预测值,索引日期与测试集最后7天一致;
  • MAE和RMSE均为有限正数(通常MAE在5~15之间,RMSE略大于MAE,因模拟数据噪声标准差为5)。

若需验证模型对真实数据的适用性,可将 df 替换为实际销售数据(需保证索引为日期且按日频率连续),其余代码无需改动。

关键说明

SARIMA参数 (1,1,1)×(1,1,1,7) 表示非季节性ARIMA(1,1,1)加上周期为7的季节性分量。若实际数据周季节性不明显,可将 seasonal_order 中的季节差分项从1改为0,或直接使用非季节性ARIMA。模型训练时 disp=False 用于关闭迭代日志,保持输出简洁。

SARIMA预测流程与数据划分 训练集(83天) 测试 输入 SARIMA(1,1,1)×(1,1,1,7) 季节周期=7天 预测未来7天日销售额 MAE RMSE 训练集用于拟合模型参数,测试集(最后7天)用于评估预测误差