使用 NetworkX 在图中进行循环检测 Python
Cycle Detection in a Graph using NetworkX Python
我的 CSV 文件有大约 260 万条不同人之间的交易记录。我正在尝试从该文件中制作一个图表:具有唯一 ID 的人作为表示两个人之间交易的节点和边缘,并希望从图表中获取所有可能的周期。我正在尝试使用 networkx.simple_cycles(graph_name)
从该图中获取所有循环,但出现此错误:
NetworkXNotImplemented Traceback (most recent call
last)
<ipython-input-21-c36e4cd0e220> in <module>()
----> 1 nx.simple_cycles(Directed_G)
<decorator-gen-215> in simple_cycles(G)
~\AppData\Local\Continuum\anaconda3\lib\site-
packages\networkx\utils\decorators.py in _not_implemented_for(f, *args,
**kwargs)
64 if match:
65 raise nx.NetworkXNotImplemented('not implemented for %s
type'%
---> 66 '
'.join(graph_types))
67 else:
68 return f(*args,**kwargs)
NetworkXNotImplemented: not implemented for undirected type
我的 Python 代码如下所示:
import pandas as pd
import time
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
data=pd.read_csv(path/to/csv/file)
Directed_G=nx.DiGraph()
Directed_G=nx.from_pandas_dataframe(data, 'from', 'to')
nx.simple_cycles(Directed_G)
我的数据看起来像这样:
from to
0 000028c1f8598db 1a55bc3aab8562f
1 00003147f02a255 9c1f54d9859ce12
2 00003cdc5ed35a0 472f48d28903b43
3 00003cdc5ed35a0 5ab9e7e07978f9d
4 00003cdc5ed35a0 693452b7ae2fd0c
谁能帮我解决这个错误。是否有其他方法可以从该图中找到所有可能的循环?
当你这样做时:
Directed_G=nx.from_pandas_dataframe(data, 'from', 'to')
它从 pandas 数据框创建一个图形,并将该结果分配给名称 Directed_G
。它不会先去检查 Directed_G
以前是哪种图表。因此它使用默认类型(即 Graph
)创建了一个图,并且之前存储在 Directed_G
中的图被覆盖,丢失给了天空中的垃圾收集器。然后查找循环的命令就死了,因为它无法处理无向图。
将可选参数 create_using=DiGraph
添加到对 from_pandas_dataframe
的调用中。
您应该知道在最新版本的 networkx 中 from_pandas_dataframe
已被删除:https://networkx.github.io/documentation/networkx-2.0/release/release_2.0.html
Previously, the function from_pandas_dataframe
assumed that the dataframe has edge-list like structures, but to_pandas_dataframe
generates an adjacency matrix. We now provide four functions from_pandas_edgelist
, to_pandas_edgelist
, from_pandas_adjacency
, and to_pandas_adjacency
.
我的 CSV 文件有大约 260 万条不同人之间的交易记录。我正在尝试从该文件中制作一个图表:具有唯一 ID 的人作为表示两个人之间交易的节点和边缘,并希望从图表中获取所有可能的周期。我正在尝试使用 networkx.simple_cycles(graph_name)
从该图中获取所有循环,但出现此错误:
NetworkXNotImplemented Traceback (most recent call
last)
<ipython-input-21-c36e4cd0e220> in <module>()
----> 1 nx.simple_cycles(Directed_G)
<decorator-gen-215> in simple_cycles(G)
~\AppData\Local\Continuum\anaconda3\lib\site-
packages\networkx\utils\decorators.py in _not_implemented_for(f, *args,
**kwargs)
64 if match:
65 raise nx.NetworkXNotImplemented('not implemented for %s
type'%
---> 66 '
'.join(graph_types))
67 else:
68 return f(*args,**kwargs)
NetworkXNotImplemented: not implemented for undirected type
我的 Python 代码如下所示:
import pandas as pd
import time
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
data=pd.read_csv(path/to/csv/file)
Directed_G=nx.DiGraph()
Directed_G=nx.from_pandas_dataframe(data, 'from', 'to')
nx.simple_cycles(Directed_G)
我的数据看起来像这样:
from to
0 000028c1f8598db 1a55bc3aab8562f
1 00003147f02a255 9c1f54d9859ce12
2 00003cdc5ed35a0 472f48d28903b43
3 00003cdc5ed35a0 5ab9e7e07978f9d
4 00003cdc5ed35a0 693452b7ae2fd0c
谁能帮我解决这个错误。是否有其他方法可以从该图中找到所有可能的循环?
当你这样做时:
Directed_G=nx.from_pandas_dataframe(data, 'from', 'to')
它从 pandas 数据框创建一个图形,并将该结果分配给名称 Directed_G
。它不会先去检查 Directed_G
以前是哪种图表。因此它使用默认类型(即 Graph
)创建了一个图,并且之前存储在 Directed_G
中的图被覆盖,丢失给了天空中的垃圾收集器。然后查找循环的命令就死了,因为它无法处理无向图。
将可选参数 create_using=DiGraph
添加到对 from_pandas_dataframe
的调用中。
您应该知道在最新版本的 networkx 中 from_pandas_dataframe
已被删除:https://networkx.github.io/documentation/networkx-2.0/release/release_2.0.html
Previously, the function
from_pandas_dataframe
assumed that the dataframe has edge-list like structures, butto_pandas_dataframe
generates an adjacency matrix. We now provide four functionsfrom_pandas_edgelist
,to_pandas_edgelist
,from_pandas_adjacency
, andto_pandas_adjacency
.