CSVファイル からNetworkXソーシャルネットワークグラフを作成しようとしています。 Networkx 2.1とPython 3を使用しています。
私は この投稿 をフォローしましたが、エラーが発生し続けるため運がありません:AttributeError: 'list' object has no attribute 'decode'。
私の目標は、ウェイトを高くするためにウェイトのエッジを太くすることです。
これまでの私のコードは次のとおりです。
import networkx as nx
import csv
Data = open('testest.csv', "r", encoding='utf8')
read = csv.reader(Data)
Graphtype=nx.Graph() # use net.Graph() for undirected graph
G = nx.read_edgelist(read, create_using=Graphtype, nodetype=int, data=(('weight',float),))
for x in G.nodes():
print ("Node:", x, "has total #degree:",G.degree(x), " , In_degree: ", G.out_degree(x)," and out_degree: ", G.in_degree(x))
for u,v in G.edges():
print ("Weight of Edge ("+str(u)+","+str(v)+")", G.get_Edge_data(u,v))
nx.draw(G)
plt.show()
これに取り組むより簡単な方法はありますか?データは比較的単純です。
ご協力ありがとうございました!
関数read_edgelist
を誤用しています。 documentation から、各行は文字列を解析する必要がありますが、csv.reader
は入力ファイルの行を文字列のリストに解析します(たとえば、202,237,1 -> ['202', '237', '1']
)。したがって、read_edgelist
がcsv.reader
によって提供されるリストを解析しようとしているため、AttributeError
が発生します。
csv
モジュールを使用せずに、入力ファイルからグラフを正しく解析できます。ただし、解析する必要のない入力ファイルの最初の行(ヘッダー)を処理する必要があります。 2つの方法があります。最初の方法は、next
を使用して最初の行をスキップします。
Data = open('test.csv', "r")
next(Data, None) # skip the first line in the input file
Graphtype = nx.Graph()
G = nx.parse_edgelist(Data, delimiter=',', create_using=Graphtype,
nodetype=int, data=(('weight', float),))
2番目の方法は少し「ハッキー」です。最初の行はtarget
で始まるため、入力ファイルのコメントの開始としてt
をマークします。
Data = open('test.csv', "r")
Graphtype = nx.Graph()
G = nx.parse_edgelist(Data, comments='t', delimiter=',', create_using=Graphtype,
nodetype=int, data=(('weight', float),))
どちらの方法でも、入力ファイルでは改行にparse_edgelist
を使用するため、read_edgelist
ではなく\r
を使用する必要があります。 read_edgelist
を使用するには、ファイルをバイナリモードで開く必要があり、その行は分割されます 改行は\r\n
または\n
です。したがって、\r
改行を含む入力ファイルは行に分割できないため、正しく解析できません。
また、度数と度数を求めたいので、グラフはDiGraph
ではなくGraph
を使用して作成する必要があります。
ここで重要なのは、入力ファイルのヘッダーをスキップすることです。これは、最初に入力ファイルをpandas.DataFrame
に読み込んでからグラフに変換することで実現できます。
import networkx as nx
import pandas as pd
df = pd.read_csv('test.csv')
Graphtype = nx.Graph()
G = nx.from_pandas_edgelist(df, Edge_attr='weight', create_using=Graphtype)