在Python中计算二分网络的度数并创建度矩阵

问题描述 投票:0回答:1

我正在尝试为我的学者跟踪一篇研究论文,并且我正在尝试重新创建作者在这篇论文中放入的内容。本文涉及索赔和涉及这些索赔的各方(p1、p2、p3)的二方网络。我创建了一个虚拟 DataFrame df,如下所示:

data = {
    'claims': ['C001',  'C001', 'C003', 'C003', 'C002'],
    'parties': ['p1',  'p2', 'p3', 'p1', 'p1']
}
df = pd.DataFrame(data)

我正在尝试计算每个主张和各方的程度,并为主张和各方创建程度矩阵。网络中节点的度是该节点与其他节点的连接或边的数量。在我的双向网络中:

索赔节点的度数是涉及该索赔的各方数量。 一方节点的度数是该方参与的索赔数量。 我还尝试分别计算每种政党类型的平均值、中位数、最小值和最大值。

到目前为止我的代码-我已经创建了二分图,现在我不知道如何从那里继续。任何帮助将不胜感激!

import networkx as nx
from networkx.algorithms import bipartite

G= nx.Graph()
G.add_nodes_from(df['claims'], bipartite=0)
G.add_nodes_from(df['parties'], bipartite=1)
for i, row in df.iterrows():
   G.add_edge(row['claims'], row['parties'])

我想创建与作者在他的研究论文中创建的相同的表:

研究论文的输出 Summary Table

python charts networkx bipartite
1个回答
0
投票

IIUC,您可以只使用集合操作和

degree
,因为您在声明之间或各方之间永远不应该有边缘:

# G = nx.from_pandas_edgelist(df, source='claims', target='parties')

claims = set(df['claims'])
parties = set(df['parties'])

claim_degrees = {n: G.degree(n) for n in claims}
# {'C003': 2, 'C001': 2, 'C002': 1}

parties_degrees = {n: G.degree(n) for n in parties}
# {'p2': 1, 'p1': 3, 'p3': 1}

pd.Series(claim_degrees).agg(['min', 'max', 'mean', 'median'])
# min       1.000000
# max       2.000000
# mean      1.666667
# median    2.000000
# dtype: float64
    
pd.Series(parties_degrees).agg(['min', 'max', 'mean', 'median'])
# min       1.000000
# max       3.000000
# mean      1.666667
# median    1.000000
# dtype: float64

请注意,您可以在纯熊猫中获得相同的效果,而无需

networkx

df.groupby('claims')['parties'].nunique().agg(['min', 'max', 'mean', 'median'])
# min       1.000000
# max       2.000000
# mean      1.666667
# median    2.000000
# dtype: float64
    
df.groupby('parties')['claims'].nunique().agg(['min', 'max', 'mean', 'median'])
# min       1.000000
# max       3.000000
# mean      1.666667
# median    1.000000
# dtype: float64
© www.soinside.com 2019 - 2024. All rights reserved.