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

У меня есть график, показывающий связь поддоменов с их доменами, но я хочу выбрать только те домены, которые запрашиваются более 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 ребер, а затем из этого нового графика я хочу иметь возможность выбирать/сохранять эти доменные имена/узлы в новый фрейм данных. Что меня беспокоит, так это то, что я не знаю, можно ли выбирать данные из графика или нет!


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


Ответы (1)


Не имея возможности видеть, что находится в 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».

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

person A_A    schedule 24.06.2015
comment
Таким образом, data — это кадр данных со столбцами domainName , domain , subdomainи другими, например lenght... Одним из примеров может быть abc123.example.org, example.org, abc123. или def456.example.org, example.org, def456. Таким образом, на моем графике example.org будет иметь 2 ребра, исходящие от abc123 и def456. Если мы предположим, что example.org имеет 15 ребер, я хотел бы иметь возможность выбрать example.org и другие подобные домены с более чем 10 ребрами, входящими в узел, и дальше их обрабатывать. Так что я на самом деле не знаю, проблема ли это в графике или я могу справиться с этим иначе! - person Iolkos; 25.06.2015
comment
Итак, результаты (B.degree(data['domain']).items()) дают мне что-то вроде: ('ubuntu', 5),('google-analytics', 20),('topdns', 12),('forbes', 16). Я хочу иметь возможность выбрать те 3 домена, которые имеют более 10 поддоменов, сопоставленных с ними, как показано на графике, и сохранить их в другом фрейме данных или столбце, чтобы я мог продолжить свою обработку только с этими значениями. - person Iolkos; 25.06.2015
comment
Спасибо за дополнительные комментарии, см. измененный ответ. - person A_A; 25.06.2015
comment
Спасибо за ответ и ваше время. Да, я знаю о df.groupby варианте. Я искал решение, больше похожее на граф, где после добавления узлов и ребер, возможно, я мог бы сохранить в графе только те узлы, которые имеют более 20 ребер, а затем каким-то образом сохранить эти узлы в списке или столбце фрейма данных. Но я думаю, что если я сначала сделаю groupby, а затем построю график, я получу что-то близкое к тому, что хочу! - person Iolkos; 25.06.2015
comment
Да, похоже, вам придется использовать смесь двух подходов. С удовольствием внесу поправки в ответ, если вы поделитесь дополнительной информацией о том, что именно вы пытаетесь сделать. А пока, пожалуйста, подумайте о том, чтобы проголосовать/принять этот ответ, если он вам помог. - person A_A; 25.06.2015
comment
Да, извините за это. Я редактирую свой первоначальный вопрос, который сводится к тому, можете ли вы выбрать фактические данные из визуализированного графика! - person Iolkos; 25.06.2015