【问题标题】:calculating degree centrality using NetworkX in python3在 python3 中使用 NetworkX 计算度中心性
【发布时间】:2019-09-12 07:49:45
【问题描述】:

我是使用 Networkx 的新手,并且是为 python 做的。我正在尝试从 csv 文件计算节点(约 14K)的度中心性 - 第一列是源,第二列是目标。这是一个示例(这些是各个经理的 ID):

Source    Target
4890    12842691
4890    26682663
4890    59694886
4890    79419501
5280    389911360
5280    393411529
5280    395211613
5280    395511628
5280    395811643
5280    396011651
6000    300556269
6000    315027716
6000    315037716
6000    341189880
6000    341909932
6000    341919932

我尝试了以下代码:

import networkx as nx
import pandas as pd
data = pd.read_csv('man_edge.csv')
FG = nx.from_pandas_edgelist(data, source='Source', target='Target')
FG.nodes()

然后我尝试计算度中心性:

degree_dict=nx.degree_centrality(FG)

代码计算 ID 4890、5280 和 6000 的度中心性。但它也计算第二列中 ID 的度中心性,这是我不想要的。

示例:

   ID         degree_dict
    4890    0.526490066
    5280    0.215231788
    6000    0.251655629
  473931    0.003311258
  2219536   0.003311258
   8053083  0.003311258
 12842691   0.003311258
13213108    0.003311258

如何仅计算第 1 列中的 ID 而不是第 2 列中的 ID 的度中心性?提前感谢您的帮助。

【问题讨论】:

  • 您的网络是否应该被定向?我的印象是应该的。在这种情况下,有一些命令将返回入度中心性和出度中心性,这将起作用。但首先,您必须采取措施让 networkx 知道网络是定向的。

标签: python networkx


【解决方案1】:

您可以指定必须返回度数视图的节点。例如:

import networkx as nx
g = nx.path_graph(5)
print(g.degree([0, 1])) # return degree view of nodes 0, 1

请注意,nx.read_edgelist 可以指定为使用有向图进行创建;默认情况下,它假定边缘列表是无向的

【讨论】:

    【解决方案2】:

    你不能。这些其他节点是IN您的网络。度中心性必须考虑那些其他节点。

    您可以仅从感兴趣的节点(源列中的节点)中提取度中心度度量。

    degree_dict = {
        k: v for k, v in nx.degree_centrality(FG).items()
        if k in data.Source
    }
    

    【讨论】:

    • 感谢您的宝贵时间。你是对的,我需要从 Source 列的节点中测量中心性。但是,当我使用您建议的循环时,它没有给我度中心性的价值。我现在还注意到我的代码 FG.nodes() 返回所有 ID(来自源和目标)。这是我的代码计算两列中所有 ID 的中心值的原因吗?
    • 看我的回答;您正在使用有向边列表,但 readedge 列表假定为无向图。
    【解决方案3】:

    我将假设您的网络旨在定向。所以从第一列到第二列应该存在一条边。

    那么你的代码会变成(注意create_using 参数当你读进去的时候):

    import networkx as nx
    import pandas as pd
    data = pd.read_csv('man_edge.csv')
    FG = nx.from_pandas_edgelist(data, source='Source', target='Target', create_using=nx.DiGraph())
    FG.nodes()
    

    此时FGDiGraph。第一组节点与第二组节点有边。

    degree_dict=nx.out_degree_centrality(FG)
    

    这将仅根据边缘出去(不进来)计算度中心性。没有出边的节点(我相信)值为 0。

    没有你的数据文件我无法测试这个,所以请仔细检查我没有出错。

    【讨论】:

    • 感谢您的宝贵时间和建议。我已经按照您的建议进行了尝试。但它返回的结果与我在问题中列出的相同。它还在计算边缘的度中心性。有什么方法可以在这里分享我的部分数据吗?
    • 你能在FG.out_degree(node) 中查看Target 列中的一些节点吗?
    • 它给了我 AttributeError: 'Graph' object has no attribute 'out_degree'
    • nx.from_pandas_edgelist 命令中,你有create_using 参数吗?您创建了 networkx Graph,而不是 networkx DiGraph(有向图)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多