✨ 缺失值、异常值、重复值是数据清洗的三大核心。本章涵盖删除、填充、插值策略,IQR / Z-score 异常检测,以及重复值处理,为需求预测模型提供干净、可靠的数据基础。
# 中位数填充 (需求预测稳健)
df['sales'].fillna(df['sales'].median(), inplace=True)
# 前向填充 (时间序列)
df['demand'].ffill(inplace=True)
# 线性插值 (按索引)
df['demand'].interpolate(method='linear', inplace=True)
# 时间插值 (日期索引)
df['demand'].interpolate(method='time', inplace=True)
Q1 = df['sales'].quantile(0.25)
Q3 = df['sales'].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5*IQR
upper = Q3 + 1.5*IQR
outliers = df[(df['sales'] < lower) | (df['sales'] > upper)]
from scipy import stats
z_scores = stats.zscore(df['demand'])
outliers = df[abs(z_scores) > 3]
# 盖帽法 (1% / 99% 分位)
df['demand'] = df['demand'].clip(lower=df['demand'].quantile(0.01),
upper=df['demand'].quantile(0.99))
# 完全去重
df.drop_duplicates(inplace=True)
# 按SKU+日期去重,保留最后一次记录
df.drop_duplicates(subset=['sku','date'], keep='last', inplace=True)
# 重复聚合 (均值)
df_grouped = df.groupby(['sku','date'])['demand'].mean().reset_index()
| 类型 | 方法 | 适用场景 | 需求预测注意 |
|---|---|---|---|
| 缺失值 | 删除 (listwise) | 缺失极少 <5% | 避免删除时间序列关键点 |
| 中位数 / 插值 | 连续缺失 <30% | 线性插值适合平滑需求 | |
| 异常值 | IQR 法 | 偏态、含促销峰值 | 1.5×IQR 可调整至 3×IQR 若促销频繁 |
| Z-score 法 | 近似正态、稳定品 | 阈值 2.5~3.0 灵活设定 | |
| 重复值 | drop_duplicates | 完全重复 / 主键重复 | 按业务键去重,保留最新或均值 |