Commit 82f5d23e authored by Lionel DURAND's avatar Lionel DURAND
Browse files

Ajout TU pour note et messages, et ajustement règle de calcul en utilisant un...

Ajout TU pour note et messages, et ajustement règle de calcul en utilisant un seuil pour l'artif nulle (<= 0.1 ha)
parent 9217e0f4
......@@ -12,7 +12,6 @@ from crater.outils import reinitialiser_dossier, DictDataFrames
from crater.territoires import outils as outils_territoires
from crater.territoires.outils import traduire_code_insee_vers_id_commune_crater, IDS_CATEGORIES_TERRITOIRES_SUPRACOMMUNAUX
def calculer_politique_fonciere(
territoires: DataFrame,
chemin_fichier_artificialisation: Path,
......
seuil_regime_tres_vegetal = 1700 #m2 de sau par habitant
seuil_regime_moins_carne = 2500 #m2 de sau par habitant
seuil_regime_actuel = 4000 #m2 de sau par habitant
\ No newline at end of file
SEUIL_SAU_PAR_HAB_M2_REGIME_TRES_VEGETAL = 1700 #m2 de sau par habitant
SEUIL_SAU_PAR_HAB_M2_REGIME_MOINS_CARNE = 2500 #m2 de sau par habitant
SEUIL_SAU_PAR_HAB_M2_REGIME_ACTUEL = 4000 #m2 de sau par habitant
SEUIL_ARTIFICIALISATION_HA_QUASI_NULLE_OU_NEGATIVE = 0.1 #Seuil en hectare à partir duquel on considère qu'il n'y a pas d'artificialisation
import pandas as pd
from pandas import DataFrame
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:
......@@ -15,14 +16,14 @@ def ajouter_politique_artificialisation(donnees_politique_fonciere: DataFrame) -
x['artificialisation_2011_2016_sur_superficie_pourcent']
),
axis=1
)
).astype(pd.StringDtype())
)
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 <= 0:
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):
......
......@@ -4,7 +4,7 @@ import pandas as pd
import crater.outils as outils
from crater.crater_logger import log
from crater.politique_fonciere.parametres import seuil_regime_tres_vegetal, seuil_regime_actuel
from crater.politique_fonciere.parametres import SEUIL_SAU_PAR_HAB_M2_REGIME_TRES_VEGETAL, SEUIL_SAU_PAR_HAB_M2_REGIME_ACTUEL
def ajouter_sau_par_habitant(donnees_politique_fonciere: DataFrame) -> DataFrame:
log.info(" => Indicateur sau par habitant")
......@@ -25,7 +25,7 @@ def ajouter_sau_par_habitant(donnees_politique_fonciere: DataFrame) -> DataFrame
lambda x:
outils.calculerNoteParInterpolation3Seuils(
x['sau_par_habitant_valeur_m2_par_hab'],
0, seuil_regime_tres_vegetal, seuil_regime_actuel,
0, SEUIL_SAU_PAR_HAB_M2_REGIME_TRES_VEGETAL, SEUIL_SAU_PAR_HAB_M2_REGIME_ACTUEL,
0, 5, 10
),
axis=1
......
import pandas as pd
from pandas import DataFrame
import numpy as np
import crater.outils as outils
from crater.crater_logger import log
from crater.politique_fonciere.parametres import seuil_regime_tres_vegetal, seuil_regime_moins_carne, seuil_regime_actuel
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
def ajouter_synthese_politique_fonciere(donnees_politique_fonciere: DataFrame) -> DataFrame:
log.info(" => Synthèse")
donnees_politique_fonciere.loc[:, 'synthese_note'] = (
donnees_politique_fonciere.apply(
lambda x:
_note(
x['sau_par_habitant_note'],
x['rythme_artificialisation_sau_note']
),
axis=1
)
)
donnees_politique_fonciere = _ajouter_colonne_synthese_note(donnees_politique_fonciere)
donnees_politique_fonciere = _ajouter_colonne_message(donnees_politique_fonciere)
return donnees_politique_fonciere
def _ajouter_colonne_message(donnees_politique_fonciere):
donnees_politique_fonciere.loc[:, 'synthese_message'] = (
donnees_politique_fonciere.apply(
lambda x:
......@@ -29,9 +30,22 @@ def ajouter_synthese_politique_fonciere(donnees_politique_fonciere: DataFrame) -
x['synthese_note']
),
axis=1
)
).astype(pd.StringDtype())
)
return donnees_politique_fonciere
def _ajouter_colonne_synthese_note(donnees_politique_fonciere):
donnees_politique_fonciere.loc[:, 'synthese_note'] = (
donnees_politique_fonciere.apply(
lambda x:
_note(
x['sau_par_habitant_note'],
x['rythme_artificialisation_sau_note']
),
axis=1
)
)
return donnees_politique_fonciere
......@@ -61,7 +75,7 @@ def _message(
[sau_par_habitant_valeur_m2_par_hab,
"la surface agricole par habitant ",
"croissant",
[seuil_regime_tres_vegetal, seuil_regime_moins_carne, seuil_regime_actuel],
[SEUIL_SAU_PAR_HAB_M2_REGIME_TRES_VEGETAL, SEUIL_SAU_PAR_HAB_M2_REGIME_MOINS_CARNE, SEUIL_SAU_PAR_HAB_M2_REGIME_ACTUEL],
["est trop faible",
"peut convenir pour un régime très végétal",
"peut convenir pour un régime moins carné",
......@@ -71,7 +85,7 @@ def _message(
[artificialisation_2011_2016_ha,
"l’objectif <abbr title='Zéro Artificialisation Nette'>ZAN</abbr> ",
"décroissant",
[0],
[SEUIL_ARTIFICIALISATION_HA_QUASI_NULLE_OU_NEGATIVE],
["n’a pas été atteint entre 2011 et 2016",
"a été atteint entre 2011 et 2016"],
[0, 1]
......
import unittest
import numpy as np
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.synthese_politique_fonciere import _ajouter_colonne_synthese_note, \
_ajouter_colonne_message
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
class TestUnitairePolitiqueFonciere(unittest.TestCase):
def test_note_synthese_politique_fonciere(self):
# given
df_politique_fonciere = pd.DataFrame(
columns=['sau_par_habitant_note', 'rythme_artificialisation_sau_note'],
data=[[9, 2]
])
resultat_attendu = pd.Series(
data=[6.0
],
dtype='float64')
# when
df_resultat = _ajouter_colonne_synthese_note(df_politique_fonciere)
# then
pd.testing.assert_series_equal(df_resultat['synthese_note'], resultat_attendu, check_names=False)
def test_message_synthese_politique_fonciere(self):
# given
df_politique_fonciere = pd.DataFrame(
columns=['sau_par_habitant_valeur_m2_par_hab', 'artificialisation_2011_2016_ha', 'synthese_note'],
data=[
[SEUIL_SAU_PAR_HAB_M2_REGIME_TRES_VEGETAL - 1, SEUIL_ARTIFICIALISATION_HA_QUASI_NULLE_OU_NEGATIVE,
np.nan],
[SEUIL_SAU_PAR_HAB_M2_REGIME_TRES_VEGETAL - 1, SEUIL_ARTIFICIALISATION_HA_QUASI_NULLE_OU_NEGATIVE, 1],
[SEUIL_SAU_PAR_HAB_M2_REGIME_MOINS_CARNE - 1, SEUIL_ARTIFICIALISATION_HA_QUASI_NULLE_OU_NEGATIVE, 1],
[SEUIL_SAU_PAR_HAB_M2_REGIME_ACTUEL - 1, SEUIL_ARTIFICIALISATION_HA_QUASI_NULLE_OU_NEGATIVE, 1],
[SEUIL_SAU_PAR_HAB_M2_REGIME_ACTUEL + 1, SEUIL_ARTIFICIALISATION_HA_QUASI_NULLE_OU_NEGATIVE, 1],
[SEUIL_SAU_PAR_HAB_M2_REGIME_ACTUEL + 1, ARTIFICIALISATION_HA_POSITIVE, 1]
])
# when
df_resultat = _ajouter_colonne_message(df_politique_fonciere)
# then
resultat_attendu = pd.Series(
data=
["Données non disponibles",
"L’objectif <abbr title='zéro artificialisation nette'>zan</abbr> <strong>a été atteint entre 2011 et 2016</strong> mais la surface agricole par habitant <strong>est trop faible</strong>",
"La surface agricole par habitant <strong>peut convenir pour un régime très végétal</strong> et l’objectif <abbr title='Zéro Artificialisation Nette'>ZAN</abbr> <strong>a été atteint entre 2011 et 2016</strong>",
"La surface agricole par habitant <strong>peut convenir pour un régime moins carné</strong> et l’objectif <abbr title='Zéro Artificialisation Nette'>ZAN</abbr> <strong>a été atteint entre 2011 et 2016</strong>",
"La surface agricole par habitant <strong>est suffisante pour le régime actuel</strong> et l’objectif <abbr title='Zéro Artificialisation Nette'>ZAN</abbr> <strong>a été atteint entre 2011 et 2016</strong>",
"La surface agricole par habitant <strong>est suffisante pour le régime actuel</strong> mais l’objectif <abbr title='Zéro Artificialisation Nette'>ZAN</abbr> <strong>n’a pas été atteint entre 2011 et 2016</strong>"
],
dtype=pd.StringDtype())
self.assertEqual(df_resultat['synthese_message'].tolist(), resultat_attendu.tolist())
self.assertEqual(df_resultat['synthese_message'].dtype, resultat_attendu.dtype)
def test_message_artificialisation_politique_fonciere(self):
# given
ARTIFICIALISATION_SUR_SAU_25_POURCENT = 25
EVOLUTION_MENAGES_POSITIVE = 2
EVOLUTION_MENAGES_NEGATIVE_OU_NULLE = -1
df_politique_fonciere = pd.DataFrame(
columns=['evolution_menages_emplois_2011_2016', 'artificialisation_2011_2016_ha',
'artificialisation_2011_2016_sur_superficie_pourcent'],
data=[
[np.nan, SEUIL_ARTIFICIALISATION_HA_QUASI_NULLE_OU_NEGATIVE, np.nan],
[np.nan, ARTIFICIALISATION_HA_POSITIVE, ARTIFICIALISATION_SUR_SAU_25_POURCENT],
[EVOLUTION_MENAGES_POSITIVE, ARTIFICIALISATION_HA_POSITIVE, ARTIFICIALISATION_SUR_SAU_25_POURCENT],
[EVOLUTION_MENAGES_NEGATIVE_OU_NULLE, ARTIFICIALISATION_HA_POSITIVE,
ARTIFICIALISATION_SUR_SAU_25_POURCENT]
])
# when
df_resultat = ajouter_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 !"
],
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)
if __name__ == '__main__':
unittest.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