网络和属性(节点 - 邻居)

Network and attributes (nodes - neighbors)

在此示例中,来自数据帧 df 的网络具有 4 个节点和 5 个链接:

N      T      P
1      2      B
1      3      B
2      1      A
2      3      A
2      4      A
3      1      B
3      2      B
3      4      B
4      2      A
4      3      A

节点具有以下属性(摘要):

N       P
1       B
2       A
3       B
4       A

对于每个节点,我需要计算相同类型的邻居的比例。 通过连接两个数据帧来构建网络,如果我 select 个节点 P=A,我有:

N    F1
1   1/2 # node 1 has only one node having P=A
2   1/3 # node 2 has 1 node with P=A and two with P=B
3   1/3
4   1/2

一旦我有了这个列表,我就需要为每个节点提供在该节点的 P=A 邻居上方找到的值的平均值列表。

这意味着

N   F2
1   1/3
2   1/2
3   1/2, 1/3
4   1/3

构建网络的代码

G = nx.from_pandas_edgelist(df, source='N', target='T')
colors = []
for node in G:
    if node in df["P"].values:
        colors.append("lightblue")
    else: colors.append("lightgreen")

nx.draw(G, 
        node_color=colors,
        with_labels=True)

我不知道如何检查节点的邻居并计算它们具有相同 P 的概率,所以如何获得预期的输出 F1 和 F2。我觉得问题出在这上面。

获得 F1 非常简单。对于每一个唯一的节点属性值,归纳出一个子图,计算边数,除以节点的整体度数。

#!/usr/bin/env python
"""
Compute homophily score by node.
"""
import numpy as np
import matplotlib.pyplot as plt
import networkx as nx


if __name__ == '__main__':

    edges = [
        (1,      2),
        (1,      3),
        (2,      1),
        (2,      3),
        (2,      4),
        (3,      1),
        (3,      2),
        (3,      4),
        (4,      2),
        (4,      3),
    ]

    nodes = [
        (1, {'property'  :    'B'}),
        (2, {'property'  :    'A'}),
        (3, {'property'  :    'B'}),
        (4, {'property'  :    'A'}),
    ]

    g = nx.Graph()
    g.add_nodes_from(nodes)
    g.add_edges_from(edges)

    neighbours_of_same_type = dict()
    for letter in 'AB':
        nodes_with_property = [node for node, data in g.nodes(data=True) if data['property'] == letter]
        h = g.subgraph(nodes_with_property)
        neighbours_of_same_type.update(h.degree)

    degree = dict(g.degree)
    output = dict()
    for node, _ in nodes:
        output[node] = neighbours_of_same_type[node] / degree[node]

    print(output)
    # {1: 0.5, 2: 0.3333333333333333, 3: 0.3333333333333333, 4: 0.5}

Once I have this list, I'd need for each node either the list of mean of the values found above of the node's P=A neighbors.

你对 F2 的定义对我来说意义不大,但我怀疑它可以很容易地从 F1 计算出来?