#nodes #networkx #directed-graph
Вопрос:
Я использую networkx в данных CDR для телекоммуникаций, чтобы определить сетевых влиятельных лиц и их круг влияния. Я определил влияющих как узлы, центральная роль собственного вектора которых превышает определенный порог, но я все еще не могу определить их круг влияния, который представляет собой узлы, непосредственно связанные с узлом влияющего с расстоянием = 1. Есть ли у нас функция в networkx, которая делает то же самое? Кстати, мой график-это ориентированный график.
G = nx.DiGraph()
G = nx.from_pandas_edgelist(CDR1, 'A', 'B', ['WEIGHT'], create_using=nx.DiGraph())
df = pd.DataFrame(dict(
DEGREE = dict(G.degree),
DEGREE_CENTRALITY = nx.degree_centrality(G),
CLUSTERING = nx.clustering(G),
EIGENV_CENTRALITY=nx.eigenvector_centrality(G)
))
df['Influencer']=np.where(df['EIGENV_CENTRALITY']> 1.022186e-05,1,0)
Ответ №1:
Предполагая, что у вас есть неориентированный график, это
G.neighbors(node)
Если он направлен, и вы хотите, чтобы те, которые достигаются с узла, это снова
G.neighbors(node)
или G.successors(node)
тоже работает.
Если он направлен, и вам нужны только те, у которых есть края, к узлу, это
G.predecessors(node)
Комментарии:
1. Но они вернут итератор, а не список. Как мне получить список номеров пользователей в круге влияния?
2. Чтобы превратить итератор в список, просто сделайте
list(G.neighbors(node))
это .3. список, возвращаемый из G. преемники(узел), представляет собой список ключевых итераторов. Применение функции list() ничего не изменит. Это все равно будет список ключевых итераторов.
4. Какая у вас версия networkx? Для меня:
H=nx.DiGraph()
….H.add_edge(1,2)
….list(H.successors(1))
получает результат[2]
.
Ответ №2:
Я нашел ответ на свой вопрос. Я использовал следующие строки кода:
circle_pre=[]
for inf in influencers_pre.index:
for n in G_pre.neighbors(inf):
circle_pre.append(n)
len(circle_pre)
где circle_pre-это список имен узлов, непосредственно связанных с узлами влияния, которые я определил как круг влияния.