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
- Exemple en utilisant un filtre 'OU' sur le DataFrame issue d'une 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)
0 commentaires:
Enregistrer un commentaire