|
| 1 | +import networkx as nx |
| 2 | +import pandas as pd |
| 3 | +from pyvis import network as net |
| 4 | + |
| 5 | +df = pd.read_excel('./doc/1_evidence.xls') |
| 6 | +df = df.loc[:, ['id','name','invite_id','invited_id']] |
| 7 | +df.columns = ['id','title','to', 'from'] |
| 8 | + |
| 9 | +G = nx.from_pandas_edgelist(df, 'from', 'to', create_using=nx.DiGraph()) |
| 10 | + |
| 11 | +# 找到根节点 |
| 12 | +top_node = [] |
| 13 | +for node, degrees in G.in_degree(): |
| 14 | + if degrees == 0: |
| 15 | + top_node.append(node) |
| 16 | +print('Big Boss:', top_node) |
| 17 | + |
| 18 | +# 设置所有节点级别 |
| 19 | +l = nx.shortest_path_length(G, 100000) |
| 20 | +nx.set_node_attributes(G, l, 'level') |
| 21 | + |
| 22 | +# 计算每级人员数目 |
| 23 | +data = {} |
| 24 | +for node, level in l.items(): |
| 25 | + if level in data.keys(): |
| 26 | + data[level].append(node) |
| 27 | + else: |
| 28 | + data[level] = [node] |
| 29 | +for level, nodes in data.items(): |
| 30 | + print(level, len(nodes)) |
| 31 | + |
| 32 | +# 添加颜色 |
| 33 | +for node in G.nodes: |
| 34 | + G.nodes[node]['title'] = str(node) |
| 35 | + level = G.nodes[node]['level'] |
| 36 | + |
| 37 | + if level == 0: |
| 38 | + G.nodes[node]['color'] = 'red' |
| 39 | + elif level == 1: |
| 40 | + G.nodes[node]['color'] = 'orange' |
| 41 | + elif level == 2: |
| 42 | + G.nodes[node]['color'] = 'yellow' |
| 43 | + |
| 44 | +# 给下线前十的目标添加颜色 |
| 45 | +degrees = G.out_degree() |
| 46 | +top_nodes = sorted(degrees, key=lambda x: x[1], reverse=True)[:10] |
| 47 | +print(top_nodes) |
| 48 | + |
| 49 | +for node in top_nodes: |
| 50 | + G.nodes[node[0]]['color'] = 'green' |
| 51 | + |
| 52 | +nt = net.Network('960px', '1280px', directed=True) |
| 53 | +nt.from_nx(G) |
| 54 | +nt.show('1_evidence.html') |
| 55 | + |
0 commit comments