-
Notifications
You must be signed in to change notification settings - Fork 7
/
graph.py
225 lines (208 loc) · 5.54 KB
/
graph.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
#!/usr/bin/python
#
# Social Network Analysis
# Author: Zeng Xi
# SID: 1010105140
# Email: [email protected]
from __future__ import division
import networkx as nx
#import matplotlib.pyplot as plt
created = 0;
def create():
import_nodes = raw_input('The file of nodes list:').strip()
import_edges = raw_input('The file of edges list:').strip()
try:
F1 = open(import_nodes)
except IOError, e:
print e
return
lines = F1.readlines()
lines = [line.split(': ') for line in lines]
nodes = [(int(line[0]),{'name':line[1].rstrip()}) for line in lines]
global G
G = nx.Graph()
G.add_nodes_from(nodes)
#print G.nodes()
#print G.node[12]['name']
try:
F2 = open(import_edges)
except IOError, e:
print e
return
lines = F2.readlines()
lines = [line.split(",") for line in lines]
lines = [(int(line[0]),int(line[1])) for line in lines]
G.add_edges_from(lines)
#print G.edges()
global created
created = 1
print "Graph created!"
F1.close()
F2.close()
def nodes():
if created == 0:
print 'No graph created!'
elif created == 1:
print G.number_of_nodes()
def edges():
if created == 0:
print 'No graph created!'
elif created == 1:
print G.number_of_edges()
def components():
if created == 0:
print 'No graph created!'
elif created == 1:
print 'There are ' + str(nx.number_connected_components(G)) + ' connected components in the graph.'
while True:
choice = raw_input('Do you want to print the size for each connected components?(y/n)').strip().lower()
choices = ['y','n']
if choice not in choices:
print('Input Error!')
else:
if choice == 'n':
break
elif choice == 'y':
f = open('components_size.txt','w')
for subgraphs in nx.connected_component_subgraphs(G):
print subgraphs.number_of_nodes()
print >> f, subgraphs.number_of_nodes()
print 'The above output is also saved in file components_size.txt'
f.close()
break
def cluster():
if created == 0:
print 'No graph created!'
elif created == 1:
try:
print 'The clustering coefficient for the whole graph is %0.4f.'%(nx.transitivity(G))
except nx.NetworkXError, e:
print e
def diameter():
if created == 0:
print 'No graph created!'
elif created == 1:
try:
print 'The network diameter is ' + str(nx.diameter(G)) + '.'
except nx.NetworkXError, e:
print e
while True:
choice = raw_input('Do you want to print the diameter of the largest connected component?(y/n)').strip().lower()
choices = ['y','n']
if choice not in choices:
print('Input Error!')
else:
if choice == 'n':
break
elif choice == 'y':
print nx.diameter(nx.connected_component_subgraphs(G)[0])
break
def degreedist():
if created == 0:
print 'No graph created!'
elif created == 1:
try:
dist = [histogram/G.number_of_nodes() for histogram in nx.degree_histogram(G)]
print dist
print 'The degree values are the index in the list.'
except nx.NetworkXError, e:
print e
def spathdist():
if created == 0:
print 'No graph created!'
elif created == 1:
try:
p = nx.all_pairs_shortest_path_length(G)
dic = {}
count = 0
for i in p.values():
for j in i.values():
count += 1
if j in dic:
dic[j] += 1
else:
dic[j] = 1
dist = []
for k in dic.values():
dist.append(k/count)
print dist
print 'The shortest path lengths are the index in the list.'
except nx.NetworkXError, e:
print e
def degreecentr():
if created == 0:
print 'No graph created!'
elif created == 1:
try:
degree = nx.degree_centrality(G)
f = open('degree_centrality.txt','w')
for nodes in degree.items():
print str(nodes[0]) + ': ' + str(int(round(nodes[1]*(G.number_of_nodes()-1))))
print >> f, str(nodes[0]) + ': ' + str(int(round(nodes[1]*(G.number_of_nodes()-1))))
f.close()
print 'The above output is also saved in file degree_centrality.txt'
except nx.NetworkXError, e:
print e
except IOError, d:
print d
def eigencentr():
if created == 0:
print 'No graph created!'
elif created == 1:
try:
centrality = nx.eigenvector_centrality(G)
f = open('eigenvector_centrality.txt','w')
for node in centrality:
print '%s: %0.2f'%(node,centrality[node])
print >> f, '%s: %0.4f'%(node,centrality[node])
f.close()
print 'The above output is also saved in file eigenvector_centrality.txt'
except nx.NetworkXError, e:
print e
except IOError, d:
print d
def showMenu():
title = '''
Social Network Analysis
create Create graph of network from file
nodes n: # of nodes
edges m: # of edges
components size of the connected components
cluster clustering coefficient
diameter network diameter
degreedist degree distribution
spathdist shortest path length distribution
degreecentr degree centrality
eigencentr eigenvector centrality
quit Quit
Enter choice:'''
while True:
choice = raw_input(title).strip().lower()
choices = ['create','nodes','edges','components','cluster','diameter','degreedist','spathdist','degreecentr','eigencentr','quit']
if choice not in choices:
print('Input Error!')
else:
if choice == 'quit':
break
elif choice == 'create':
create()
elif choice == 'nodes':
nodes()
elif choice == 'edges':
edges()
elif choice == 'components':
components()
elif choice == 'cluster':
cluster()
elif choice == 'diameter':
diameter()
elif choice == 'degreedist':
degreedist()
elif choice == 'spathdist':
spathdist()
elif choice == 'degreecentr':
degreecentr()
elif choice == 'eigencentr':
eigencentr()
if __name__ == '__main__':
showMenu()