#!/usr/bin/env python """ Davis Southern Club Women Shows how to make unipartite projections of the graph and compute the properties of those graphs. These data were collected by Davis et al in the 1930s. They represent observed attendance at 14 social events by 18 Southern women. The graph is bipartite (clubs, women). Data from: http://vlado.fmf.uni-lj.si/pub/networks/data/Ucinet/UciData.htm """ __author__ = """Aric Hagberg (hagberg@lanl.gov)""" __date__ = "$Date: 2005-05-12 14:33:11 -0600 (Thu, 12 May 2005) $" __credits__ = """""" __revision__ = "$Revision: 998 $" # Copyright (C) 2004 by # Aric Hagberg # Dan Schult # Pieter Swart # Distributed under the terms of the GNU Lesser General Public License # http://www.gnu.org/copyleft/lesser.html import string import networkx as NX def davis_club_graph(create_using=None, **kwds): nwomen=14 nclubs=18 G=NX.generators.empty_graph(nwomen+nclubs,create_using=create_using,**kwds) G.clear() G.name="Davis Southern Club Women" women="""\ EVELYN LAURA THERESA BRENDA CHARLOTTE FRANCES ELEANOR PEARL RUTH VERNE MYRNA KATHERINE SYLVIA NORA HELEN DOROTHY OLIVIA FLORA""" clubs="""\ E1 E2 E3 E4 E5 E6 E7 E8 E9 E10 E11 E12 E13 E14""" davisdat="""\ 1 1 1 1 1 1 0 1 1 0 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 1 1 0 0 0 0 0 1 1 0 1 1 1 1 1 1 0 0 0 0 0 0 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0""" # women names w={} n=0 for name in string.split(women,'\n'): w[n]=name n+=1 # club names c={} n=0 for name in string.split(clubs,'\n'): c[n]=name n+=1 # parse matrix row=0 for line in string.split(davisdat,'\n'): thisrow=map(int,string.split(line,' ')) for col in range(0,len(thisrow)): if thisrow[col]==1: G.add_edge(w[row],c[col]) row+=1 return (G,w.values(),c.values()) def project(B,pv,result=False,**kwds): """ Returns a graph that is the unipartite projection of the bipartite graph B onto the set of nodes given in list pv. The nodes retain their names and are connected if they share a common node in the vertex set of {B not pv}. No attempt is made to verify that the input graph B is bipartite. """ if result: G=result else: G=NX.Graph(**kwds) for v in pv: G.add_node(v) for cv in B.neighbors(v): G.add_edges_from([(v,u) for u in B.neighbors(cv)]) return G if __name__ == "__main__": # return graph and women and clubs lists (G,women,clubs)=davis_club_graph() # project bipartite graph onto women nodes W=project(G,women) # project bipartite graph onto club nodes C=project(G,clubs) print "Degree distributions of projected graphs" print print "Member #Friends" for v in W: print v,W.degree(v) print print "Clubs #Members" for v in C: print v,C.degree(v)