Обнаружение цикла на графике с использованием NetworkX Python - PullRequest
0 голосов
/ 10 мая 2018

Мой CSV-файл содержит ~ 2,6 миллиона записей транзакций между разными людьми.Я пытаюсь сделать график из этого файла следующим образом: человек, имеющий уникальные идентификаторы в виде узлов и ребер, представляющих транзакцию между двумя людьми, и хочет извлечь все возможные циклы из графика.Я пытаюсь использовать 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 голосов
/ 10 мая 2018

Когда вы делаете это:

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

создает график из фрейма данных pandas и присваивает полученный результат имени Directed_G. Сначала не проверяется, какой граф Directed_G был ранее. Таким образом, он создает график, используя тип по умолчанию (Graph), а предыдущий график, который был сохранен в Directed_G, перезаписывается и теряется в большом сборщике мусора в небе. Тогда команда для поиска циклов умирает, потому что она не может обработать неориентированный граф.

Добавьте необязательный аргумент create_using=DiGraph к вашему вызову from_pandas_dataframe.

Вы должны знать, что в последней версии сети x from_pandas_dataframe было удалено: https://networkx.github.io/documentation/networkx-2.0/release/release_2.0.html

Ранее функция from_pandas_dataframe предполагала, что в фрейме данных есть структуры, подобные краевому списку, но to_pandas_dataframe генерирует матрицу смежности. Теперь мы предоставляем четыре функции from_pandas_edgelist, to_pandas_edgelist, from_pandas_adjacency и to_pandas_adjacency.

.
...