当前位置: 首页 > news >正文

Pandas 1.5+ 时间特征工程实战:12种离散化与5种聚合特征代码模板

Pandas时间特征工程实战:17种高效特征构造方法与模块化实现

1. 时间特征工程的核心价值与场景

在电商用户行为分析中,我们发现购买转化率在工作日晚间8-10点显著高于其他时段;金融风控领域,月初月末的交易欺诈概率往往比月中高出37%;工业设备预测性维护中,连续运行时长超过72小时的机器故障率会陡增4倍。这些洞见都源于对时间特征的深度挖掘。

时间特征工程之所以成为提升模型性能的关键手段,核心在于它实现了三个维度的信息转化:

  1. 周期性转化:将线性时间戳转化为具有业务意义的周期特征(星期、季节等)
  2. 状态转化:将连续时间点转化为离散状态标记(是否节假日、营业时段等)
  3. 聚合转化:将时间序列转化为统计特征(滑动窗口均值、近期趋势等)

以某零售企业实际案例为例,在引入时间特征后,其销量预测模型的MAPE从12.3%降至7.8%,特征重要性分析显示前10个重要特征中有6个与时间相关。这充分证明了时间特征在真实业务场景中的价值。

2. 时间离散化特征构造

2.1 基础时间单元提取

def extract_basic_units(df, time_col): """提取年月日等基础时间单元""" df['year'] = df[time_col].dt.year df['month'] = df[time_col].dt.month df['day'] = df[time_col].dt.day df['hour'] = df[time_col].dt.hour df['minute'] = df[time_col].dt.minute df['dayofweek'] = df[time_col].dt.dayofweek # 周一为0,周日为6 df['dayofyear'] = df[time_col].dt.dayofyear df['weekofyear'] = df[time_col].dt.isocalendar().week return df

2.2 时段划分与季节标记

def add_time_periods(df, hour_col): """添加时段划分特征""" period_bins = [-1, 5, 8, 11, 13, 17, 19, 22, 24] period_labels = ['深夜', '早晨', '上午', '中午', '下午', '傍晚', '晚上', '深夜'] df['period'] = pd.cut(df[hour_col], bins=period_bins, labels=period_labels, right=False) season_map = {1: '冬', 2: '冬', 3: '春', 4: '春', 5: '春', 6: '夏', 7: '夏', 8: '夏', 9: '秋', 10: '秋', 11: '秋', 12: '冬'} df['season'] = df['month'].map(season_map) return df

2.3 特殊时点判断

def add_special_flags(df, time_col): """添加特殊时点标记""" df['is_month_start'] = df[time_col].dt.is_month_start.astype(int) df['is_month_end'] = df[time_col].dt.is_month_end.astype(int) df['is_quarter_start'] = df[time_col].dt.is_quarter_start.astype(int) df['is_quarter_end'] = df[time_col].dt.is_quarter_end.astype(int) df['is_year_start'] = df[time_col].dt.is_year_start.astype(int) df['is_year_end'] = df[time_col].dt.is_year_end.astype(int) df['is_weekend'] = df[time_col].dt.dayofweek.isin([5,6]).astype(int) # 自定义节假日判断 holidays = ['2023-01-01', '2023-05-01'] # 示例日期 df['is_holiday'] = df[time_col].dt.date.astype(str).isin(holidays).astype(int) return df

3. 时间聚合特征构造

3.1 滑动窗口统计特征

def add_rolling_features(df, value_col, time_col, window='7D'): """ 添加滑动窗口统计特征 :param window: 窗口大小,如'7D'表示7天,'3H'表示3小时 """ df = df.set_index(time_col) df[f'rolling_mean_{window}'] = df[value_col].rolling(window).mean() df[f'rolling_std_{window}'] = df[value_col].rolling(window).std() df[f'rolling_min_{window}'] = df[value_col].rolling(window).min() df[f'rolling_max_{window}'] = df[value_col].rolling(window).max() df[f'rolling_median_{window}'] = df[value_col].rolling(window).median() return df.reset_index()

3.2 时间差异特征

