I am a very, very mediocre programmer, but I still aim to use the igraph python library to determine the effect of a user’s centrality in a given forum to predict his later contributions to that forum.
I got in touch with someone else who used the NetworkX library to do something similar, but given the current size of the forum, calculating exact centrality indices is virtually impossible–it just takes too much time.
This was his code though:
import networkx as netx
import sys, csv
if len(sys.argv) is not 2:
print 'Please specify an input graph.'
sys.exit(1)
ingraph = sys.argv[1]
graph = netx.readwrite.gpickle.read_gpickle(ingraph)
num_nodes = len(graph.nodes())
print '%s nodes found in input graph.' % num_nodes
print 'Recording data in centrality.csv'
# Calculate all of the betweenness measures
betweenness = netx.algorithms.centrality.betweenness_centrality(graph)
print 'Betweenness computations complete.'
closeness = netx.algorithms.centrality.closeness_centrality(graph)
print 'Closeness computations complete.'
outcsv = csv.writer(open('centrality.csv', 'wb'))
for node in graph.nodes():
outcsv.writerow([node, betweenness[node], closeness[node]])
print 'Complete!'
I tried to write something similar with the igraph library (which allows to make quick estimates rather than exact calculations), but I cannot seem to write data to a CSV file.
My code:
import igraph
import sys, csv
from igraph import *
graph = Graph.Read_Pajek("C:\karate.net")
print igraph.summary(graph)
estimate = graph.betweenness(vertices=None, directed=True, cutoff=2)
print 'Betweenness computation complete.'
outcsv = csv.writer(open('estimate.csv', 'wb'))
for v in graph.vs():
outcsv.writerow([v, estimate[vs]])
print 'Complete!'
I can’t find how to call individual vertices (or nodes, in NetworkX jargon) in the igraph documentation, so that’s where I am getting error messages). Perhaps I am forgetting something else as well; I am probably too bad a programmer to notice 😛
What am I doing wrong?
As you already noticed, individual vertices in igraph are accessed using the
vsattribute of your graph object.vsbehaves like a list, so iterating over it will yield the vertices of the graph. Each vertex is represented by an instance of theVertexclass, and the index of the vertex is given by itsindexattribute. (Note that igraph uses continuous numeric indices for both the vertices and the edges, so that’s why you need theindexattribute and cannot use your original vertex names directly).I presume that what you need is the name of the vertex that was stored originally in your input file. Names are stored in the
nameoridvertex attribute (depending on your input format), so what you need is probably this:Note that vertex attributes are accessed by indexing the vertex object as if it was a dictionary. An alternative is to use the
vsobject directly as a dictionary; this will give you a list containing the values of the given vertex attribute for all vertices. E.g.:An even faster version using generator expressions: