Backend pandas¶
pandas range le graphe dans deux tableaux : une ligne par nœud, une ligne par relation. Utilisez-le quand l'étape suivante est un tableur, un rapport ou une jointure avec d'autres données.
Dépendances¶
pandas est un extra optionnel :
pip install "ddigraph[pandas]"
Utilisation de base¶
import os
from ddigraph.backends.pandas import to_dataframes
frames = to_dataframes(os.environ["FIXTURE"])
print(len(frames.nodes), "nœuds,", len(frames.relationships), "relations")
print(frames.nodes["node_label"].value_counts())
La source peut être du DDI XML de n'importe quelle variante, ou un export
RDF comme survey.ttl. Vous pouvez aussi passer des blocs déjà obtenus avec
ddigraph.iter_graph().
Les deux tableaux¶
frames.nodes a une ligne par nœud :
node_labelest le type du nœud, par exempleVariable.node_idest sa clé. Elle est unique au sein de son type.- Chaque autre colonne est un champ. Les types n'ont pas les mêmes champs : le tableau en contient l'union, et la plupart des cellules d'une ligne sont vides.
frames.relationships a une ligne par relation, avec cinq colonnes :
start_label, start_id, type, end_label et end_id.
Les colonnes sont celles de ddigraph export --format csv : fichiers et
tableaux sont interchangeables.
Un type à la fois¶
frames.of(label) renvoie les nœuds d'un type, avec seulement les colonnes
que ce type utilise :
import os
from ddigraph.backends.pandas import to_dataframes
frames = to_dataframes(os.environ["FIXTURE"])
questions = frames.of("QuestionItem")
print(questions.columns.tolist())
Joindre les tableaux¶
Une relation désigne ses deux extrémités par type et clé. Joignez sur les deux pour récupérer ce qu'il vous faut de chaque extrémité :
import os
from ddigraph.backends.pandas import to_dataframes
frames = to_dataframes(os.environ["FIXTURE"])
ends = frames.nodes[["node_label", "node_id", "label"]]
linked = frames.relationships.merge(
ends,
left_on=["start_label", "start_id"],
right_on=["node_label", "node_id"],
).merge(
ends,
left_on=["end_label", "end_id"],
right_on=["node_label", "node_id"],
suffixes=("_start", "_end"),
)
print(linked[["label_start", "type", "label_end"]])
Enregistrer¶
import pandas as pd
frames.nodes.to_csv("nodes.csv", index=False)
frames.relationships.to_csv("relationships.csv", index=False)
with pd.ExcelWriter("survey.xlsx") as writer: # requiert openpyxl, inclus dans l'extra
frames.nodes.to_excel(writer, sheet_name="nodes", index=False)
frames.relationships.to_excel(writer, sheet_name="relationships", index=False)
Voir aussi¶
- NetworkX - Le même graphe, pour les algorithmes de graphes
- Gremlin - Le même graphe, dans une base de données
- Export en ligne de commande - Les mêmes tableaux, en fichiers CSV