📦 需求预测 · 数据预处理

实战 4/8 缺失值 · 异常值 · 平滑

1 缺失值处理 · 插值 & 前向填充

时间序列中缺失值会破坏连续性,常用 线性插值 与 前向填充 (ffill) 还原趋势。

📐 线性插值 (Linear Interpolation)

利用缺失点前后有效值拟合直线,适合趋势平稳片段。

# 线性插值示例 (pandas)
df['sales'].interpolate(method='linear', inplace=True)

⏩ 前向填充 (ffill)

用上一个非缺失值填充,适合需求突变少的场景。

# 前向填充
df['sales'].fillna(method='ffill', inplace=True)

🧮 插值对比表

方法适用场景延迟
线性插值趋势平稳低
前向填充短期缺失中
多项式插值曲线波动高
线性插值 前向填充 观测值

2 异常值检测 · IQR & 3-Sigma

识别需求尖峰或数据错误,常用 IQR (四分位距) 和 3-Sigma (标准差) 方法。

📊 IQR 方法

  • 下界 = Q1 - 1.5×IQR
  • 上界 = Q3 + 1.5×IQR
  • 超出即视为异常
Q1 = df['sales'].quantile(0.25)
Q3 = df['sales'].quantile(0.75)
IQR = Q3 - Q1
outliers = (df['sales'] < Q1-1.5*IQR) | (df['sales'] > Q3+1.5*IQR)

📈 3-Sigma 方法

  • 均值 μ,标准差 σ
  • 区间 [μ-3σ, μ+3σ]
  • 之外视为异常
mu = df['sales'].mean()
sigma = df['sales'].std()
outliers = (df['sales'] < mu-3*sigma) | (df['sales'] > mu+3*sigma)

🔧 修正策略

方法操作
截尾替换为边界值
插值修正用前后均值
剔除删除异常点
异常 异常 Q1 Q3 中位 IQR 3-Sigma 区间 异常

3 数据平滑 & 重采样

平滑消除噪声,重采样统一时间频率,是需求预测的关键预处理。

🌀 移动平均平滑

df['sales_smooth'] = df['sales'].rolling(window=7).mean()

窗口=7 (日) 消除周波动。

⏱️ 重采样 (Resample)

# 日 -> 周聚合
df.resample('W').sum()

将日数据升维至周、月,稳定需求信号。

📉 指数加权平滑

df['ewm'] = df['sales'].ewm(alpha=0.3).mean()
原始 平滑(MA) 重采样(周)
频率聚合函数适用场景
日 → 周sum / mean消除周末效应
日 → 月sum长期趋势
小时 → 日mean / max日内模式

⚙ 预处理流水线 · 架构

原始数据 缺失值处理 插值 / ffill 异常检测 IQR / 3σ 平滑 & 重采样 移动平均 / 周 ✓

⬆ 预处理流水线:缺失 → 异常 → 平滑/重采样,输出干净时序