使用Pandas选择、切片及聚合时序数据的问题求助
用Pandas为点击预测构建IP时序行为特征
没问题,这在点击预测的特征工程里是非常关键的一步——通过时间窗口聚合IP的过往行为,能有效捕捉用户的点击模式。我帮你一步步实现,结合你的样本数据来讲解:
第一步:预处理时序数据
首先得确保时间字段是可处理的datetime类型,并且数据按IP和时间排序(这对窗口聚合至关重要):
import pandas as pd # 你的样本数据 data = { 'index': [0, 1, 2, 3, 4], 'ip': [29540, 26777, 140926, 69375, 119166], 'app': [3, 11, 12, 2, 9], 'dev': [1, 1, 1, 1, 2], 'os': [42, 25, 13, 19, 15], 'channel': [489, 319, 140, 377, 445], 'click_time': ['2017-11-08 03:57:46', '2017-11-09 11:02:14', '2017-11-07 04:36:14', '2017-11-09 13:17:20', '2017-11-07 12:11:37'] } df = pd.DataFrame(data) # 转换时间字段为datetime类型 df['click_time'] = pd.to_datetime(df['click_time']) # 按IP和点击时间排序,保证每个IP的行为按时间顺序排列 df = df.sort_values(by=['ip', 'click_time'])
第二步:构建时间窗口聚合特征
核心思路是按IP分组,然后对每个分组使用**时间滚动窗口(rolling)**来聚合过往行为。这里分两种常见场景:
场景1:统计固定时长窗口内的过往点击次数
比如统计每个IP在当前点击前24小时内的总点击数(排除当前点击,只算过往行为):
# 按IP分组,滚动窗口设为24小时,统计点击次数,然后shift(1)排除当前点击 df['ip_24h_past_clicks'] = df.groupby('ip')['click_time'].rolling('24H').count().shift(1).reset_index(level=0, drop=True) # 填充首次点击的NaN值(首次点击没有过往行为,所以设为0) df['ip_24h_past_clicks'] = df['ip_24h_past_clicks'].fillna(0).astype(int)
场景2:扩展其他时序特征
除了点击次数,你还可以聚合其他维度的行为,比如:
- 过去1小时内的唯一App数量
- 过去7天内的平均点击间隔
示例代码:
# 过去1小时内的唯一App数量(排除当前点击) df['ip_1h_unique_apps'] = df.groupby('ip')['app'].rolling('1H').nunique().shift(1).reset_index(level=0, drop=True).fillna(0).astype(int) # 过去3天内的点击时间间隔均值(需要先计算相邻点击的时间差) # 先计算每个IP的相邻点击间隔 df['time_since_last_click'] = df.groupby('ip')['click_time'].diff().dt.total_seconds() # 再滚动窗口统计均值 df['ip_3d_avg_interval'] = df.groupby('ip')['time_since_last_click'].rolling('3D').mean().shift(1).reset_index(level=0, drop=True).fillna(0)
关键注意事项
- 窗口边界:
rolling('24H')表示从当前时间往前推24小时的窗口,shift(1)是为了排除当前点击(如果不需要排除,可以去掉shift) - 性能优化:如果数据量极大(千万级以上),可以考虑用
pd.Grouper按时间分桶后再聚合,或者使用Dask等分布式工具 - 时间粒度:可以根据业务需求调整窗口大小,比如'1H'(1小时)、'7D'(7天)等,支持的时间偏移量可参考Pandas内置的时间频率规则
用你的样本数据运行后,结果会类似这样(以ip_24h_past_clicks为例):
因为你的样本里每个IP都只有1次点击,所以所有值都是0;如果同一个IP有多次点击且在24小时窗口内,就会显示对应的次数。
内容的提问来源于stack exchange,提问作者Propanon
相关产品推荐
相关产品推荐