def add_time_diff_features(df, time_col, group_col=None): """添加时间间隔特征""" df = df.sort_values(by=[group_col, time_col] if group_col else time_col) # 计算与前一次的时间差 df['time_since_last'] = df.groupby(group_col)[time_col].diff() if group_col \ else df[time_col].diff() df['time_since_last'] = df['time_since_last'].dt.total_seconds() / 3600 # 转换为小时 # 计算与第一次的时间差 df['time_since_first'] = df[time_col] - df.groupby(group_col)[time_col].transform('first') \ if group_col else df[time_col] - df[time_col].min() df['time_since_first'] = df['time_since_first'].dt.total_seconds() / 86400 # 转换为天 return df

4. 高级时间序列特征

4.1 趋势特征

def add_trend_features(df, value_col, time_col, windows=[3,7,14]): """添加趋势特征""" df = df.set_index(time_col) for w in windows: # 短期趋势:当前值/近期均值 df[f'trend_ratio_{w}'] = df[value_col] / df[value_col].rolling(f'{w}D').mean() # 变化速率:当前值与近期均值的差异百分比 df[f'trend_change_{w}'] = (df[value_col] - df[value_col].rolling(f'{w}D').mean()) \ / df[value_col].rolling(f'{w}D').mean() return df.reset_index()

4.2 周期性特征

def add_periodicity_features(df, value_col, time_col, period='D'): """添加周期性特征""" df = df.set_index(time_col) # 同期对比(同比/环比) if period == 'D': df['period_diff'] = df[value_col] - df[value_col].shift(1) df['period_pct_change'] = df[value_col].pct_change(1) elif period == 'W': df['period_diff'] = df[value_col] - df[value_col].shift(7) df['period_pct_change'] = df[value_col].pct_change(7) # 周期性分解 from statsmodels.tsa.seasonal import seasonal_decompose result = seasonal_decompose(df[value_col], model='additive', period=7) df['periodic_resid'] = result.resid return df.reset_index()

5. 模块化实现与实战应用

5.1 完整特征工程类实现

class TimeFeatureGenerator: def __init__(self, time_col, value_col=None, group_col=None): self.time_col = time_col self.value_col = value_col self.group_col = group_col def fit_transform(self, df): # 确保时间列格式正确 df[self.time_col] = pd.to_datetime(df[self.time_col]) # 执行所有特征转换 df = extract_basic_units(df, self.time_col) df = add_time_periods(df, 'hour') df = add_special_flags(df, self.time_col) if self.value_col: df = add_rolling_features(df, self.value_col, self.time_col) df = add_time_diff_features(df, self.time_col, self.group_col) df = add_trend_features(df, self.value_col, self.time_col) df = add_periodicity_features(df, self.value_col, self.time_col) # 清理中间列 df = df.drop(columns=['hour', 'minute'], errors='ignore') return df # 使用示例 generator = TimeFeatureGenerator(time_col='timestamp', value_col='sales', group_col='store_id') df_features = generator.fit_transform(raw_df)

5.2 电商用户行为分析案例

# 模拟电商日志数据 log_data = pd.DataFrame({ 'user_id': np.random.randint(1000, 1005, 1000), 'event_time': pd.date_range('2023-06-01', periods=1000, freq='15T'), 'action': np.random.choice(['view', 'cart', 'purchase'], 1000), 'product_id': np.random.randint(1, 50, 1000) }) # 生成时间特征 feature_engine = TimeFeatureGenerator(time_col='event_time') user_behavior = feature_engine.fit_transform(log_data) # 分析不同时段的转化率 purchase_rate = user_behavior[user_behavior['action']=='purchase'] \ .groupby('period')['action'].count() / \ user_behavior.groupby('period')['action'].count() print(purchase_rate.sort_values(ascending=False))

5.3 工业设备预测性维护案例

# 设备传感器数据 sensor_data = pd.DataFrame({ 'device_id': ['M001']*500 + ['M002']*500, 'timestamp': pd.date_range('2023-01-01', periods=1000, freq='H'), 'vibration': np.concatenate([ np.random.normal(5, 1, 400), np.random.normal(8, 1.5, 100), # M001正常到异常 np.random.normal(4.5, 0.8, 450), np.random.normal(7, 2, 50) # M002正常到异常 ]) }) # 生成特征 feature_engine = TimeFeatureGenerator(time_col='timestamp', value_col='vibration', group_col='device_id') device_features = feature_engine.fit_transform(sensor_data) # 分析连续运行时长的异常关联 device_features['running_hours'] = device_features.groupby('device_id')['time_since_last'].cumsum() anomaly_corr = device_features[device_features['vibration'] > 7] \ .groupby('running_hours').size() / \ device_features.groupby('running_hours').size() print("故障率与运行时长的相关性:", device_features['running_hours'].corr(device_features['vibration']))

