2016-11-18 5 views
1

ソーシャルプラットフォームAPIのデータをnetworkxグラフに読み込んで分析するのは難しいです。しかし、問題がある。 add_node関数が渡されているようで、属性は追加されません。 API からNetworkx add_nodeは辞書として解析された属性を無視しているようです

データはの形式で提供されます:(...芋少し奇妙な構造)ので、それは

dict with one key 'users' 
    list with one element [0] 
      a dict of each users with user number as the key 
       a dict that contains the same id and a load of other attributes 

data= {'users': [{'1': {'attrib1': 'some value', 
         'attrib2': 'some other value', 
        .... etc}, 
        '2': {'attrib1': 'some val', 
         'attrib2': 'you get the idea', 
        ... etc}, 
       ... etc 
       }]} 

私がしてきましたnx.DiGraphのノードの作成に成功しました。

G = nx.DiGraph() 
    for u in data['users'][0].values(): 
     G.add_node(str(u['id']),attr_dict=u) 

しかし、ノードをクイズすると、G(たとえば、 nx.get_node_attibutes(G,'firstName'))ノードにアタッチされている属性がないようです。

質問

  1. 私が間違ってやっている何かがありますか?ループ内のuは間違いなくdictです。私はチェックしました。
  2. これを行うにはもっと元気な方法がありますか?おそらくdataの辞書を別の構造に操作することによって?

答えて

0

いいえ、私は欲望の瞬間に呼び出しからキーワード引数attr_dictを削除しました。例えば

G = nx.DiGraph() 
for u in data['users'][0].values(): 
    G.add_node(str(u['id']),u) 

!なぜ私が明示的に引数をマッピングするのが好きでないのか分かりません。誰でも何か考えがありますか?

私は興味があります。

1

私の推測では、attr_dictにタイプミスがあります。あなたの最初の試行ではうまくいきました。あなたは単にノードをクイズしてしまっただけで、あなたのタイプミスが何であるかはわかりませんでした。

nx.get_node_attibutes(G,'firstName')を使用する代わりに、特定の属性が存在するかどうかを確認する代わりに、G.nodeを使用してグラフ内のすべてのノードと属性をリストすることができます。

しかし、ここまでお話しましょう。 add_nodeについては、ノードを追加すると、属性とその値をキーワードと引数のペアとして渡すことができます。右add_nodeドキュメントページから、たとえば、このコードスニペットを取る:

ここでは、グラフにID 3にノードを追加し、 0.4の値ととしてタプルと UTM属性でそれを weight属性を与える
G.add_node(3,weight=0.4,UTM=('13S',382871,3972649)) 

値。我々はG.nodeでそれをチェックすると、私たちは

>>> G.node 
{3: {'weight': 0.4, 'UTM': ('13S', 382871, 3972649)}} 

を参照してくださいすべてのキーワードは、ノードの属性の辞書でkeyとして追加されます! すべてうまくいった。

>>> G.clear() 
>>> G.add_node(3, attr_dict={'weight': 0.4, 'UTM': ('13S',382871,3972649)}) 
>>> G.node 
{3: {'weight': 0.4, 'UTM': ('13S', 382871, 3972649)}} 

をあなたのケースでは、私はあなたが「attr_dict」のタイプミスをしたと思われる:我々はattr_dictなどの属性を渡されたかのように、これはまったく同じ結果です。この場合、networkxは実際のattr_dictキーワードを意味するのではなく、属性名を意味すると考えました。ここでは例です:あなたは属性'firstname'nx.get_node_attibutes(G,'firstName')で存在する場合、関数は'firstname'という名前のキーを探してチェックしてみましたが、唯一'attr_dict_typo'を見つけ、Noneを返されたので

>>> G.clear() 
>>> G.add_node(3, attr_dict_typo={'weight': 0.4, 'UTM': ('13S',382871,3972649)}) 
>>> G.node 
{3: {'attr_dict_typo': {'weight': 0.4, 'UTM': ('13S', 382871, 3972649)}}} 

質問がある場合はお知らせください。

関連する問題