AttributeError: 'NoneType' object has no attribute 'render'
这个错误的意思是什么呢?是错在哪个方向呢?
AttributeError Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_5180\339058624.py in <module>
71
72 #输出并生成demo2.html
---> 73 net.show('C:\\Users\\Desktop\\资金可视化追踪.html')
D:\mac\lib\site-packages\pyvis\network.py in show(self, name, local, notebook)
544 print(name)
545 if notebook:
--> 546 self.write_html(name, open_browser=False,notebook=True)
547 else:
548 self.write_html(name, open_browser=True)
D:\mac\lib\site-packages\pyvis\network.py in write_html(self, name, local, notebook, open_browser)
513 getcwd_name = name
514 check_html(getcwd_name)
--> 515 self.html = self.generate_html(notebook=notebook)
516
517 if self.cdn_resources == "local":
D:\mac\lib\site-packages\pyvis\network.py in generate_html(self, name, local, notebook)
477 physics_enabled = self.options.physics.enabled
478
--> 479 self.html = template.render(height=height,
480 width=width,
481 nodes=nodes,
AttributeError: 'NoneType' object has no attribute 'render'
源代码如下:
```python
import pandas as pd
import networkx as nx
from pyvis.network import *
# 读取Excel表格
df_trade = pd.read_excel('C:\\Users\\Desktop\\kk.xlsx',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)
for edge in G.edges(data=True):
edge[2]['title'] = str(edge[2]['转账金额'])
# 计算点的 中介中心性(Betweeness Centrality)
betweenness = nx.load_centrality(G)
# 取中介中心性最大的2个点
print(sorted(betweenness.items(),key = lambda x:x[1],reverse=True)[0:2])
# 转为dict存储 后续用于可视化设置点大小
keynodesdict = dict(sorted(betweenness.items(),key = lambda x:x[1],reverse=True)[0:2])
specEdges = []
# 计算点和其他点的路径长度
pathlen = dict(nx.shortest_path_length(G))
# 找出以'N0','N1'为源头的路径中最长的路径
for node in ['A','B']:
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))
# 初始化pyvis网络图
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('net.html')
```