如何基于包含网页访问步骤的DataFrame计算页面转移概率矩阵
解决方案
核心思路
- 先把宽格式的会话步骤表转为(源页面,目标页面)的连续访问二元组,确保统计范围不会跨会话
- 按需过滤指定源页面后,再统计转移次数和概率,避免不必要的全量计算
- 最后通过透视表生成你需要的行(源页面)×列(所有目标页面)的转移概率矩阵
代码实现
import pandas as pd # 预处理:提取所有连续访问页面对,仅需执行一次 step_cols = [f"step{i}" for i in range(1, 31)] pairs = [] for _, row in df_raw.iterrows(): # 过滤当前会话不足30步的空值,保留实际访问路径 valid_steps = [row[col] for col in step_cols if pd.notna(row[col])] # 生成连续的(当前页,下一页)二元组 for i in range(len(valid_steps) - 1): pairs.append((valid_steps[i], valid_steps[i+1])) pair_df = pd.DataFrame(pairs, columns=["source_page", "target_page"]) # 生成转移矩阵的通用方法,支持指定源页面 def get_transition_matrix(source_pages: list = None): # 传入指定源页面时先过滤,减少后续计算量 filtered_pairs = pair_df if source_pages is None else pair_df[pair_df["source_page"].isin(source_pages)] # 统计每个源-目标对的访问次数 count_df = filtered_pairs.groupby(["source_page", "target_page"]).size().reset_index(name="visit_count") # 计算每个源页面的总流出次数 count_df["total_out"] = count_df.groupby("source_page")["visit_count"].transform("sum") # 计算转移概率 count_df["prob"] = count_df["visit_count"] / count_df["total_out"] # 转为宽表矩阵,无跳转记录的概率填0 transition_matrix = count_df.pivot( index="source_page", columns="target_page", values="prob" ).fillna(0) return transition_matrix
使用示例
# 生成指定5个源页面的5×3000小规模矩阵 custom_matrix = get_transition_matrix(source_pages=["首页", "商品列表页", "商品详情页", "购物车", "结算页"]) # 全量3000×3000矩阵生成,直接不传参数即可 # full_matrix = get_transition_matrix()
算力说明
- 小规模矩阵计算仅需过滤对应源页面的二元组统计,算力消耗可忽略
- 全量3000×3000矩阵计算无压力:哪怕是100万条会话,最多仅生成2900万条二元组数据,普通配置机器用pandas即可在几秒内完成计算
内容的提问来源于stack exchange,提问作者S44
相关产品推荐
相关产品推荐

