Экспортируйте мультиплекс, ориентированный граф с сетьюx - PullRequest
0 голосов
/ 09 декабря 2018

Я пытаюсь построить из CSV-файла мультиплексный ориентированный граф, в котором каждое ребро имеет временную метку.Я хочу экспортировать его в Gephi для анализа в виде динамического графика.

CSV-файл выглядит следующим образом:

cdv = [['id','timestamp', 'node 1', 'node 2', 'description']
['1','10', '1', '2', 'description']
['2','20', '1', '3', 'description']
['3,'30', '2', '3', 'description']]
etc.

Код для построения графика:

def csv2gexf(csvf):
    G = nx.MultiDiGraph() # works with G = nx.DiGraph()
    for f in csv:
        if f[3] not in G:
            G.add_node(f[3])
        if f[2] not in G:
            G.add_node(f[2])
            G.node[f[2]]['description'] = f[4]
        if G.has_edge(f[3], f[2]):
            G.edge[f[3]][f[2]]['weight'] += 1.0
        else:
            G.add_edge(f[3], f[2])
            G.edge[f[3]][f[2]]['timestamp'] = str(f[1])
            G.edge[f[3]][f[2]]['weight'] = 1.0
    nx.write_gexf(G, "graph.gexf")

Хотя этот код работает при использовании DiGraph вместо MultiDiGraph, последний дает мне следующее:

    nx.write_gexf(G, "graph.gexf")
  File "<decorator-gen-206>", line 2, in write_gexf
  File "/usr/local/lib/python3.6/site-packages/networkx/utils/decorators.py", line 220, in _open_file
    result = func(*new_args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/networkx/readwrite/gexf.py", line 77, in write_gexf
    writer.add_graph(G)
  File "/usr/local/lib/python3.6/site-packages/networkx/readwrite/gexf.py", line 300, in add_graph
    self.add_edges(G,graph_element)
  File "/usr/local/lib/python3.6/site-packages/networkx/readwrite/gexf.py", line 355, in add_edges
    for u,v,key,edge_data in edge_key_data(G):
  File "/usr/local/lib/python3.6/site-packages/networkx/readwrite/gexf.py", line 340, in edge_key_data
    edge_data=data.copy()
AttributeError: 'str' object has no attribute 'copy'

Я думал, что формат файла gexf должен был обрабатывать мультиплексные ориентированные графы, что я здесь не так делаю

1 Ответ

0 голосов
/ 09 декабря 2018

Должно работать следующее - я добавил недостающий индекс, необходимый для случая MultiDiGraph;замените его необходимыми данными по мере необходимости.Обратите внимание, что в 2.x атрибут edge заменен на adj:

def csv2gexf(csvf):
    G = nx.MultiDiGraph() # works with G = nx.DiGraph()
    for f in csv:
        if f[3] not in G:
            G.add_node(f[3])
        if f[2] not in G:
            G.add_node(f[2])
            G.node[f[2]]['description'] = f[4]
        if G.has_edge(f[3], f[2]):
            G.adj[f[3]][f[2]]['weight'] += 1.0
        else:
            G.add_edge(f[3], f[2])
            G.adj[f[3]][f[2]][0]['timestamp'] = str(f[1])  
            G.adj[f[3]][f[2]][0]['weight'] = 1.0
    nx.write_gexf(G, "graph.gexf")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...