首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用边缘数据计算下游数据的最佳方法

用边缘数据计算下游数据的最佳方法
EN

Stack Overflow用户
提问于 2020-01-07 23:09:54
回答 1查看 97关注 0票数 0

我有一个NetworkX问题。我用熊猫DataFrame制作了一个有向图,沿着边缘设置了一些数据。现在,我需要计算节点后代的唯一源的#,并访问edge属性。

这是我的代码,它适用于一个节点,但是我需要传递很多节点到这个节点,并得到唯一的计数。

代码语言:javascript
复制
graph = nx.from_pandas_edgelist(df, source="source", target="target", 
           edge_attr=["domain", "category"], create_using=nx.DiGraph)
downstream_nodes = list(nx.descendants(graph, node))
downstream_nodes.append(node)
subgraph = graph.subgraph(downstream_nodes).copy()

domain_sources = {}
for s, t, v in subgraph.edges(data=True):
    if v["domain"] in domain_sources:
        domain_sources[v["domain"]].append(s)
    else:
        domain_sources[v["domain"]] = [s]

down_count = {}
for k, v in domain_sources.items():
    down_count[k] = len(list(set(v)))

它可以工作,但是,同样,对于一个节点来说,时间并不是什么大事,但是我至少要在40到50个节点上提供这个例程。这是最好的方法吗?我还能做些什么来根据边缘属性进行分组并唯一地计数节点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-08 20:35:49

两个可能的改进:

  1. 从创建子图的行中删除副本。你没有改变任何东西,而且副本是多余的。
  2. 创建一个具有set键的默认值。阅读更多的这里
代码语言:javascript
复制
from collections import defaultdict
import networkx as nx

# missing part of df creation

graph = nx.from_pandas_edgelist(df, source="source", target="target", 
           edge_attr=["domain", "category"], create_using=nx.DiGraph)
downstream_nodes = list(nx.descendants(graph, node))
downstream_nodes.append(node)
subgraph = graph.subgraph(downstream_nodes)

domain_sources = defaultdict(set)
for s, t, v in subgraph.edges(data=True):
    domain_sources[v["domain"]].add(s)

down_count = {}
for k, v in domain_sources.items():
    down_count[k] = len(set(v))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59637382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档