使用pandas基于多规则为用户操作日志生成session ID
多规则会话ID生成实现方案
你原有代码仅覆盖了同用户5分钟超时的单一切分逻辑,未覆盖全部三个新会话触发规则,可按以下步骤实现符合要求的SessionID生成逻辑:
核心判定规则
满足任意一条规则时,当前操作记录即为新会话的起点:
- 全局相邻两条操作日志时间间隔超过5分钟(全平台连续5分钟无任何操作时,后续所有操作开启新会话)
- 同一用户当前操作距自身上一次操作的时间间隔超过30秒
- 当前操作的
user_req字段内容精确匹配*205#
实现代码
import pandas as pd # 1. 基础预处理:确保时间字段格式正确、日志按时间升序排列 df['log_datetime'] = pd.to_datetime(df['log_datetime']) df = df.sort_values(by='log_datetime').reset_index(drop=True) # 2. 逐个生成新会话触发标记 # 全局5分钟无操作标记 cond_global_5min_timeout = df['log_datetime'].diff().gt(pd.Timedelta('5T')) # 同用户30秒无操作标记 cond_user_30s_timeout = df.groupby('user_id')['log_datetime'].diff().gt(pd.Timedelta('30S')) # *205#请求触发标记 cond_dial_trigger = df['user_req'].eq('*205#') # 3. 合并所有触发条件,按用户维度累加生成会话ID new_session_mask = cond_global_5min_timeout | cond_user_30s_timeout | cond_dial_trigger df['SessionID'] = new_session_mask.groupby(df['user_id']).cumsum() + 1
可选调整
- 如果需要全局唯一的SessionID(而非单用户维度从1开始计数),可拼接用户ID与会话序号:
df['SessionID'] = df['user_id'].astype(str) + '_sess_' + df['SessionID'].astype(str) - 如果
user_req字段存在冗余空格、特殊字符,匹配前先做清洗:df['user_req'] = df['user_req'].str.strip() - 所有时间计算依赖日志的时间顺序,禁止跳过排序步骤,否则间隔计算结果会完全错误。
内容的提问来源于stack exchange,提问作者N K
相关产品推荐
相关产品推荐

