⏳ 时间序列特点
📈 趋势·季节·周期
🎯 节假日·外部特征
⏱️ 1. 时间序列数据特点
- 时序依赖性 —— 观测值按时间顺序排列,前后相关 自相关
- 非平稳性 —— 均值/方差随时间变化,常含趋势与季节
- 等间隔 vs 非等间隔 —— 日/周/月粒度,缺失值处理
- 多尺度模式 —— 短周期波动 + 长周期形态
📌 核心挑战
- 🔸 滞后性 & 序列膨胀
- 🔸 多重季节性 (日/周/年)
- 🔸 异常点 & 水平偏移
🧩 2. 核心成分提取
📊 趋势 · 季节 · 周期
| 成分 | 描述 | 提取方式 |
| 趋势 | 长期增加/减少 | 移动平均、多项式拟合 |
| 季节性 | 固定周期 (周/月/年) | STL分解、傅里叶项 |
| 周期性 | 非固定周期 (经济循环) | 自相关分析、谱分析 |
🎉 节假日效应
- 📅 固定日期 (春节/圣诞) → one-hot / 距离编码
- 📅 浮动节日 (感恩节/ Ramadan) → 相对位置特征
- 📅 节前/节后窗口 (前3天/后5天) 叠加效应
✨ 技巧: 结合中国假日API,生成“是否长假”“调休日”等布尔特征。
🌦️ 3. 外部特征提取与处理
🏷️ 促销特征
- 折扣深度 / 促销类型 (满减/秒杀)
- 促销持续时间 & 累计曝光
- 上期促销后遗效应 (库存消化)
🌤️ 天气 & 经济
- 温度/降雨/降雪 (滞后影响)
- GDP、CPI、消费者信心指数
- 行业指数 / 搜索热度 (Google Trends)
| 特征类型 | 原始数据 | 特征工程方法 | 示例 |
| 促销 | 折扣率, 促销flag | 折扣分箱, 累计促销天数, 距离下次促销 | 0.3折扣 → 高促销强度 |
| 天气 | 温度, 湿度, 天气代码 | 平滑移动平均, 极端天气哑变量 | 暴雨日 → 销量下降20% |
| 经济 | PMI, 失业率 | 差分, 同比变化, 滞后3期 | PMI>50 → 扩张信号 |
🔗 外部特征融合: 与时间索引对齐,注意前瞻性偏差 (future leakage) —— 只使用历史已知信息。
⚙️ 4. 特征工程代码示例 (Python)
import pandas as pd
import numpy as np
from statsmodels.tsa.seasonal import STL
# 假设 df 包含 'date' 和 'sales'
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date').asfreq('D')
# 1. 趋势+季节分解
stl = STL(df['sales'], period=7)
res = stl.fit()
df['trend'] = res.trend
df['seasonal_7'] = res.seasonal
# 2. 节假日特征 (示例: 春节)
holiday_dates = pd.to_datetime(['2024-02-10', '2025-01-29']) # 春节
df['is_spring_festival'] = df.index.isin(holiday_dates).astype(int)
# 节前窗口
df['days_to_spring'] = (df.index - holiday_dates[0]).dt.days # 简化
# 3. 促销外部特征
df['promo_discount'] = np.where(df['promo_type'] == 'high', 0.8, 0.0)
df['promo_accum_days'] = df['promo_flag'].groupby(
(df['promo_flag'] == 0).cumsum()).cumsum()
# 4. 天气滞后特征
df['temp_lag1'] = df['temperature'].shift(1)
df['rain_3d_avg'] = df['rainfall'].rolling(3).mean()
print("特征工程完成 ✅ shape:", df.shape)
🧭 5. 特征工程流程架构