Последующие действия после отображения атрибутов в Dash / Plotly приводят к KeyError - PullRequest
0 голосов
/ 10 июля 2020

После полезного ответа на мой исходный вопрос я решил использовать внутренние данные (которыми я не могу здесь поделиться). Внутренние данные имеют тот же формат, что и фиктивные данные. Я просто скопировал данные в тот же рабочий каталог, убедившись, что новые данные имеют тот же формат, то есть те же заголовки столбцов и т. Д. c. Я использовал DiffChecker, чтобы убедиться, что app.py (из моего исходного сообщения) соответствует Proof of Concept (appPOC.py). Внутренние данные содержат более 600 узлов и более 3000 ребер.

Код для создания интерактивной панели инструментов такой же, как и тот, который я использовал для моего исходного сообщения . Однако на этот раз я столкнулся с этим KeyError:

Traceback (most recent call last):
  File "appPOC.py", line 75, in <module>
    hovertext = "Document Description: " + str(G.nodes[node]['Description']) + "<br>" + "Document Name: " + str(G.nodes[node]['DocName']) + "<br>" + "Document ID: " + str(G.nodes[node]['DocumentID'])
KeyError: 'Description'

С данными должно быть все в порядке, так как я могу построить сеть без зависания текста рядом с узлом.

Чтобы Подведем итог: app.py может отображать фиктивные данные, appPOC.py (который идентичен, но имеет другое имя файла) не может отображать внутренние данные. Это заставляет меня думать, что что-то не так с внутренними данными в файле CSV.

Edit : Я понял, что если цель не указана в элементах, график не может быть нарисован. Есть ли способ создать узел автоматически (как в Gephi), если (целевой) узел не определен в элементах?

1 Ответ

1 голос
/ 10 июля 2020

NetworkX создает узлы для узлов от и до каждого ребра. Следовательно, с

G = nx.from_pandas_edgelist(edges, 'Source', 'Target')

ваш график имеет все возможные узлы. Однако с помощью

nx.set_node_attributes(G, nodes.set_index('Doc')['Description'].to_dict(), 'Description')
nx.set_node_attributes(G, nodes.set_index('Doc')['DocumentID'].to_dict(), 'DocumentID')

вы заполняете только атрибуты узла 'Description' и 'DocumentID' для тех, что находятся во фрейме данных ваших узлов. Простой обходной путь - заменить

str(G.nodes[node]['Description'])

на

str(G.nodes[node].get('Description', ''))

и аналогично для 'DocName' и 'DocumentID'. Более подробную информацию о методе get вы найдете по адресу: Почему dict.get (key) вместо dict [key]? В основном мы используем, что networkx использует dict для хранения значений и использует get метод, позволяющий указать значение по умолчанию.

Простой воспроизводимый и минимальный пример

import networkx as nx
g = nx.karate_club_graph()
# all nodes in this graph have the node attribute 'club' filled
# we add a node without this node attribute
g.add_node("Test")
print(g.nodes[0]["club"])
# 'Mr. Hi'
# print(g.nodes["Test"]["club"]
# results in KeyError: 'club'
print(g.nodes["Test"].get("club", ""))
# ''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...