如何从psycopg2查询结果中有效地创建networkx图?

时间:2017-12-30 02:08:17

标签: python networkx psycopg2

我使用psycopg2使用从Postgres数据库检索到的数据构建networkx图。我可以很好地创建图表,但我想知道是否有更高效和/或Pythonic的方法来实现它。

当前代码:

DG = nx.DiGraph()
cur.execute(edgeQuery)
for row in cur:
    self.DG.add_edge(
        row[0],            # fnode
        row[1],            # tnode
        weight=row[3],     # cost
        name=row[4]
    )

networkx文档表明可以通过输入ebunch一次创建多个边缘。我可以通过迭代光标结果来创建一个强大的功能,但这不会比我当前的解决方案更有效。我觉得有必要将光标结果转换为networkx边缘。也许就像拉链一样?我也想确定一种pythonic方式,以便于日后维护(并满足我自己的好奇心)。

2 个答案:

答案 0 :(得分:0)

假设我理解了你的" cur"的数据结构。正确:您应该能够将其转换为数组,然后切片以获得紧凑的表示法。例如:

import numpy as np
import networkx as nx

graph = nx.DiGraph()
x= np.array([[1,2,0.5,"o"],[3,4,0.2,"a"]])
graph.add_edges_from(x[:,:2],weight = x[:,2], name = x[:,3])

add_edges_from()还可以为你保存for-loop"麻烦" :) 像这样,边缘现在是:

print(graph.edges)
  

[(' 1',' 2'),(' 3',' 4')]

我希望这是你正在寻找的。

答案 1 :(得分:0)

使用 Pandas 有一种更简单的方法。

import pandas as pd
import networkx as nx
import psycopg2

*** define psql variables***
con = psycopg2.connect(host=pg_host, port=pg_port, dbname=dbase, user=user, password=pw,options=f"-c search_path={schema}")

sql = "select a,b from nodetable"


df = pd.read_sql(sql,con)

G = nx.Graph()
G = nx.from_pandas_edgelist(df, 'a', 'b')