Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Python, как выбрать, что печатать в графе networkX

Автор вопроса: IolkosОтветов: 1

У меня есть график, показывающий связь поддоменов с их доменами, но я хочу выбрать только те домены, которые запрашиваются более 10 раз.

B=nx.Graph()
B.add_nodes_from(data['subdomain'],bipartite=0)
B.add_nodes_from(data['domain'],bipartite=1)
B.add_edges_from([(row['subdomain'] , row['domain']) for idx,row in data.iterrows()])


print (B.degree(data['domain']).items())

и

print (B.degree(data['domain']).values())

дайте мне значения, которые мне нужны, но я не знаю, как их использовать, чтобы построить график только с теми значениями data['domain'], которые выше, чем порог (например, 10).

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

pos = {node:[0, i] for i,node in enumerate(data['domain'])}
pos.update({node:[1, i] for i,node in enumerate(data['subdomain'])})
nx.draw(B, pos, with_labels=False)
nx.draw_networkx_labels(B, pos)
plt.show

ПРИМЕЧАНИЕ. Было бы проще выбрать эти значения перед построением графика, и как это возможно? Я имею в виду, чтобы выбрать значения из одного столбца фрейма данных, которые соответствуют многим значениям из другого столбца фрейма данных.

EDIT: Итак, у меня есть эти два столбца фрейма данных, и основная идея состоит в том, чтобы попытаться найти, какие доменные имена сопоставляются некоторыми поддоменами более 10 раз, а затем выбрать эти доменные имена и продолжить обработку их.

Итак, после B.add_edges_from([(row['subdomain'] , row['domain']) for idx,row in data.iterrows()]) я получаю свой график, который выглядит хаотичным из-за большого количества данных. Прежде всего, я хочу показать на своем графике только те узлы, которые имеют более 10 ребер, а затем из этого нового графика я хочу иметь возможность выбирать/сохранять эти доменные имена/узлы в новый фрейм данных. Что меня беспокоит, так это то, что я не знаю, можно ли выбирать данные из графика или нет!

  • Предложение: экспортируйте свой график в gexf (ссылка) и сделайте работа с инструментом визуализации, таким как Gephi. Я столкнулся с проблемой, которая по сути похожа на вашу, и пытаюсь решить ее таким образом. Надеюсь, поможет. lrnzcig 24.06.2015

pythondataframegraphnetworkx

Ответы

Ответ 1 · рейтинг 1 · A_A

Не имея возможности видеть, что находится в data, и просто судя по тому, как код написан на данный момент, кажется, что он просто связывает поддомены с доменами в простом графе, и поэтому B.degree([bunch of nodes]) будет возвращать словарь, чьи ключи являются узлами, а значения являются степенями узла.

Если все, что вы пытаетесь сделать, это создать подграф C из вашего исходного B, узлы которого будут доменами с более чем 10 поддоменами, тогда вы можете сделать что-то вроде:

C = B.subgraph(filter(lambda x:x[1]>10, B.degree(data['domain']).items()))

Что в основном использует subgraph, чтобы вызвать C с критерием степени обеспечивается фильтром Python.

Имейте в виду, однако, что в двудольном графе это, скорее всего, просто вернет набор узлов, потому что B связывает поддомены с доменами, а сами домены не будут иметь никакой связи между ними.

Если вы пытаетесь получить домены, которые имеют более 10 поддоменов, и изобразить это позже в виде набора звездных графов (домен в середине со всеми его поддоменами вокруг него), то самый простой способ получить эти графы будет для запуска dfs_tree (или bfs_tree).

Если, с другой стороны, data содержит одну строку для каждого "попадания" домена одним из его поддоменов, то это означает, что потребуется более одного ребра между парой поддомен/домен, и по этой причине вам нужно будет начать с мультиграфом, а не с графиком.

Надеюсь, это поможет, буду рад изменить ответ, если будет предоставлена ​​​​дополнительная информация о data или фактической проблеме, с которой приходится иметь дело.

EDIT: с учетом дополнительных комментариев и более ранний соответствующий вопрос, неясно, хотите ли вы продолжить решение на основе графа или нет.

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

Вы можете, конечно, сделать то же самое, используя DataFrame pandas с чем-то вроде:

import pandas

data = pandas.read_csv("testFile.csv", index_col=False, header = None)
dataGrouped = data.groupby(1).count() #Group by domain and count the values in the other fields
busyDomains = dataGrouped[dataGrouped[0]>2]

С testFile.csv столбцами: субдомен, домен, ip

busyDomains теперь еще один DataFrame. Основной результат здесь с использованием тестовых данных по вашему предыдущему вопросу: "example.org".

Надеюсь это поможет.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы