2014-05-20 20 views
1

我使用NetworkX爲大型網絡計算4個單獨的中心性度量標準,現在我想將結果寫入CSV文件。我不想寫對4個指標的一個CSV文件,但寧願有類似如下:NetworkX - 將結果寫入CSV以實現多種測量

Id, degree, between, close, eigen 

1, 0.4, 0.0, 0.5, 0.45 

2, 0.4, 0.0, 0.5, 0.45 

3, 0.6, 0.6, 0.71, 0.58 

4, 0.6, 0.7, 0.71, 0.47 

5, 0.2, 0.0, 0.45, 0.18 

6, 0.2, 0.0, 0.45, 0.18 

下面是我的代碼顯示什麼我迄今所做的:

import networkx as nx 
G = nx.Graph() 

# add nodes and edges 
G.add_edges_from([(1,2),(1,3),(2,3),(3,4),(4,5),(4,6)]) 

# calculate centrality metrics  
degree = nx.degree_centrality(G) 
between = nx.betweenness_centrality(G) 
close = nx.closeness_centrality(G) 
eigen = nx.eigenvector_centrality(G) 

回答

1

您可以並行迭代字典。

首先,將每個字典的(key, value)元組列表,排序上的按鍵:

degree = sorted(degree.items()) 
between = sorted(between.items()) 
close = sorted(close.items()) 
eigen = sorted(eigen.items()) 

接下來,創建一個並行迭代:

p = zip(degree, between, close, eigen) 

現在,p是:

[((1, 0.4), (1, 0.0), (1, 0.5), (1, 0.45698629803118)), 
((2, 0.4), (2, 0.0), (2, 0.5), (2, 0.45698629803118)), 
((3, 0.6000000000000001), 
    (3, 0.6000000000000001), 
    (3, 0.7142857142857143), 
    (3, 0.5842167062067959)), 
((4, 0.6000000000000001), 
    (4, 0.7000000000000001), 
    (4, 0.7142857142857143), 
    (4, 0.4171170012545873)), 
((5, 0.2), (5, 0.0), (5, 0.45454545454545453), (5, 0.1830727919118216)), 
((6, 0.2), (6, 0.0), (6, 0.45454545454545453), (6, 0.1830727919118216))] 

現在,遍歷p的每一行:

for row in p: 
    this_keys, this_values = zip(*row) 
    assert len(set(this_keys)) == 1 # make sure we got what we expected 
    this_key = this_keys[0] 
    # Now, this_key is the key and this_values is a tuple of values 
    print this_key, ['%.2f' % v for v in this_values] 

輸出是:

1 ['0.40', '0.00', '0.50', '0.46'] 
2 ['0.40', '0.00', '0.50', '0.46'] 
3 ['0.60', '0.60', '0.71', '0.58'] 
4 ['0.60', '0.70', '0.71', '0.42'] 
5 ['0.20', '0.00', '0.45', '0.18'] 
6 ['0.20', '0.00', '0.45', '0.18'] 

現在,而不是打印,可以將它們保存到一個CSV文件。

1

我發現了一個簡單的答案,它將在單行上打印一個節點的多個度量的結果。

## calculate centrality metrics: 
degree = nx.degree_centrality(G) 
between = nx.betweenness_centrality(G) 
close = nx.closeness_centrality(G) 
eigen = nx.eigenvector_centrality(G) 

## print the multiple centrality metrics to a single line for each node: 
for n in G: 
    print ("%d, %f, %f, %f, %f"%(n, degree[n], between[n], close[n], eigen[n]))