我正在使用python的NetworkX软件包,我希望在给定文本文件中的节点属性的情况下获取网络的协同系数。
我有两个制表符分隔的文件: (1)属性文件:在第一列中有节点的名称;在第二列中这些节点的来源。像这样:
11264 E
9410 E
2746 R
7432 R
8424 E
(2)边缘文件:网络本身,其中两个第一列是有边缘的节点,第三列是来自爆炸的标识的百分比;第四列是这两个序列之间的相互覆盖。
4275 5402 97.04 97.83
6268 6338 98.49 100.0
2175 2178 99.26 100.0
4461 4777 97.06 98.55
11882 4129 98.4 100.0
因此,在我的代码中,我为属性文件创建了一个字典,因此每个节点都有一个值,即" E"或" R"。当我根据这个字典计算出这种混淆时,会弹出这个错误:
RuntimeWarning: invalid value encountered in true_divide
r=(t-s)/(1-s)
nan
我已经检查过,我知道它必须是除以0或NA相关的东西,但我无法弄清楚原因。
这是我的代码:
import networkx as nx
origin = {}
infile=open("attrib_file.tsv","r")
for line in infile:
t = line[:-1].split("\t")
origin[t[0]] = t[1]
infile.close()
G = nx.Graph()
G = nx.read_edgelist("edge_file.tsv", delimiter="\t", data=(('ID',float),('Coverage', float)), encoding='utf-8')
print(nx.attribute_assortativity_coefficient(G, 'origin'))
我正在使用python 3.5.1和networkx 1.11
任何帮助将不胜感激!谢谢!
答案 0 :(得分:0)
正如您在评论中提到的,dict
属性可能存在问题。
在这里,我使用的是python 3.6和networkx 2.1。
import networkx as nx
import pandas as pd
import matplotlib.pyplot as plt
attr_file = pd.read_clipboard()
attr_file
[OUT]:
name origin
0 11264 E
1 9410 E
2 2746 R
3 7432 R
4 8424 E
我改变了你给的样品:
edge_list = pd.read_clipboard()
edge_list
[OUT]:
n1 n2 percent coverage
0 11264 9410 97.04 97.83
1 9410 2746 98.49 100.00
2 11264 2178 99.26 100.00
3 9410 8424 97.06 98.55
4 7432 2746 98.40 100.00
G = nx.Graph()
for i,node in attr_file.iterrows():
G.add_node(node['name'], origin=node['origin'])
G.nodes(data=True)
[OUT]:
NodeDataView({11264: {'origin': 'E'}, 9410: {'origin': 'E'}, 2746: {'origin': 'R'}, 7432: {'origin': 'R'}, 8424: {'origin': 'E'}})
for i, edge in edge_list.iterrows():
G.add_edge(edge.n1, edge.n2, percent=edge.percent, coverage=edge.coverage)
nx.attribute_assortativity_coefficient(G, 'origin')
[OUT]:
0.2592592592592593