# Approach1
Вот один из подходов: каждая строка из кадра данных берется в качестве края графа ориентированного графа с использованием NetworkX
и ищет shortest_path
из Account
к различным целям :
import numpy as np
a = df.values
# check correspondence with value in next row and first col
m = np.r_[False, (a[:-1, 1] != a[1:, 0])].cumsum()
# array([0, 0, 0, 1, 1, 2], dtype=int32)
# get indices of where theres is not a correspondence
m_diff = np.r_[m[:-1] != m[1:], True]
# array([False, False, True, False, True, True])
# get targets of all paths
targets = a[m_diff, 1]
# array(['Plastic', 'TokenVault', 'SavingsAccount'], dtype=object)
# define a directed graph using networkx
import networkx as nx
#add edges from the graph
G = nx.from_pandas_edgelist(df, source='Name', target='Includes')
#find all shortest paths from Account to the different found targets
[nx.shortest_path(G, 'Account', target) for target in targets]
[['Account', 'ProductAccount', 'CardAccount', 'Plastic'],
['Account', 'ProductAccount', 'CardAccount', 'Token', 'TokenVault'],
['Account', 'SavingsAccount']]
# Approach2
Другой способ найти график конечные узлы можно посмотреть на градус и оставьте те, которые имеют степень 1:
G = nx.from_pandas_edgelist(df, source='Name', target='Includes')
[nx.shortest_path(G, 'Account', node) for node, degree in G.degree() if degree==1]
[['Account', 'ProductAccount', 'CardAccount', 'Plastic'],
['Account', 'ProductAccount', 'CardAccount', 'Token', 'TokenVault'],
['Account', 'SavingsAccount']]
Для визуального понимания решаемой задачи графика:
pos = nx.spring_layout(G, scale=20)
nx.draw(G, pos, node_color='lightblue', node_size=500, with_labels=True)
Как мы видим, зная источники и цели , которые нужно искать, используя nx.shortest_path
, мы можем получить путь между Account
и полученными целями