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

如何基于多特征/变量创建节点间边构建关联网络(Python/R实现)

基于共享特征的关联网络构建方案(Python)

这个需求本质是带传递性的连通分量查找问题,用*并查集(Union-Find)*结构实现效率最高,不需要暴力遍历所有节点对计算关联,支持多字段共享自动连边、跨节点传递关联的规则,和描述的人员分组场景逻辑完全一致。

核心规则适配

  • 单条交易记录作为1个网络节点
  • 只要两条记录共享「邮箱/手机号/document ID/城市」中任意一个非空字段值,就判定为存在关联
  • 自动处理传递性关联:A和B共享特征、B和C共享特征,A/B/C自动归为同一关联网络
  • 无任何共享属性的节点自动划分为独立分组

完整实现代码

import pandas as pd
from collections import defaultdict

# 并查集结构,支持百万级数据快速计算
class UnionFind:
    def __init__(self, size):
        self.parent = list(range(size))
        self.rank = [0] * size
    
    def find(self, x):
        # 路径压缩,提升查询效率
        if self.parent[x] != x:
            self.parent[x] = self.find(self.parent[x])
        return self.parent[x]
    
    def union(self, x, y):
        # 按秩合并,避免树结构过深
        x_root = self.find(x)
        y_root = self.find(y)
        if x_root == y_root:
            return
        if self.rank[x_root] < self.rank[y_root]:
            self.parent[x_root] = y_root
        else:
            self.parent[y_root] = x_root
            if self.rank[x_root] == self.rank[y_root]:
                self.rank[x_root] += 1

# ---------- 配置区,替换为你的实际数据即可 ----------
# 读取你的交易数据集,注意每条记录需要有唯一的行索引作为节点ID
df = pd.read_csv("你的交易数据路径.csv")
# 指定需要参与匹配的特征字段,可按需增减
match_columns = ["邮箱", "手机号", "document ID", "城市"]

# ---------- 关联计算逻辑 ----------
uf = UnionFind(len(df))

for col in match_columns:
    feature_group = defaultdict(list)
    # 聚合同特征值对应的所有节点ID,跳过空值避免误匹配
    for node_id, feature_val in df[col].items():
        if pd.notna(feature_val):
            feature_group[feature_val].append(node_id)
    # 将同特征值下的所有节点合并到同一集合
    for nodes in feature_group.values():
        base_node = nodes[0]
        for node in nodes[1:]:
            uf.union(base_node, node)

# 为每条记录打上关联组ID
df["关联网络ID"] = [uf.find(node_id) for node_id in df.index]

# 如需导出边表用于Gephi等网络分析工具,可取消下方注释,小数据量适用
# edge_list = []
# for group_id, group_df in df.groupby("关联网络ID"):
#     nodes = group_df.index.tolist()
#     for i in range(len(nodes)):
#         for j in range(i+1, len(nodes)):
#             edge_list.append((nodes[i], nodes[j]))
# edge_df = pd.DataFrame(edge_list, columns=["source", "target"])

# 输出结果
print(df[["交易ID", "关联网络ID"]])

注意事项

  • 代码默认跳过空特征值,避免大量空值把无关记录错误关联到同一组
  • 算法时间复杂度接近线性,十万级交易数据可秒级出结果,百万级数据也能在数分钟内跑完
  • 输出的关联网络ID相同的记录,即属于同一个连通网络,和举例的跨特征传递分组规则完全匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:45:38