Calcul de ratio de surface et détection des bâtiments dit de bureaux avec Python et Pandas

— 6 minute read

À l'université , je gère le jeu de données alphanumériques de 258 bâtiments de l'Enseignement Supérieur et de la Recherche dans un outil de Gestion Technique Patrimonial (GTP) qui permet de gérer les plans de nos bâtiments et d'y liés les données relatives.

Cette GTP permet d'interroger via un requêteur les attributs liés à des composants (bâtiments, local, équipements,...) et des tables métiers (Surfaces légales ou Affectataires par exemple) mais ne me permet pas actuellement de faire de l'analytique ou de calculer des ratios pour ensuite mettre à jour des attributs.

Dans le cadre de l'amélioration continue de mon jeu de données, j'ai voulu calculer certains ratios dont mes collègues ont besoins pour leurs opérations :

  • un ratio Surface Utile Brut (SUB)/ Surface Utile Nette (SUN) qui nous sert à identifier les bâtiments à dominante "bureau" au sein de notre patrimoine universitaire,
  • un ratio SUN/ poste de travail qui permet d'apprécier la rationalisation des surfaces de bureaux (avec un objectif de 12m2 par poste de travail.)

et les ajouter dans des attributs de mes bâtiments afin que tout le monde puisse y avoir accès depuis la GTP.

Le jeu de données de base permalink

J'ai créé une requête dans la GTP pour extraire les données de l'attribut 'nombre de poste de travail' de chaque bâtiment ainsi que les codes surface et surface calculée depuis la table métier correspondante.

Cela ressort un fichier Excel structuré comme cela :

BâtimentNombre de poste de travailCode surfaceSurface calculée
Bâtiment A78SDP2 890,57
Bâtiment A78SHOB3917,27
Bâtiment A78SHON3272,12
Bâtiment A78SUB2713,04
Bâtiment A78SUN696,41
Bâtiment B60SDP1344,85

1291 lignes, avec pas mal d'informations en doublon et une structure qui ne permet pas de faire facilement mes calculs de ratio.

Mon script python, décortiqué permalink

import pandas as pd

On importe la lib Pandas, qui va nous permettre de manipuler, nettoyer et structurer nos données.

df= pd.read_excel('export_GTP.xls')

On crée un dataFrame avec les données lues depuis le fichier Excel exporté depuis la GTP.

df2= df.pivot_table(index='Bâtiment', columns='Code surface', values='Surface calculée')
df2= df2.reset_index()

On pivote le dataFrame pour avoir les bâtiments en index et les valeurs de Code surface en colonnes et on le duplique dans un second dataFrame.

df.drop(['Code surface', 'Surface calculée'], axis=1, inplace=True)
df.drop_duplicates(inplace=True)

On supprime les données de Code surface et Surface calculée dans le premier dataFrame puis en élimine tout les doublons de Bâtiment et de Nombre de poste de travail.

df2= df2.set_index('Bâtiment').join(df.set_index('Bâtiment'))
df2.rename(columns={"Nombre de postes de travail":'pdt'}, inplace=True)
df2.drop(['SHOB', 'SHON'], axis=1, inplace=True)

On joint les deux dataFrames en utilisant la colonne Bâtiment comme index de jointure, on renomme Nombre de poste de travail pour se simplifier la vie et on retire deux colonnes de surfaces qui ne sont pas utiles.

df2= df2.assign(sun_sub= lambda x: x.SUN / x.SUB)
df2= df2.assign(sun_pdt= lambda x: x.SUN / x.pdt )
df2.rename(columns={"sun_pdt":'SUN/pdt', "sun_sub":'SUN/SUB'}, inplace=True)

On crée deux nouvelles colonnes dans notre dataFrame que l'on peuple avec les ratios calculés d'après les valeurs des colonnes SUN, SUB et pdt, suivi d'un renommage des libellés de colonnes.

df2= df2.reset_index()
df2= df2.assign(bat_de_bureau='')
for i in range(len(df2)):
if df2.loc[i,'SUN/SUB'] >= .5:
df2.loc[i,'bat_de_bureau'] = 'oui'

On crée une nouvelle colonne bat_de_bureau peuplé de vide dans le dataFrame, puis on parcourt celui-ci avec une boucle en testant si le ratio SUN/SUB est supérieur ou égal à 0.5. Lorsque c'est le cas, on inscrit oui dans la colonne bat_de_bureau.

df2.to_excel('ratio_par_bat.xlsx', index = None, header=True)

Pour finir, on exporte au format Excel le dataFrame, pour import dans la GTP.

Le tableau en sortie permalink

Le fichier de sortie est structuré sans doublon, avec une donnée par colonne sur les 259 lignes et peut-être importer en l'état dans la GTP !

BâtimentSDPSUBSUNpdtSUN/SUBSUN/pdtbat_de_bureau
Bâtiment A8725,788229,781731,87740,21043940423,40364865
Bâtiment B5794,955373,75690,71470,12853407814,69595745
Bâtiment C2055,091881,791365,47710,72562294419,23197183oui
Bâtiment D5170,244661,86930,091690,1995104965,503491124

Webmentions permalink