Python: лучший способ создать сеть? - PullRequest
0 голосов
/ 30 мая 2018

У меня есть фрейм данных, содержащий информацию о транзакциях между двумя компаниями

df    
      idA   idB   amount  nameA  nameB
0      4     5     300     xxx    yyy
1      3     7     150     kkk    uuu 
2      3     6     289     kkk    vvv
3      1     4     189     hhh    iii

Я хочу создать сеть с использованием пакета networkx.

G=nx.Graph()
for i in df.index:
    G.add_node(df['idA'][i], name = df['nameA'][i])
    G.add_node(df['idB'][i], name = df['nameB'][i])
    G.add_edge(df['idA'][i], df['idB'][i], weight = df['amount'][i] )

Мне интересноесли есть более эффективный способ

1 Ответ

0 голосов
/ 30 мая 2018

ответ - да.Просто посмотрите на эту документацию: https://networkx.github.io/documentation/latest/reference/generated/networkx.convert_matrix.from_pandas_edgelist.html

В вашем случае я бы сделал:

G=nx.from_pandas_edgelist(df, 'idA', 'idB', ['amount'])

В случае, если вы добавите какой-либо другой атрибут к узлам, следуйте этой документации: https://networkx.github.io/documentation/networkx-1.9/reference/generated/networkx.classes.function.set_node_attributes.html

РЕДАКТИРОВАТЬ: Извините, но я не заметил, что из сети x 2.0 from_pandas_dataframe был удален.Большое спасибо @tohv, который ответил на этот вопрос здесь

Наконец, как я заметил, это оптимизированные функции.Если мы сравним их скорость при выполнении одной и той же функции цикла for, разница будет постоянной.

from random import randint
import pandas as pd
import networkx as nx
from time import time
import numpy as np

df = pd.DataFrame()
df['a'] = [randint(0, 100) for _ in range(10000)]
df['b'] = [randint(0, 100) for _ in range(10000)]

c = 0
runs = []
while c <= 100:
    G=nx.Graph()
    start = time()
    for i in df.index:
        G.add_node(df['a'][i], name = df['a'][i])
        G.add_node(df['b'][i], name = df['b'][i])
        G.add_edge(df['a'][i], df['b'][i])

    run = time() - start
    runs.append(run)
    c += 1

print ('done in:', np.mean(runs), 'seconds')

сделано за: 0,6191224154859486 секунд

c = 0
runs = []
while c <= 100:
    G=nx.Graph()
    start = time()
    G=nx.from_pandas_edgelist(df, 'a', 'b')
    run = time() - start
    runs.append(run)
    c += 1

print ('done in:', np.mean(runs), 'seconds')

сделано за: 0,014413160852866598 секунд

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...