1 janv. 2022

[Dynamo += Python] Nomenclature vers DataFrame (Pandas)

 




Vous souhaitez plus de filtre et de contrôle sur vos nomenclatures pour analyser vos données ? Suivez le Panda 😀 🐼

if this article is not in your language, use the Google Translate widget (bottom of page for Mobile version)

Bien que les nomenclatures puissent être exportées en au format txt/csv, pour ensuite êtres importés dans Pandas avec Python3 (Google Collab est parfait pour cela, la majorité des librairies Data Science sont préinstallées), voici une alternative sans export avec Dynamo et le moteur CPython3.

Pour exemple, on prendra des nomenclatures d'espaces avec 2 valeurs de puissances surfaciques d'éclairage :

  • Les puissances surfaciques Pecl (W/m²) résultants des luminaires de la maquette.
  • Les puissances surfaciques Pecl (W/m²) définit par l'étude thermique et renseignés au préalable sous Revit par type d'espace.

Le but dans l'exemple ci-dessous est d'obtenir uniquement pour 2 niveaux des statistiques sommaires sur les types d'espace dont les puissances surfaciques d'éclairage dépasseraient les valeurs de la RT (ici on ne tiendra pas compte des coefficients C1 et C2).

J'utilise ici un Wrapper permettant d'envelopper un objet DataFrame dans une classe Python avec rajout de méthodes personnalisées, cela permet également de transférer facilement une instance de classe d'un nœud Python a un autre.

La Classe Python 

  • Exemple en concaténant 2 Nomenclatures (1 nomenclature pour chaque niveau)

import clr
import sys
import re
import System

WrapDFrame = IN[0] # import class

viewschA = UnwrapElement(IN[1])
viewschB = UnwrapElement(IN[2])

# create DataFrame 1
objdfA = WrapDFrame(viewschA)
# create DataFrame 2
objdfB = WrapDFrame(viewschB)
# concat objects with same 'append' method of Pandas.DataFrame
objdfC = objdfA.Append(objdfB, ignore_index = False, sort = False)
# remove NaN values
dfC = objdfC.UnwrapDFrame.dropna()
# change Index with space Number
dfC = dfC.set_index("Numéro")
# add column 
dfC["DifferenceRT/Réelle"] = dfC.iloc[:, -1] - dfC.iloc[:, -2]
# Create an new instance of WrapDFrame with describe by Name of Space
objdfD = WrapDFrame(dfC.groupby(["Type d'espace"]).describe().sort_values(by=('DifferenceRT/Réelle', 'min')))
# view in Html
objdfD.ToHTML()
OUT = objdfD

Note :
La méthode 'Append' est une de méthode de remplacement (Overriding Method) qui appelle la méthode d'origine  'append' d'un DataFrame (avec les mêmes arguments), 'concatenate' pourrait par ailleurs être utilisée.

  • Exemple en utilisant un filtre 'OU' sur le DataFrame issue d'une Nomenclature
Pour ceux qui ont toujours voulu mettre un filtre 'OU' dans un filtre de Nomenclature ....

import clr
import sys
import re
import System
           
WrapDFrame = IN[0] # import class          

viewschAllLvl = UnwrapElement(IN[1])

# create DataFrame 1
objdfA = WrapDFrame(viewschAllLvl)
# remove nan values
dfC = objdfA.UnwrapDFrame.dropna()
# change Index with space Number
dfC = dfC.set_index("Numéro")
# Get only Level 1 and Level 2
dfC = dfC[(dfC["Niveau"] == "Level 1") | (dfC["Niveau"] == "Level 2")]
# add column 
dfC["DifferenceRT/Réelle"] = dfC.iloc[:, -1] - dfC.iloc[:, -2]
# Create an new instance of WrapDFrame with describe by Name of Space
objdfD = WrapDFrame(dfC.groupby(["Type d'espace"]).describe().sort_values(by=('DifferenceRT/Réelle', 'min')))
# view in Html
objdfD.ToHTML()
OUT = objdfD

Résultat



À noter que pour ce simple exemple un résultat similaire peut être obtenu via les propriétés de la nomenclature (sauf pour le tri)



Ressources :

Aperçu en Vidéo

Land Of Pirates by Alexander Nakarada
Link: https://filmmusic.io/song/4961-land-of-pirates
License: https://filmmusic.io/standard-license
Circus Monkey by Alexander Nakarada
Link: https://filmmusic.io/song/8423-circus-monkey
License: https://filmmusic.io/standard-license



Dans un prochain article, on verra quelques exemples avec Seaborn

🌟🌟🌟 Bonne Année et Meilleurs Vœux à tous 🌟🌟🌟

0 commentaires:

Enregistrer un commentaire