Commit 01e65f50 authored by Lionel DURAND's avatar Lionel DURAND
Browse files

Vectorisation calcul du message artificialisation

parent 82f5d23e
......@@ -3,7 +3,7 @@ from pandas import DataFrame
import numpy as np
import crater.politique_fonciere.chargeur_artificialisation as chargeur_artificialisation
from crater.politique_fonciere.politique_artificialisation import ajouter_politique_artificialisation
from crater.politique_fonciere.politique_artificialisation import ajouter_message_politique_artificialisation
from crater.politique_fonciere.rythme_artificialisation_sau import ajouter_rythme_artificialisation_sau
from crater.politique_fonciere.sau_par_habitant import ajouter_sau_par_habitant
from crater.politique_fonciere.synthese_politique_fonciere import ajouter_synthese_politique_fonciere
......@@ -25,7 +25,7 @@ def calculer_politique_fonciere(
territoires,
sources_politique_fonciere
)
donnees_politique_fonciere = ajouter_politique_artificialisation(donnees_politique_fonciere)
donnees_politique_fonciere = ajouter_message_politique_artificialisation(donnees_politique_fonciere)
donnees_politique_fonciere = ajouter_sau_par_habitant(donnees_politique_fonciere)
donnees_politique_fonciere = ajouter_rythme_artificialisation_sau(donnees_politique_fonciere)
donnees_politique_fonciere = ajouter_synthese_politique_fonciere(donnees_politique_fonciere)
......
......@@ -4,40 +4,50 @@ from crater.crater_logger import log
from crater.politique_fonciere.parametres import SEUIL_ARTIFICIALISATION_HA_QUASI_NULLE_OU_NEGATIVE
def ajouter_politique_artificialisation(donnees_politique_fonciere: DataFrame) -> DataFrame:
log.info(" => Indicateur politique d'artificialisation")
donnees_politique_fonciere.loc[:, 'politique_artificialisation_valeur'] = (
donnees_politique_fonciere.apply(
lambda x:
_politique_artificialisation_valeur(
x['evolution_menages_emplois_2011_2016'],
x['artificialisation_2011_2016_ha'],
x['artificialisation_2011_2016_sur_superficie_pourcent']
),
axis=1
).astype(pd.StringDtype())
def ajouter_message_politique_artificialisation(donnees_politique_fonciere: DataFrame) -> DataFrame:
log.info(" => Indicateur message politique d'artificialisation")
return _ajouter_colonne_message_artificialisation(donnees_politique_fonciere)
def _ajouter_colonne_message_artificialisation(df):
df['politique_artificialisation_valeur'] = ""
df['politique_artificialisation_valeur'] = df['politique_artificialisation_valeur'].astype(pd.StringDtype())
df['politique_artificialisation_valeur'] = (
df['politique_artificialisation_valeur']
.mask(
df['artificialisation_2011_2016_ha'] <= SEUIL_ARTIFICIALISATION_HA_QUASI_NULLE_OU_NEGATIVE,
"L'objectif Zéro Artificialisation Nette a été atteint entre 2011 et 2016 !")
.mask(
(df['artificialisation_2011_2016_ha'] > SEUIL_ARTIFICIALISATION_HA_QUASI_NULLE_OU_NEGATIVE)
& (df['evolution_menages_emplois_2011_2016'].isna() | df['evolution_menages_emplois_2011_2016'] > 0),
_construire_message_artificialisation_positive_sans_perte_menages(df))
.mask(
(df['artificialisation_2011_2016_ha'] > SEUIL_ARTIFICIALISATION_HA_QUASI_NULLE_OU_NEGATIVE)
& (df['evolution_menages_emplois_2011_2016'] <= 0),
_construire_message_artificialisation_positive_avec_perte_menages(df))
)
return df
def _construire_message_artificialisation_positive_sans_perte_menages(df):
return (df['politique_artificialisation_valeur'] +
"Attention l'objectif Zéro Artificialisation Nette n'a pas été atteint entre 2011 et 2016 puisque " +
df['artificialisation_2011_2016_ha'].map('{:,.0f}'.format) +
" ha (soit " +
df['artificialisation_2011_2016_sur_superficie_pourcent'].map('{:,.1f}'.format) +
"% de la superficie totale du territoire) ont été artificialisés."
).str.replace(',', ' ')
def _construire_message_artificialisation_positive_avec_perte_menages(df):
return (df['politique_artificialisation_valeur'] +
"Attention le territoire a été à rebours de l'objectif Zéro Artificialisation Nette entre 2011 et 2016 puisque " +
df['artificialisation_2011_2016_ha'].map('{:,.0f}'.format) +
" ha (soit " +
df['artificialisation_2011_2016_sur_superficie_pourcent'].map('{:,.1f}'.format).replace(',', ' ') +
"% de la superficie totale du territoire) ont été artificialisés alors que le territoire a perdu " +
(df['evolution_menages_emplois_2011_2016'] * -1).map('{:,.0f}'.format) +
" ménages + emplois !"
).str.replace(',', ' ')
return donnees_politique_fonciere
def _politique_artificialisation_valeur(evolution_menages_emplois_2011_2016, artificialisation_2011_2016_ha, artificialisation_2011_2016_sur_superficie_pourcent):
if artificialisation_2011_2016_ha <= SEUIL_ARTIFICIALISATION_HA_QUASI_NULLE_OU_NEGATIVE:
return "L'objectif Zéro Artificialisation Nette a été atteint entre 2011 et 2016 !"
elif artificialisation_2011_2016_ha > 0 and (
pd.isna(evolution_menages_emplois_2011_2016) or evolution_menages_emplois_2011_2016 > 0):
return ("Attention l'objectif Zéro Artificialisation Nette n'a pas été atteint entre 2011 et 2016 puisque " +
"{:,.0f} ha (soit {:,.1f}% de la superficie totale du territoire) ont été artificialisés.").format(
artificialisation_2011_2016_ha,
artificialisation_2011_2016_sur_superficie_pourcent
).replace(',', ' ')
elif artificialisation_2011_2016_ha > 0 and evolution_menages_emplois_2011_2016 <= 0:
return ("Attention le territoire a été à rebours de l'objectif Zéro Artificialisation Nette entre 2011 et 2016 puisque " +
"{:,.0f} ha (soit {:,.1f}% de la superficie totale du territoire) ont été artificialisés" +
" alors que le territoire a perdu {:,.0f} ménages + emplois !").format(
artificialisation_2011_2016_ha,
artificialisation_2011_2016_sur_superficie_pourcent,
-1 * evolution_menages_emplois_2011_2016
).replace(',', ' ')
......@@ -15,12 +15,12 @@ def ajouter_synthese_politique_fonciere(donnees_politique_fonciere: DataFrame) -
donnees_politique_fonciere = _ajouter_colonne_synthese_note(donnees_politique_fonciere)
donnees_politique_fonciere = _ajouter_colonne_message(donnees_politique_fonciere)
donnees_politique_fonciere = _ajouter_colonne_message_synthese(donnees_politique_fonciere)
return donnees_politique_fonciere
def _ajouter_colonne_message(donnees_politique_fonciere):
def _ajouter_colonne_message_synthese(donnees_politique_fonciere):
donnees_politique_fonciere.loc[:, 'synthese_message'] = (
donnees_politique_fonciere.apply(
lambda x:
......
......@@ -6,14 +6,15 @@ import pandas as pd
from crater.politique_fonciere.parametres import SEUIL_SAU_PAR_HAB_M2_REGIME_TRES_VEGETAL, \
SEUIL_SAU_PAR_HAB_M2_REGIME_MOINS_CARNE, SEUIL_SAU_PAR_HAB_M2_REGIME_ACTUEL, \
SEUIL_ARTIFICIALISATION_HA_QUASI_NULLE_OU_NEGATIVE
from crater.politique_fonciere.politique_artificialisation import ajouter_politique_artificialisation
from crater.politique_fonciere.politique_artificialisation import ajouter_message_politique_artificialisation, \
_ajouter_colonne_message_artificialisation
from crater.politique_fonciere.synthese_politique_fonciere import _ajouter_colonne_synthese_note, \
_ajouter_colonne_message
_ajouter_colonne_message_synthese
from tests.test_outils import augmenter_nombre_colonnes_affichees_pandas
augmenter_nombre_colonnes_affichees_pandas()
ARTIFICIALISATION_HA_POSITIVE = SEUIL_ARTIFICIALISATION_HA_QUASI_NULLE_OU_NEGATIVE + 1
ARTIFICIALISATION_HA_POSITIVE = SEUIL_ARTIFICIALISATION_HA_QUASI_NULLE_OU_NEGATIVE + 1000
class TestUnitairePolitiqueFonciere(unittest.TestCase):
......@@ -48,7 +49,7 @@ class TestUnitairePolitiqueFonciere(unittest.TestCase):
])
# when
df_resultat = _ajouter_colonne_message(df_politique_fonciere)
df_resultat = _ajouter_colonne_message_synthese(df_politique_fonciere)
# then
resultat_attendu = pd.Series(
......@@ -62,8 +63,8 @@ class TestUnitairePolitiqueFonciere(unittest.TestCase):
],
dtype=pd.StringDtype())
self.assertEqual(df_resultat['synthese_message'].tolist(), resultat_attendu.tolist())
self.assertEqual(df_resultat['synthese_message'].dtype, resultat_attendu.dtype)
self.assertEqual(resultat_attendu.tolist(), df_resultat['synthese_message'].tolist())
self.assertEqual(resultat_attendu.dtype, df_resultat['synthese_message'].dtype)
def test_message_artificialisation_politique_fonciere(self):
# given
......@@ -82,21 +83,21 @@ class TestUnitairePolitiqueFonciere(unittest.TestCase):
])
# when
df_resultat = ajouter_politique_artificialisation(df_politique_fonciere)
df_resultat = ajouter_message_politique_artificialisation(df_politique_fonciere)
# then
resultat_attendu = pd.Series(
data=
[
"L'objectif Zéro Artificialisation Nette a été atteint entre 2011 et 2016 !",
"Attention l'objectif Zéro Artificialisation Nette n'a pas été atteint entre 2011 et 2016 puisque 1 ha (soit 25.0% de la superficie totale du territoire) ont été artificialisés.",
"Attention l'objectif Zéro Artificialisation Nette n'a pas été atteint entre 2011 et 2016 puisque 1 ha (soit 25.0% de la superficie totale du territoire) ont été artificialisés.",
"Attention le territoire a été à rebours de l'objectif Zéro Artificialisation Nette entre 2011 et 2016 puisque 1 ha (soit 25.0% de la superficie totale du territoire) ont été artificialisés alors que le territoire a perdu 1 ménages + emplois !"
"Attention l'objectif Zéro Artificialisation Nette n'a pas été atteint entre 2011 et 2016 puisque 1 000 ha (soit 25.0% de la superficie totale du territoire) ont été artificialisés.",
"Attention l'objectif Zéro Artificialisation Nette n'a pas été atteint entre 2011 et 2016 puisque 1 000 ha (soit 25.0% de la superficie totale du territoire) ont été artificialisés.",
"Attention le territoire a été à rebours de l'objectif Zéro Artificialisation Nette entre 2011 et 2016 puisque 1 000 ha (soit 25.0% de la superficie totale du territoire) ont été artificialisés alors que le territoire a perdu 1 ménages + emplois !"
],
dtype=pd.StringDtype())
self.assertEqual(df_resultat['politique_artificialisation_valeur'].tolist(), resultat_attendu.tolist())
self.assertEqual(df_resultat['politique_artificialisation_valeur'].dtype, resultat_attendu.dtype)
self.assertEqual(resultat_attendu.tolist(), df_resultat['politique_artificialisation_valeur'].tolist(), )
self.assertEqual(resultat_attendu.dtype, df_resultat['politique_artificialisation_valeur'].dtype)
if __name__ == '__main__':
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment