2017-12-30 5 views
0

Ich baue ein Netzwerkx-Diagramm mit Daten von einem Postgres-DB mit psycopg2 abgerufen. Ich kann den Graphen gut erstellen, aber ich frage mich, ob es einen effizienteren und/oder pythonischen Weg gibt, dies zu tun.Wie kann ich aus den psycopg2-Abfrageergebnissen effizient einen Netzwerkx-Graph erstellen?

Aktuelle Code:

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] 
    ) 

Die NetworkX Dokumentation zeigt mehr Kanten auf einmal erstellt werden können in einem ebunch durch die Fütterung. Ich könnte einen E-Bunch erstellen, indem ich die Cursor-Ergebnisse wiederhole, aber das wäre nicht effizienter als meine aktuelle Lösung. Ich habe das Gefühl, dass es einen effizienteren Weg geben muss, meine Cursor-Ergebnisse in Netzwerk-Kanten zu übersetzen. Vielleicht etwas wie Zip? Ich würde auch gerne einen Python-Weg finden, um es für die zukünftige Wartung zu vereinfachen (und um meine eigene Neugier zu befriedigen).

Antwort

0

Angenommen, ich verstehe die Datenstruktur Ihres "cur" korrekt: Sie sollten in der Lage sein, es in ein Array zu konvertieren und dann für eine kompakte Notation zu schneiden. Zum Beispiel:

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]) 

die add_edges_from() speichert Sie auch die for-Schleife "Trouble" :) Wie diese sind die Kanten jetzt:

print(graph.edges) 

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

Ich hoffe, dass Sie das suchen.

Verwandte Themen