2017-07-28 20 views
0

私はそれは私が大規模なグラフ(パンダDATAFRAME/CSVで~8M頂点、~22Mエッジを)分析することができますPythonライブラリだろう期待して、graph-toolを使用し始めました。 「ソース」および「ターゲット」列は、特定のデジタルサービスのユーザーIDです。パンダデータフレームまたはCSVからグラフツールのグラフを生成

私は、方法in this postに従うおもちゃの例で始めました。あなたは私のダミーの例で見ることができます

import pandas as pd 

df = pd.DataFrame({'source':range(11,15), 'target':range(12,16)}) 

g = Graph(directed=True) 

g.add_edge_list(df.values) 

、唯一の5個別の頂点(11, 12, 13, 14, 15)があります。しかし、グラフを生成すると、16の頂点が作成され、0と最大ノード値の間のギャップを一見埋めるように見えます。

g.get_vertices() 

returns: 

    array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], dtype=uint64) 

グラフツールは実際の頂点の名前ではなく、dfの値をインデックスとして '読み込み'ます。これはdocsから次の数式:0:数学:グラフで

各頂点が常に 間で一意のインデックスを有するN-1、ここで:数学:Nは、頂点の数です。

は、どのように私は(私は私のデータをインポートする場合、数百万人に可能性があり、)これらの冗長頂点せずにグラフを作成してください、そしてどのように私は、指標と見なされていない、私のユーザーIDで動作するように入手できますか? 私は利用可能な方法/ドキュメントを掘り下げてきており、dfケースからの大量インポートのためにそれを理解できませんでした。

私が試した他に何:

df.to_csv('test.csv', index=False)#, header=False)  
g2 = graph_tool.load_graph_from_csv('test.csv', skip_first=True) 

これが唯一の5頂点を持つグラフを作成するように見えるが、彼らの名前(ユーザID)「失う」ん。

g2.get_vertices() 

戻り

array([0, 1, 2, 3, 4], dtype=uint64) 

代わりの[11, 12, 13, 14, 15]

ありがとうございました!前もって感謝します。

python 2.7Jupyter/Anacondaに使用しています。

答えて

1

あなたがadd_edge_list()方法のhashedパラメータで有効になって欲しい:vmapは頂点「名前」を持つプロパティマップである

vmap = g.add_edge_list(df.values, hashed=True) 

。ドキュメント文字列から

任意には、hashed == True場合、エッジリスト における頂点の値は、直接頂点インデックスに対応すると仮定されていません。この場合、 それらは の順番に従って頂点インデックスにマップされ、頂点値が の頂点プロパティマップが返されます。string_vals == Trueの場合、アルゴリズムは の頂点値が文字列であるとみなします。それ以外の場合は、edge_listが:~numpy.ndarrayの場合は数字 、それ以外の場合は任意のpython となります。

グラフツールの頂点で、効率的なデータ構造を保証するための注意常に連続した整数ですので、彼らは常に0からN-1に番号が付けられます。それらに異なる "名前"を付ける場合は、ドキュメントに記載されているように、プロパティマップを使用する必要があります。

+0

これ以降どのように進めますか?私は 'v_name = g.add_edge_list(edges.values、string_vals = True、ハッシュ= True、eprops = e_weight)'を試みました。しかし、私は 'Unpickling Error'を取得しました。 edgesは 'DataFrame' e_weight'はエッジプロパティとして開始され、v_nameは文字列として頂点プロパティとして正しく開始されるノード名です。ありがとう、 –

関連する問題