📦 供应链预测模型 · 数据预处理实战

缺失值·异常值·重采样·对齐·平滑 精讲 #3
🧹 缺失值处理 ⚠️ 异常值检测 ⏱️ 重采样 & 对齐 📈 移动平均 ✨ 指数平滑

🧼 1. 缺失值 & 异常值处理 清洗核心

📌 缺失值策略

  • 删除:缺失比例 < 5% 且随机
  • 均值/中位数填充:数值型稳定特征
  • 前向/后向填充:时间序列常用
  • 插值法:线性、多项式、样条
  • 模型预测填充:KNN, MICE

📌 异常值检测

  • IQR 规则:Q1 - 1.5IQR / Q3 + 1.5IQR
  • Z-score:|Z| > 3 视为异常
  • DBSCAN / Isolation Forest
  • 时间序列专属:移动平均差、STL分解
⚡ 实战代码片段
# 缺失值填充 (Pandas)
df['sales'].fillna(method='ffill', inplace=True)
df['price'].interpolate(method='linear', inplace=True)

# 异常值截尾 (IQR)
Q1 = df['qty'].quantile(0.25)
Q3 = df['qty'].quantile(0.75)
IQR = Q3 - Q1
df = df[~((df['qty'] < Q1-1.5*IQR) | 
          (df['qty'] > Q3+1.5*IQR))]
方法适用场景注意事项
均值填充正态分布、波动小会降低方差
中位数填充偏态分布、有异常值鲁棒性较好
前向填充时间序列、库存数据假设值不变
IQR截尾单变量异常不适用于高维

⏳ 2. 数据重采样 & 时间戳对齐 时序基石

📅 降采样
日 → 周/月
resample('W').sum()
📈 升采样
日 → 小时
resample('H').ffill()
🔗 对齐
多源时间戳统一
df1.align(df2, join='outer')
原始日数据 周 小时 对齐
📌 常用规则: 日→周聚合 (sum/mean) 📌 对齐方式: 左对齐/右对齐/最近 📌 处理时区: tz_localize / tz_convert

🌊 3. 数据平滑 移动平均 · 指数平滑

📉 移动平均 (SMA / WMA)

  • 简单移动平均:窗口等权重
  • 加权移动平均:近期权重高
  • 中心移动平均:用于季节调整
# 简单移动平均 (窗口7)
df['sales_sma7'] = df['sales'].rolling(7).mean()
# 加权移动平均
weights = [0.1, 0.15, 0.2, 0.25, 0.3]
df['sales_wma'] = df['sales'].rolling(5).apply(
    lambda x: sum(w*v for w,v in zip(weights, x))
)

✨ 指数平滑 (ES)

  • 单指数平滑:α 平滑常数
  • 双指数平滑:趋势项
  • Holt-Winters:季节+趋势
from statsmodels.tsa.holtwinters import SimpleExpSmoothing
# 单指数平滑 (alpha=0.3)
model = SimpleExpSmoothing(df['sales'])
fit = model.fit(smoothing_level=0.3, optimized=False)
df['ses'] = fit.fittedvalues

# Holt-Winters 季节性
from statsmodels.tsa.holtwinters import ExponentialSmoothing
hw = ExponentialSmoothing(df['sales'], 
    seasonal_periods=12, trend='add', seasonal='add')
fit_hw = hw.fit()
df['hw_fit'] = fit_hw.fittedvalues
原始 平滑后 (SMA/ES)

🧩 数据预处理实战流程 供应链预测流水线

原始数据 缺失值处理 异常值清洗 重采样+对齐 平滑 移动平均 指数平滑
✅ 清洗后数据无缺失✅ 异常值经cap或剔除✅ 时间索引频率一致✅ 平滑降低噪声