python - 乘法和添加权重networkx图python
问题描述
我之前问过一个关于在 networkx 中乘以权重以找到有向图中节点的总体份额的问题。如果 2 个节点之间只有一条路径,则提供的解决方案效果很好,但如果有多个路径,则失败。一个简单的例子:
import pandas as pd
data = pd.DataFrame({'shop': ['S1', 'S1', 'S2', 'S2', 'S3'],
'owner': ['S2', 'S3', 'O1', 'O2', 'O1'],
'share': [0.8, 0.2, 0.5, 0.5, 1.0]})
owner shop share
0 S2 S1 0.8
1 S3 S1 0.2
2 O1 S2 0.5
3 O2 S2 0.5
4 O1 S3 1.0
创建图表:
import networkx as nx
G = nx.from_pandas_edgelist(data,'shop','owner',edge_attr = ('share'),
create_using=nx.DiGraph())
pos=nx.spring_layout(G, k = 0.5, iterations = 20)
node_labels = {node:node for node in G.nodes()}
nx.draw_networkx(G, pos, labels = node_labels, arrowstyle = '-|>',
arrowsize = 20, font_size = 15, font_weight = 'bold')
要获得 O1 对 S1 的份额,需要将 2 条路径相乘然后相加。以前的解决方案无法做到这一点。有没有办法做到这一点?
解决方案
您可以通过以下方式修改以前的解决方案:
from operator import mul
import pandas as pd
import networkx as nx
from functools import reduce
data = pd.DataFrame({'shop': ['S1', 'S1', 'S2', 'S2', 'S3'],
'owner': ['S2', 'S3', 'O1', 'O2', 'O1'],
'share': [0.8, 0.2, 0.5, 0.5, 1.0]})
G = nx.from_pandas_edgelist(data,'shop','owner',edge_attr = ('share'),
create_using=nx.DiGraph())
owners = set(data['owner'])
shops = set(data['shop'])
result = []
summary = {}
for shop in shops:
for owner in owners:
for path in nx.all_simple_paths(G, shop, owner):
share = reduce(mul, (G[start][end]['share'] for start, end in zip(path[:-1], path[1:])), 1)
summary[(owner, shop)] = summary.get((owner, shop), 0) + share
summary = pd.DataFrame.from_dict(summary, orient = 'index', columns = 'share'.split())
print(summary)
输出
share
(O2, S2) 0.5
(O2, S1) 0.4
(S3, S1) 0.2
(O1, S2) 0.5
(O1, S3) 1.0
(O1, S1) 0.6
(S2, S1) 0.8
该行:
share = reduce(mul, (G[start][end]['share'] for start, end in zip(path[:-1], path[1:])), 1)
计算特定路径的份额。然后使用下一行在所有路径上聚合此份额:
summary[(owner, shop)] = summary.get((owner, shop), 0) + share
推荐阅读
- c# - 获取错误的屏幕尺寸(C#/ Winforms)
- java - 为什么在 Java 的 Tensorflow 中出现“维度 0 的切片索引 0 越界”错误?
- c++ - 无法将景观 LayerInfo 对象分配给景观
- python - Python 无法读取 .def 文件,我不知道为什么?
- angular - 如何在另一个 forkjoin 中调用 forkJoin?
- java - 使用 JAVA 反射如何创建自定义 JSON 对象映射
- python - Python 2.7.11 使分段错误
- mybatis - 根据 Mybatis 提供的 key 从 Map 中取值
- .htaccess - 如何使用新域的 .htaccess 通过旧域的 DNS 上的别名从旧域重定向到新域
- python - Selenium WebDriver :: 在 UI 操作和 API 请求之间切换