🧹 缺失值处理
⚠️ 异常值检测
⏱️ 重采样 & 对齐
📈 移动平均
✨ 指数平滑
🧼 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
🧩 数据预处理实战流程 供应链预测流水线
✅ 清洗后数据无缺失✅ 异常值经cap或剔除✅ 时间索引频率一致✅ 平滑降低噪声