6. 性能优化与注意事项

  1. 大数据量处理技巧

    # 使用Dask处理大型时间序列 import dask.dataframe as dd ddf = dd.from_pandas(large_df, npartitions=10) ddf['timestamp'] = dd.to_datetime(ddf['timestamp'])
  2. 特征选择建议

    • 优先选择与目标变量相关性高的时间特征
    • 避免高度线性相关的特征(如年、月、日同时使用)
    • 对周期性特征使用循环编码(sin/cos转换)
  3. 常见陷阱

    • 避免未来信息泄露(确保特征只使用历史数据)
    • 处理时间序列中的缺失值时保持时间顺序
    • 跨群体分析时注意时区统一问题

提示:当处理高频时间数据时,考虑将时间特征聚合到合适的业务粒度(如将秒级数据聚合成分钟级),这能显著提升特征稳定性同时降低计算开销。

http://www.jsqmd.com/news/1150479/

相关文章:

  • Scikit-learn 1.3+ 实战:K-means 与线性回归双模型分析森林火灾 517 条数据
  • Windows网络性能测试终极指南:iperf3完整下载与使用教程
  • 清华大学学位论文LaTeX模板终极指南:从零开始轻松完成学术排版
  • Lasso vs Ridge vs Elastic Net:3 种正则化回归在 sklearn 中的实战对比与选型指南
  • Trae IDE内嵌Fast Requests Pro:HTTP请求效率革命
  • 如何构建你的第二大脑:25个Obsidian模板打造Zettelkasten知识管理系统
  • 微信小程序反编译终极指南:5种高效方法掌握unveilr核心技术
  • CIFAR-10 图像分类:4种主流CNN架构(VGG16/ResNet18)在PyTorch 2.0下的性能基准测试
  • ComfyUI低显存工作流:单图生成3D模型的AI自动化实践
  • PyTorch 2.x GPU设备管理:3种指定方法与`.to(device)`性能对比
  • 数屿医械数据库实操:3步精准查询2023版二类医疗器械目录与变更
  • PyTorch 2.x 优化器实战:SGD/Adam/AdamW 在 ResNet-18 上的 3 种收敛曲线对比
  • 基于SpringBoot+Vue的大学生选修选课系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • 蓝速科技 RISC-V+ 鸿蒙终端:一机多场景信创改造实效评测
  • 路的形状。
  • AI音乐伴舞技术解析:从节奏识别到动作匹配的完整实现
  • AI视频风格转换:赛博朋克边缘行者风格本地部署实战指南
  • PyTorch多GPU环境排错:5个常见设备不匹配错误与解决方案
  • TensorFlow GPU 3 种安装方案对比:conda自动 vs pip手动 vs Docker,耗时与成功率实测
  • PyTorch 2.x 与 NumPy 互操作:3种转换方法的内存与性能实测对比
  • 数据预处理避坑指南:5个常见错误与Scikit-learn 1.5.0 正确实践
  • 百度Unlimited-OCR:长时域连续解析技术原理与实战指南
  • R(2+1)D 网络 PyTorch 复现:从 3D 卷积拆分到 Kinetics 数据集 82.3% 准确率
  • TensorFlow 2.21 CPU版 vs GPU版:3个关键场景下的性能与安装复杂度对比
  • WorkshopDL:三步搞定Steam创意工坊模组下载的终极解决方案
  • 计算机毕业设计之酒店多功能管理系统
  • 一文了解图像传感器的动态范围
  • Sklearn 与 Pandas 缺失值填充对比:KNNImputer vs 统计方法 3 维度评测
  • Proxmox VE 8.4 显卡直通实战:NVIDIA RTX 3090 单卡配置 8 步避坑指南
  • Halcon与OpenCV对比:工业视觉项目从算法到部署的5个关键决策点