You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python高效分箱:按用户ID统计每周时段事件数优化

高效实现用户周行为时段统计(Pandas/Numpy矢量化方案)

针对你的35000用户、300万条两年跨度事件数据集,要按用户ID汇总事件覆盖的每周时段计数,替代耗时18-90分钟且易出错的循环方法,以下是基于Pandas/Numpy的矢量化高效实现方案:

数据样例与预处理

先定义符合真实结构的样例数据,完成基础预处理:

import pandas as pd
import numpy as np

# 模拟真实数据结构
data = pd.DataFrame({
    'userId': ['user001', 'user001', 'user002'],
    'startTime': ['2023-01-02 09:30:00', '2023-01-07 23:15:00', '2023-01-03 14:00:00'],
    'endTime': ['2023-01-02 10:45:00', '2023-01-08 00:30:00', '2023-01-03 14:00:00']
})

# 转换时间格式,计算周内时段(按小时拆分,周一0点=0,周日23点=167)
data['startTime'] = pd.to_datetime(data['startTime'])
data['endTime'] = pd.to_datetime(data['endTime'])
data['start_hour_of_week'] = data['startTime'].dt.dayofweek * 24 + data['startTime'].dt.hour
data['end_hour_of_week'] = data['endTime'].dt.dayofweek * 24 + data['endTime'].dt.hour

核心高效实现逻辑

核心是矢量化拆分每个事件覆盖的所有时段,完全避免Python层面的逐用户循环:

  1. 处理跨天/跨周事件,生成每个事件覆盖的完整时段序列
  2. 按用户ID+时段分组计数
  3. 重塑为标准的用户-时段计数数组(缺失时段自动补0)

完整代码实现

def expand_time_range(row):
    """生成单个事件覆盖的所有周内时段,处理跨周边界"""
    start = row['start_hour_of_week']
    end = row['end_hour_of_week']
    if start <= end:
        return np.arange(start, end + 1)
    else:
        # 跨周时拆分两段:从start到周日23点,再从周一0点到end
        return np.concatenate([np.arange(start, 168), np.arange(0, end + 1)])

# 矢量化展开所有时段,拆分为每行对应一个用户-时段的记录
expanded_data = data.assign(
    hour_of_week=data.apply(expand_time_range, axis=1)
).explode('hour_of_week').astype({'hour_of_week': int})

# 分组计数,确保所有168个时段都被统计(缺失时段补0)
hour_counts = expanded_data.groupby(['userId', 'hour_of_week']).size().unstack(fill_value=0)
all_hours = np.arange(168)
hour_counts = hour_counts.reindex(columns=all_hours, fill_value=0)

# 转换为最终的用户-时段计数数组(形状:(35000, 168))
user_week_pattern = hour_counts.values

预期输出说明

  • hour_counts:DataFrame格式,索引为用户ID,列是0-167的周内小时时段,值为对应时段的事件覆盖次数
  • user_week_pattern:Numpy数组,每行对应一个用户的168维周行为计数,可直接用于可视化或建模

效率与异常修复说明

  • 所有操作基于Pandas/Numpy的C底层实现,300万数据处理时间可控制在5-15分钟(取决于硬件配置)
  • 自动处理跨天、跨周的边界事件,解决原循环方法的结果异常问题
  • 若需更细粒度的时段(如15分钟间隔,共672个时段),只需修改时段计算逻辑(例如dayofweek*24*4 + hour*4 + minute//15),核心代码无需调整

内容的提问来源于stack exchange,提问作者ciaran haines

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 06:33:09