Networkx - подграфы, использующие атрибуты узла - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть набор данных, где узлы имеют атрибут, показывающий название команды, к которой они принадлежат.Я хотел бы определить статистику для а) всей сети, а затем б) статистику для каждой команды, сравнивая их соединения и т. Д. (Допустим, я сравниваю, кто отправляет электронные письма кому и, следовательно, степень связности команды. Здесьмой пример кода:

ST = nx.Graph()
ST.add_node('A',role = 'sales1')
ST.add_node('B',role = 'sales1')
ST.add_node('C',role = 'sales1')
ST.add_node('D',role = 'sales1')
ST.add_node('E',role = 'sales2')
ST.add_node('F',role = 'sales2')
ST.add_node('G',role = 'sales2')
ST.add_node('H',role = 'sales2')

ST.add_edges_from([('A','B'),
                   ('A','C'),
                   ('A','D'),
                   ('B','D'),
                   ('B','C'),
                   ('C','D'),
                   ('E','F'),
                   ('E','G'),
                   ('E','H'),
                   ('F','H'),
                   ('G','H'),
                   ('A','E'),
                   ('G','D')])

Я знаю, что могу сформировать подграф следующим образом:

H = ST.subgraph(['A','B','C','D'])

Есть ли более простой способ задания узлов по ссылке на атрибут узла?

1 Ответ

0 голосов
/ 15 ноября 2018

Вы можете использовать itertools.groupby:

from itertools import groupby

# Sort the nodes by their role (this is required for the groupby to work)
sorted_by_role = sorted(ST.nodes(data=True), key=lambda node_data: node_data[1]["role"])
# Group objects with same role together
grouped = groupby(sorted_by_role, key=lambda node_data: node_data[1]["role"])

subgraphs = dict()
for key, group in grouped:
     nodes_in_group, _ = zip(*list(group))  # We don't care about the data here, only the node names
     subgraphs[key] = ST.subgraph(nodes_in_group)

Теперь диктат subgraphs содержит подграф каждой роли, представленной в графе.Это работает для произвольного числа ролей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...