如何使用Python NetworkX将重复边缘解析为加权网络?
我写了一些代码,目的是从一个.txt文件中导入一些Twitter关系数据的边列表。这个数据是有方向的,并且包含重复的值。我想把这些数据加载到一个DiGraph()
中,并且希望能把边的权重也包含进去,但我不知道该怎么做。我在想是不是可以用Counter()
来计算重复的边,但我不太确定怎么把这个计数结果放到图里。
我还附上了一个.txt文件的示例,以便展示我的数据是什么样的。
示例 .txt 数据
# twitter data
# retrieved at: 07.08.2014
# total number of records: 8
# exported by: userXYZ
#
# fields: date, time, source, target
10.12.2013; 02:00; tweeterA; tweeterB
10.12.2013; 02:01; tweeterB; tweeterC
10.13.2013; 02:04; tweeterC; tweeterA
10.13.2013; 02:08; tweeterC; tweeterA
10.13.2013; 02:10; tweeterD; tweeterB
10.13.2013; 02:11; tweeterA; tweeterC
10.13.2013; 02:13; tweeterC; tweeterB
10.13.2013; 02:18; tweeterA; tweeterD
现有代码
import networkx as nx
header = ['date', 'time', 'source', 'target']
data = [{key: value for (key, value) in zip(header, line.strip().split('; '))} for line in open('data.txt') if not line.startswith('#')]
edgelist = []
for i in data:
edgelist.append(" ".join([
i['source'],
i['target']]))
G = nx.parse_edgelist(edgelist,create_using=nx.DiGraph())
nx.draw(G)
1 个回答
2
你已经很接近答案了,我觉得可以使用 collections.Counter()
。接下来,你需要把每条边的权重和它们关联起来,方法是将权重设置为一个数据属性。
from collections import Counter
import networkx as nx
edge_counts = Counter((' '.join(line.strip().split('; ')[2:]) for line in open('data.txt') if not line.startswith('#')))
G = nx.parse_edgelist(('%s %d' % edge for edge in edge_counts.items()),
data=(('weight',int),),
create_using=nx.DiGraph())
# nx.draw(G)
from pprint import pprint
pprint(sorted(G.edges(data=True)))
这样应该能给你这个输出:
[('tweeterA', 'tweeterB', {'weight': 1}),
('tweeterA', 'tweeterC', {'weight': 1}),
('tweeterA', 'tweeterD', {'weight': 1}),
('tweeterB', 'tweeterC', {'weight': 1}),
('tweeterC', 'tweeterA', {'weight': 2}),
('tweeterC', 'tweeterB', {'weight': 1}),
('tweeterD', 'tweeterB', {'weight': 1})]