web-dev-qa-db-ja.com

Python 3のCSVファイルからNetworkxグラフを作成します。

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()

これに取り組むより簡単な方法はありますか?データは比較的単純です。

ご協力ありがとうございました!

4
Melissa

関数read_edgelistを誤用しています。 documentation から、各行は文字列を解析する必要がありますが、csv.readerは入力ファイルの行を文字列のリストに解析します(たとえば、202,237,1 -> ['202', '237', '1'])。したがって、read_edgelistcsv.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)
5
ducminh