使用NetworkX Python在图表中进行循环检测

时间:2018-05-10 19:27:37

标签: python graph networkx cycle-detection

我的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

有人可以帮我解决这个错误。可以通过其他方式从该图中找到所有可能的周期吗?

1 个答案:

答案 0 :(得分:1)

执行此操作时:

Directed_G=nx.from_pandas_dataframe(data, 'from', 'to')

它从pandas数据框创建一个图形,并将结果分配给名称Directed_G。它没有去检查先前的Directed_G图形类型Graph。因此,它使用默认类型(Directed_G)创建图形,并且存储在create_using=DiGraph中的上一个图形被覆盖,丢失到天空中的大垃圾收集器。然后找到循环的命令就会消失,因为它无法处理无向图。

将可选参数from_pandas_dataframe添加到您对from_pandas_dataframe的调用中。

您应该知道,在最新版本的networkx from_pandas_dataframe已被删除:https://networkx.github.io/documentation/networkx-2.0/release/release_2.0.html

  

以前,函数to_pandas_dataframe假设数据框具有类似边缘列表的结构,但from_pandas_edgelist生成邻接矩阵。我们现在提供四种功能to_pandas_edgelistfrom_pandas_adjacencyto_pandas_adjacencyvr <- list( babies=0.3, kids=0.5, teens=0.75, adults=0.98 ) Ax <- expression( matrix(c( 0,0,0,0,teens*0.5,adults*0.8, babies,0,0,0,0,0, 0,kids,0,0,0,0, 0,0,kids,0,0,0, 0,0,0,teens,0,0, 0,0,0,0,teens,adults), ncol=6, byrow = TRUE )) A1 <- eval(Ax, vr) lambda(A1) [1] 1.011821