文章来源:
小福
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至405936398@qq.com举报,一经查实,本站将立刻删除。
# -*- coding:utf-8 -*-import networkx as nximport pandas as pdfrom pyvis.network import Networkif __name__ == '__main__': # 读取流水数据 df_trade = pd.read_excel(r'C:\Users\wuchao\Desktop\test.xls',converters={'转账日期':str}) # 交易是有方向的 按照方向提取数据生成图 转入转出分别生成有向图digraph G1 = nx.from_pandas_edgelist(df_trade.loc[df_trade['转出转入标志']=='转出'], source='客户名称',target='对方客户名称', edge_attr=['转账日期','转账金额'], create_using=nx.MultiDiGraph()) G2 = nx.from_pandas_edgelist(df_trade.loc[df_trade['转出转入标志']=='转入'], source='对方客户名称',target='客户名称', edge_attr=['转账日期','转账金额'], create_using=nx.MultiDiGraph()) # 合并两个子图 G = nx.compose(G1,G2) # 计算点的 中介中心性(Betweeness Centrality) betweenness = nx.load_centrality(G) # 取中介中心性最大的5个点 print(sorted(betweenness.items(),key = lambda x:x[1],reverse=True)[0:5]) # 转为dict存储 后续用于可视化设置点大小 keynodesdict = dict(sorted(betweenness.items(),key = lambda x:x[1],reverse=True)[0:5]) # 定义用于存储最短路径中边的list # 后续用于标注路径中这些边的颜色 specEdges = [] # 计算点和其他点的路径长度 pathlen = dict(nx.shortest_path_length(G)) # 找出以'N0','N1'为源头的路径中最长的路径 for node in ['N0','N1']: for k,v in pathlen[node].items(): # 找出路径中最长的路径 if (v==max(pathlen[node].values())): # 找到最远的目标点,然后将源头和目标点之间的最短路径都提取出来 # 没有考虑日期因素 for p in nx.all_simple_edge_paths(G,source=node,target=k): for i in range(0,len(p)-1): e1 = p[i] e2 = p[i+1] e1_date = (G.get_edge_data(e1[0],e1[1])[e1[2]]['转账日期']) e2_date = (G.get_edge_data(e2[0],e2[1])[e2[2]]['转账日期']) # 考虑日期因素 # 如果后一手的转账日期小于前一手 则路径就到当前为止 if e1_date>e2_date: p = p[0:i+1] break # 显示有效路径 并存入最短路径list print(p) specEdges = specEdges + p # 不同的路径中 边有重复 去重 specEdges = list(set(specEdges)) net = Network(height='800px', width='800px', directed=True, heading='资金网络') # 由于两点之间有多条边 必须设置参数 opts = '''var options = {"physics": {"minVelocity": 0.5,"solver": "forceAtlas2Based"}}''' net.set_options(opts) # 边的标签设置为转账日期 for edge in G.edges(data=True): edge[2]['label'] = edge[2]['转账日期']# 边的光标悬停提示设置为转账金额 for edge in G.edges(data=True): edge[2]['title'] = str(edge[2]['转账金额'])+'元'# 根据点中介度大小设置点的尺寸 for k,v in keynodesdict.items(): G.nodes[k]['size']=10*(v/min(keynodesdict.values()))# 根据点中介度大小设置最大三个点为红色 for k,v in list(keynodesdict.items())[0:3]: G.nodes[k]['color']='red'# 将找出来的边标注为红色 for edge in specEdges: G.edges[edge]['color']='red' net.from_nx(G)#输出并生成demo2.html net.show('资金可视化追踪.html')
转载:https://www.shangyexinzhi.com/article/5089895.html
转载:http://sjj.jingzhou.gov.cn/sjzc/sjlt/202210/t20221025_790922.shtml