18 août 2023

[Dynamo += Python] Pandas DataFrame extension

 




Étendre les capacités de Pandas avec les extensions
if this article is not in your language, use the Google Translate widget ⬈ (bottom of page for Mobile version )


Pandas, la bibliothèque Python populaire pour la manipulation et l'analyse de données, offre une grande flexibilité grâce à ses nombreuses fonctionnalités intégrées. Cependant, il y a des moments où vous pourriez souhaiter ajouter des fonctionnalités spécifiques à votre domaine.
C'est là que la fonction pd.api.extensions.register_dataframe_accessor entre en jeu.

pd.api.extensions.register_dataframe_accessor est une fonctionnalité avancée de Pandas qui vous permet d'ajouter des méthodes et des attributs personnalisés à un DataFrame.

Dans l'exemple ci-après, on va rajouter des méthodes pour afficher des Dataframes (ou graphes) au fur et à mesure de notre analyse. Ici, sera fait une simple analyse des tailles de chemin de câbles dans un projet.


Le moteur Python utilisé sera CPython3  (à ce jour ce moteur utilise PythonNet 2.5.x qui nécessite une implémentation assez particulière dès lors que l'on veut manipuler des objets .Net)

Note :
IronPython et PythonNet ont tous les deux des avantages, l'un est natif .Net l'autre rend possible l'utilisation de bibliothèques populaire Python. Autant profiter des 2.


Le script dynamo est constitué de 2 nœuds :


  •  un premier nœud Python qui affichera les DataTables et les Graphiques dans un Winform

    Note : l'affichage se fait au moyen d'un WebBrowser et la mise à jour du code html se fait par la mise à jour d'une propriété (getter et setter)
    La classe nécessite d'être une .Net Classe (voir documentation PythonNet)
    • Implémentation de l'attribut __namespace__
    • Modification de la propriété HtmlText via clrproperty (propriété accessible depuis le CLR)
  • un deuxième nœud Python où seront implémentées les méthodes d'extension Pandas

    • Une méthode  Show()  qui prend en arguments le nombre de lignes à afficher (si égal à 0  affiche tout le Dataframe).
      La méthode ne s'applique que sur un objet Dataframe, si vous avez un objet Series, il faudra au préalable le convertir avec la méthode to_frame()

    • Une méthode Plot() pour tracer quelques graphiques. Afin d'éviter de créer une méthode d'extension pour chaque méthode, celle-ci prend en argument le type de méthode Dataframe.plot sous forme de chaine de caractères.




Exemple d'arguments pour la méthode d'extension Plot




On pourrait ainsi ajouter autant de méthodes d'extension que l'on souhaite, pourquoi pas une méthode Save() pour sauvegarder le contenu HTML dans un fichier 💾.


Notes Importantes
A contrario d'une .Net DataTable (Microsoft.Data) ou d'un .Net DataFrame (Microsoft.Data.Analysis) un Dataframe pandas ne supporte pas complètement les objets .Net.
En conséquence, avant toutes opérations de type groupby ou autre, il sera nécessaire de supprimer les colonnes comportant des objets .Net pour éviter les erreurs (via un drop).




code python "dataframe extension"
MAJ 30/04/2024 code réunis dans un seul nœud python CPython3
https://gist.github.com/Cyril-Pop/0fa9c7465632fd78395ad203f6668ffc
.

Exemple en vidéo 



Ressources
  • documentation Pandas - lien 
  • script Dynamo (dyn) - lien


"Tout ce qui est impossible reste à accomplir". (Jules Verne)



0 commentaires:

Enregistrer un commentaire