Python Networkx не может экспортировать в graphml с атрибутами

Возникла следующая проблема с преобразованием графа networkx в graphml (не могу опубликовать здесь весь код, но вот суть). Версия NetworkX - 1.6.2

У меня есть орграф networkx под названием G

G = nx.DiGraph()

Заполните его взвешенными краями из списка авторов в формате (AuthorA, AuthorB, Weight)

G.add_weighted_edges_from(author_list)

Я могу экспортировать graphml сюда, и он отлично работает

nx.write_graphml(G, 'test.graphml')

Затем я вычисляю рейтинг страницы на графике.

graph_metric = nx.pagerank_numpy(G, weight='weight')

а затем добавьте атрибуты к узлам на графике

nx.set_node_attributes(G, 'pagerank', graph_metric)

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

for n.d in G.nodes_iter(data=True):
     print n, d

Автор A {u'pagerank ': 0.0076688948270074164} ... ... ...

но если после обновления атрибутов я пытаюсь создать graphml из графика, я получаю следующую ошибку:

File "/usr/lib/pymodules/python2.7/networkx/readwrite/graphml.py", line 111, in generate_graphml

writer.add_graph_element(G)

File "/usr/lib/pymodules/python2.7/networkx/readwrite/graphml.py", line 305, in add_graph_element

self.add_nodes(G,graph_element)

File "/usr/lib/pymodules/python2.7/networkx/readwrite/graphml.py", line 262, in add_nodes

self.add_attributes("node", node_element, data, default)

File "/usr/lib/pymodules/python2.7/networkx/readwrite/graphml.py", line 255, in add_attributes

scope=scope, default=default_value)

File "/usr/lib/pymodules/python2.7/networkx/readwrite/graphml.py", line 242, in add_data

raise nx.NetworkXError('GraphML writer does not support '

NetworkXError: GraphML writer does not support dict types as data values.

Мысли?


person Michael    schedule 13.01.2014    source источник
comment
Может быть, вам нужно опубликовать больше кода ... Я просто попробовал его здесь, и, похоже, он работает нормально. Я py26 / nx1.6 IIRC. Одно дело в том, что он жалуется, что каким-то образом вы устанавливаете атрибут в значение, которое является dict, что недопустимо. Приведенный выше код этого не делает, но для начала нужно выяснить, какой узел имеет атрибут с недопустимым значением ... отправит код для этого ....   -  person Corley Brigman    schedule 13.01.2014
comment
Я не вижу в опубликованном вами сообщении ничего, что могло бы вызвать проблему. Сообщение об ошибке для неподдерживаемых типов было (немного) улучшено в networkx-1.7 github.com/networkx / commit /, поэтому вы можете подумать об обновлении до более новой версии и посмотреть, дает ли это ключ к разгадке того, какие данные вызывают жалобы автора графа.   -  person Aric    schedule 14.01.2014
comment
Вы не можете автоматически сериализовать dicts при сохранении как GraphML. Например, OSMnx имеет встроенную функцию для сохранения сетей networkx. в виде файлов GraphML для сериализации атрибутов dict узлов и ребер.   -  person eos    schedule 27.12.2016


Ответы (2)


ну, он говорит вам - вы не можете поместить словарь в качестве атрибута graphml - они должны быть либо числовыми типами, либо строками, по большей части.

не ответ, но здесь проще поместить код. найти "плохой" узел:

for node in G.node:
    for attrib in G.node[node]:
        if type(G.node[node][attrib]) == dict:
            print node
person Corley Brigman    schedule 13.01.2014
comment
Он сообщает вам, и это атрибут pagerank, который я добавил - вы можете видеть из 'AuthorA {u'pagerank': 0.0076688948270074164} '. Странно, что вы можете обновить атрибуты узла в графе, но для графа нет встроенного способа их записать. Кажется, мне нужно сгенерировать graphml, а затем вернуться к нему, чтобы обновить его после его создания. - person Michael; 14.01.2014
comment
вы запускали код? то, что вы видите, является ожидаемым поведением - печать n (строка) и d (атрибут dict). Я получаю тот же результат, но write_graphml работает нормально. - person Corley Brigman; 14.01.2014
comment
1.7. Но этот код не сильно изменился между 1.6 и 1.7 afaik. - person Corley Brigman; 14.01.2014
comment
хорошо .... так что ваш код распечатывает атрибут, если это dict, что он и делает - все из них. Итак: nx.set_node_attributes (G, 'pagerank', graph_metric) - не лучший способ добавить атрибут, на который он похож. - person Michael; 14.01.2014
comment
если какой-либо атрибут является значением dict, на основе кода, который вы показали, что-то пошло не так. как выглядит graph_metric? это должен быть простой словарь с ключами в качестве имен узлов и значениями в качестве рейтинга страниц. - person Corley Brigman; 14.01.2014
comment
на самом деле я только что проверил - ваш код ничего не распечатывает. Странный. graph_metric - это словарь узлов с рейтингом страницы в качестве значения. Я все больше и больше думаю, что его nx.set_node_attributes вызывают проблему. Можно просто перебрать график и добавить атрибуты вручную, затем попробовать экспорт в graphml и посмотреть, что произойдет. - person Michael; 14.01.2014
comment
вы можете проверить ... запустить то же самое после выполнения set_node_attributes и посмотреть, не записывает ли он что-нибудь недопустимое. здесь он работал с моим (крошечным) набором данных, но я не знаю, какие ошибки вы можете столкнуть. - person Corley Brigman; 14.01.2014
comment
и ... код выводит только те узлы, которые имеют значения dict, поэтому, если они все верны, он ничего не печатает. - person Corley Brigman; 14.01.2014
comment
Я. - то вроде все правильно - ничего не печатает. ТАК не уверен, почему write_graphml все еще не работает - person Michael; 14.01.2014
comment
угадайте, что пора запустить отладчик и посмотреть, какое значение, по его мнению, он имеет, а затем вернуться назад, чтобы найти его на графике. Вы уверены, что нет кода, который вы не опубликовали? я все еще не могу воспроизвести это. - person Corley Brigman; 14.01.2014
comment
Нет, это было то. В итоге я проанализировал базовый graphml после того, как он был создан networkx, и добавил метрику самостоятельно. Не так быстро, но похоже, что код networkx для обновления graphml пытался добавить весь метрический dict к одному узлу. - person Michael; 26.02.2014
comment
У кого-нибудь есть решение этой проблемы? У меня есть аналогичная проблема, которую я хотел бы решить, которая описана в stackoverflow.com/questions/40363046/ - person Guido; 01.11.2016

Я могу сохранить GraphMl с данными pagerank_numpy ():

Я изменил nx.set_node_attributes(G, 'pagerank', graph_metric) на nx.set_node_attributes(G, graph_metric, 'pagerank') в соответствии с определением функции в networkx документ.

Я создал график с весом, рассчитал nx.pagerank_numpy () и сохранил GraphMl со значением pagerank.

Код:

import networkx as nx

G = nx.DiGraph()

G.add_edges_from([('A', 'B'), ('A', 'C'), ('B', 'G'), ('B', 'F'), ('C', 'G')], weight = 2)
G.add_edges_from([('D', 'B'), ('E', 'C'), ('E', 'F'),('B', 'H')], weight = 3)

graph_metric = nx.pagerank_numpy(G, weight='weight')
nx.set_node_attributes(G, graph_metric, 'pagerank')
nx.write_graphml(G, 'test.graphml')

Вывод GraphMl:

<?xml version='1.0' encoding='utf-8'?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
  <key id="d1" for="edge" attr.name="weight" attr.type="int" />
  <key id="d0" for="node" attr.name="pagerank" attr.type="double" />
  <graph edgedefault="directed">
    <node id="A">
      <data key="d0">0.07114273010226772</data>
    </node>
    <node id="B">
      <data key="d0">0.16184971098265896</data>
    </node>
    <node id="C">
      <data key="d0">0.13161405068919527</data>
    </node>
    <node id="G">
      <data key="d0">0.22232103156958644</data>
    </node>
    <node id="F">
      <data key="d0">0.14068474877723428</data>
    </node>
    <node id="D">
      <data key="d0">0.07114273010226768</data>
    </node>
    <node id="E">
      <data key="d0">0.07114273010226768</data>
    </node>
    <node id="H">
      <data key="d0">0.13010226767452204</data>
    </node>
    <edge source="A" target="B">
      <data key="d1">2</data>
    </edge>
    <edge source="A" target="C">
      <data key="d1">2</data>
    </edge>
    <edge source="B" target="G">
      <data key="d1">2</data>
    </edge>
    <edge source="B" target="F">
      <data key="d1">2</data>
    </edge>
    <edge source="B" target="H">
      <data key="d1">3</data>
    </edge>
    <edge source="C" target="G">
      <data key="d1">2</data>
    </edge>
    <edge source="D" target="B">
      <data key="d1">3</data>
    </edge>
    <edge source="E" target="C">
      <data key="d1">3</data>
    </edge>
    <edge source="E" target="F">
      <data key="d1">3</data>
    </edge>
  </graph>
</graphml>
person Abhi    schedule 05.05.2021