Commit 2e8bfa39 authored by Benjam's avatar Benjam
Browse files

modification noms categories regroupements communes (plus d’acronymes)

parent c49c4617
......@@ -11,7 +11,8 @@ from crater.politique_fonciere.synthese_politique_fonciere import ajouter_synthe
from crater.crater_logger import log
from crater.outils import reinitialiser_dossier, DictDataFrames
from crater.territoires import outils as outils_territoires
from crater.territoires.outils import IDS_CATEGORIES_TERRITOIRES_SUPRACOMMUNAUX
from crater.reglages import IDS_CATEGORIES_TERRITOIRES_SUPRACOMMUNAUX
def calculer_politique_fonciere(
territoires: DataFrame,
......
from pandas import DataFrame
import crater.outils as outils
import crater.reglages
import crater.territoires.outils as outils_territoires
from crater.crater_logger import log
......@@ -22,7 +23,7 @@ def ajouter_rythme_artificialisation_sau(donnees_politique_fonciere: DataFrame)
)
)
if donnees_politique_fonciere.query(f"id_territoire=='{outils_territoires.ID_FRANCE}'")[
if donnees_politique_fonciere.query(f"id_territoire=='{crater.reglages.ID_FRANCE}'")[
'rythme_artificialisation_sau_valeur_pourcent'][0] <= 0:
raise ValueError('Attention, la valeur moyenne française pose problème vu la définition de calcul de la note !')
......@@ -31,7 +32,7 @@ def ajouter_rythme_artificialisation_sau(donnees_politique_fonciere: DataFrame)
lambda x:
outils.calculerNoteParInterpolation2Seuils(
x['rythme_artificialisation_sau_valeur_pourcent'],
0, donnees_politique_fonciere.query(f"id_territoire=='{outils_territoires.ID_FRANCE}'")[
0, donnees_politique_fonciere.query(f"id_territoire=='{crater.reglages.ID_FRANCE}'")[
'rythme_artificialisation_sau_valeur_pourcent'][0],
10, 0
),
......
......@@ -12,7 +12,8 @@ from crater.population_agricole.evolution_part_population_agricole import \
from crater.population_agricole.part_population_agricole_1988 import ajouter_colonne_part_population_agricole_1988
from crater.population_agricole.part_population_agricole_2010 import ajouter_colonne_part_population_agricole_2010
from crater.population_agricole.synthese_population_agricole import ajouter_colonne_synthese_population_agricole
from crater.territoires.outils import IDS_CATEGORIES_TERRITOIRES_SUPRACOMMUNAUX, trier_territoires
from crater.territoires.outils import trier_territoires
from crater.reglages import IDS_CATEGORIES_TERRITOIRES_SUPRACOMMUNAUX
def calculer_population_agricole(
......
......@@ -3,6 +3,7 @@ import pandas as pd
import numpy as np
import crater.outils as outils
import crater.reglages
import crater.territoires.outils as outils_territoires
from crater.crater_logger import log
......@@ -19,7 +20,7 @@ def ajouter_colonne_evolution_part_population_agricole(population_agricole: Data
# (voir https://pandas.pydata.org/pandas-docs/dev/user_guide/missing_data.html#missing-data-na) ou https://pandas.pydata.org/pandas-docs/dev/whatsnew/v1.2.0.html?highlight=float64dtype
).round(2).astype('float64')
seuil_france = population_agricole.at[outils_territoires.ID_FRANCE,
seuil_france = population_agricole.at[crater.reglages.ID_FRANCE,
'evolution_part_population_agricole_valeur_pt_de_pourcentage']
population_agricole.loc[:, 'evolution_part_population_agricole_note'] = \
......
......@@ -3,6 +3,7 @@ import pandas as pd
import numpy as np
import crater.outils as outils
import crater.reglages
import crater.territoires.outils as outils_territoires
from crater.crater_logger import log
......@@ -18,7 +19,7 @@ def ajouter_colonne_part_population_agricole_1988(donnees_population_agricole: D
# (voir https://pandas.pydata.org/pandas-docs/dev/user_guide/missing_data.html#missing-data-na) ou https://pandas.pydata.org/pandas-docs/dev/whatsnew/v1.2.0.html?highlight=float64dtype
).round(2).astype('float64')
seuil_valeur_france = donnees_population_agricole.query(f"id_territoire=='{outils_territoires.ID_FRANCE}'")[
seuil_valeur_france = donnees_population_agricole.query(f"id_territoire=='{crater.reglages.ID_FRANCE}'")[
'part_population_agricole_1988_valeur_pourcent'][0]
donnees_population_agricole.loc[:, 'part_population_agricole_1988_note'] = \
outils.calculer_note_par_interpolation_2_seuils(
......
......@@ -3,6 +3,7 @@ import pandas as pd
import numpy as np
import crater.outils as outils
import crater.reglages
import crater.territoires.outils as outils_territoires
from crater.crater_logger import log
......@@ -18,7 +19,7 @@ def ajouter_colonne_part_population_agricole_2010(donnees_population_agricole: D
# (voir https://pandas.pydata.org/pandas-docs/dev/user_guide/missing_data.html#missing-data-na) ou https://pandas.pydata.org/pandas-docs/dev/whatsnew/v1.2.0.html?highlight=float64dtype
).round(2).astype('float64')
seuil_valeur_france = donnees_population_agricole.query(f"id_territoire=='{outils_territoires.ID_FRANCE}'")[
seuil_valeur_france = donnees_population_agricole.query(f"id_territoire=='{crater.reglages.ID_FRANCE}'")[
'part_population_agricole_2010_valeur_pourcent'][0]
donnees_population_agricole.loc[:, 'part_population_agricole_2010_note'] = \
outils.calculer_note_par_interpolation_2_seuils(donnees_population_agricole['part_population_agricole_2010_valeur_pourcent'], 0, 0, seuil_valeur_france, 5)
......
......@@ -2,6 +2,7 @@ import numpy as np
import pandas as pd
from pandas import DataFrame
import crater.reglages
import crater.territoires.outils as outils_territoires
import crater.outils as outils
from crater.crater_logger import log
......@@ -19,7 +20,7 @@ def ajouter_colonne_synthese_population_agricole(population_agricole: DataFrame)
# (pour l'instant Int64 et Float6' sont encore expérimentaux)
).round(0).clip(lower=0, upper=10).astype('Int64')
part_population_agricole_2010_valeur_pourcent_FRANCE= population_agricole.query(f"id_territoire=='{outils_territoires.ID_FRANCE}'")[
part_population_agricole_2010_valeur_pourcent_FRANCE= population_agricole.query(f"id_territoire=='{crater.reglages.ID_FRANCE}'")[
'part_population_agricole_2010_valeur_pourcent'][0]
population_agricole.loc[:, 'synthese_message'] = outils.construire_message(
......
......@@ -7,7 +7,7 @@ from crater.pratiques_agricoles.indicateur_part_sau_bio import ajouter_indicateu
from crater.pratiques_agricoles.synthese_pratiques_agricoles import ajouter_synthese_pratiques_agricoles
from crater.outils import reinitialiser_dossier
from crater.territoires.outils import IDS_CATEGORIES_TERRITOIRES_SUPRACOMMUNAUX
from crater.reglages import IDS_CATEGORIES_TERRITOIRES_SUPRACOMMUNAUX
def calculer_pratiques_agricoles(
......
......@@ -6,7 +6,8 @@ from crater.crater_logger import log
from crater.outils import calculerNoteParInterpolation2Seuils
from crater.pratiques_agricoles.gestionnaire_sources_pratiques_agricoles import importer_surfaces_bio
from crater.territoires.outils import ajouter_donnees_regroupements_communes_par_somme_donnees_communales, \
ajouter_donnees_pays_par_somme_donnees_regions, ID_FRANCE
ajouter_donnees_pays_par_somme_donnees_regions
from crater.reglages import ID_FRANCE
def ajouter_indicateur_part_sau_bio(
......
import pandas
from crater.territoires.outils import CATEGORIES_TERRITOIRES
from crater.reglages import CATEGORIES_TERRITOIRES
def _exporter_sau_par_culture(df_production, chemin_dossier_resultats):
_exporter_df_indicateur_par_territoire(df_production,
......
......@@ -6,8 +6,10 @@ from crater.production_besoins.chargeur_sources_production_besoins import _charg
_charger_definition_cultures_et_groupes_cultures_production
from crater.production_besoins.export_production_besoins import _exporter_sau_par_culture
import crater.surface_agricole_utile.chargeur_sau_par_commune_et_culture as chargeur_sau_par_commune_et_culture
from crater.territoires.outils import CATEGORIES_TERRITOIRES, categories_territoires_hors_communes, \
from crater.territoires.outils import categories_territoires_hors_communes, \
traduire_categorie_territoire_vers_id_categorie_territoire, filtrer_et_dupliquer_communes_appartenant_a_une_categorie_de_territoire
from crater.reglages import CATEGORIES_TERRITOIRES
#TODO est-ce qu'on vérifie à un moment que tous les codes RPG ont une translation CRATer, pour ne pasoublie des surfaces
# agricoles? ie que le fichier codes_rpg_vers_codes_cultures.csv est complet
......
from pathlib import Path
CRS_PROJET = "EPSG:2154"
MESSAGE_INITAL_A_REMPLACER = "MESSAGE A REMPLACER"
MESSAGE_DONNEES_NON_DISPONIBLES = "Données non disponibles"
ID_FRANCE = 'P-FR'
CATEGORIES_TERRITOIRES = ['COMMUNE', 'EPCI', 'REGROUPEMENT_COMMUNES', 'DEPARTEMENT', 'REGION', 'PAYS']
IDS_CATEGORIES_TERRITOIRES_SUPRACOMMUNAUX = ['id_epci', 'ids_regroupements_communes', 'id_departement', 'id_region', 'id_pays']
CATEGORIES_REGROUPEMENTS_COMMUNES = {
'ND' : {'categorie': 'NOUVEAU_DEPARTEMENT', 'prefixe_id': 'ND'},
'BV2012' : {'categorie': 'BASSIN_DE_VIE_2012', 'prefixe_id': 'BV2012'},
'PN' : {'categorie': 'PARC_NATIONAL', 'prefixe_id': 'PN'},
'ND' : {'categorie': 'NOUVEAU_DEPARTEMENT', 'prefixe_id': 'ND'},
'PNR' : {'categorie': 'PARC_NATUREL_REGIONAL', 'prefixe_id': 'PNR'},
'PAYS_PETR' : {'categorie': 'PAYS_PETR', 'prefixe_id': 'PAYS_PETR'},
'SCOT' : {'categorie': 'SCHEMA_COHERENCE_TERRITORIAL', 'prefixe_id': 'SCOT'},
'AM' : {'categorie': 'AIRE_METROPOLITAINE', 'prefixe_id': 'AM'},
'PAT' : {'categorie': 'PROJET_ALIMENTAIRE_TERRITORIAL', 'prefixe_id': 'PAT'}
}
NUMEROS_REGIONS_HORS_DROM = range(1, 10, 1)
NUMEROS_DEPARTEMENTS_DROM = ["97", "98"]
CHEMIN_CRATER_DATA_SOURCES = Path("../crater-data-sources")
CHEMIN_SOURCE_COMMUNES_ET_ARRONDISSEMENTS = Path(
......@@ -21,20 +43,19 @@ CHEMIN_SOURCE_REGROUPEMENTS_COMMUNES = Path(
"regroupements_geographiques"
)
FICHIERS_REGROUPEMENTS_COMMUNES = [
{'categorie_regroupement_communes': 'BV2012',
'fichier_source': CHEMIN_SOURCE_REGROUPEMENTS_COMMUNES / "bassins_de_vie_2012" / "2021" / "com2021.xlsx"},
{'categorie_regroupement_communes': 'PN',
'fichier_source': CHEMIN_SOURCE_REGROUPEMENTS_COMMUNES / "parcs_nationaux" / "2021" / "com2021.xlsx"},
{'categorie_regroupement_communes': 'PNR',
'fichier_source': CHEMIN_SOURCE_REGROUPEMENTS_COMMUNES / "parcs_naturels_regionaux" / "2021" / "com2021.xlsx"},
{'categorie_regroupement_communes': 'PAYS_PETR',
'fichier_source': CHEMIN_SOURCE_REGROUPEMENTS_COMMUNES / "pays_et_petr" / "2021" / "com2021.xlsx"},
{'categorie_regroupement_communes': 'SCOT',
'fichier_source': CHEMIN_SOURCE_REGROUPEMENTS_COMMUNES / "urbalyon" / "2021" / "scot.xlsx"},
{'categorie_regroupement_communes': 'AM',
'fichier_source': CHEMIN_SOURCE_REGROUPEMENTS_COMMUNES / "urbalyon" / "2021" / "interscot.xlsx"},
{'categorie_regroupement_communes': 'AM',
'fichier_source': CHEMIN_SOURCE_REGROUPEMENTS_COMMUNES / "urbalyon" / "2021" / "carre_metropolitain.xlsx"}
{'code': 'BV2012',
'fichiers_sources': [CHEMIN_SOURCE_REGROUPEMENTS_COMMUNES / "bassins_de_vie_2012" / "2021" / "com2021.xlsx"]},
{'code': 'PN',
'fichiers_sources': [CHEMIN_SOURCE_REGROUPEMENTS_COMMUNES / "parcs_nationaux" / "2021" / "com2021.xlsx"]},
{'code': 'PNR',
'fichiers_sources': [CHEMIN_SOURCE_REGROUPEMENTS_COMMUNES / "parcs_naturels_regionaux" / "2021" / "com2021.xlsx"]},
{'code': 'PAYS_PETR',
'fichiers_sources': [CHEMIN_SOURCE_REGROUPEMENTS_COMMUNES / "pays_et_petr" / "2021" / "com2021.xlsx"]},
{'code': 'SCOT',
'fichiers_sources': [CHEMIN_SOURCE_REGROUPEMENTS_COMMUNES / "urbalyon" / "2021" / "scot.xlsx"]},
{'code': 'AM',
'fichiers_sources': [CHEMIN_SOURCE_REGROUPEMENTS_COMMUNES / "urbalyon" / "2021" / "interscot.xlsx",
CHEMIN_SOURCE_REGROUPEMENTS_COMMUNES / "urbalyon" / "2021" / "carre_metropolitain.xlsx"]}
]
CHEMIN_SOURCE_GEOMETRIES_DEPARTEMENTS = CHEMIN_CRATER_DATA_SOURCES / 'france_geojson' / '2018' / 'departements.geojson'
......@@ -177,7 +198,3 @@ NOMS_FICHIERS_RPG = {
}
}
CRS_PROJET = "EPSG:2154"
MESSAGE_INITAL_A_REMPLACER = "MESSAGE A REMPLACER"
MESSAGE_DONNEES_NON_DISPONIBLES = "Données non disponibles"
\ No newline at end of file
......@@ -12,7 +12,7 @@ from crater.surface_agricole_utile import chargeur_sau_par_commune_et_culture
from crater.territoires import chargeur_population_totale, chargeur_population_totale_historique, chargeur_territoires_parcel, chargeur_geometries_communes
from crater.territoires.calculateur_referentiel_territoires import charger_referentiel_territoires, ajouter_id_commune_de_arrondissement
from crater.territoires.chargeur_donnees_territoires import charger_donnees_territoires
from crater.territoires.outils import NUMEROS_DEPARTEMENTS_DROM
from crater.reglages import NUMEROS_DEPARTEMENTS_DROM
CODE_CATEGORIE_SAU_PRODUCTIVE = 'PRODUCTIVE'
CODE_CATEGORIE_SAU_PEU_PRODUCTIVE = 'PEU_PRODUCTIVE'
......
......@@ -4,6 +4,7 @@ import numpy as np
import pandas as pd
from pandas import DataFrame
import crater.reglages
import crater.territoires.chargeur_arrondissements as chargeur_arrondissements
import crater.territoires.chargeur_codes_postaux as chargeur_codes_postaux
import crater.territoires.chargeur_communes as chargeur_communes
......@@ -14,7 +15,8 @@ import crater.territoires.chargeur_mouvements_communes as chargeur_mouvements_co
import crater.territoires.chargeur_regions as chargeur_regions
import crater.territoires.chargeur_referentiel_territoires as chargeur_referentiel_territoires
import crater.territoires.outils as outils_territoires
from crater.territoires.outils import IDS_CATEGORIES_TERRITOIRES_SUPRACOMMUNAUX, NUMEROS_DEPARTEMENTS_DROM, NUMEROS_REGIONS_HORS_DROM
from crater.reglages import IDS_CATEGORIES_TERRITOIRES_SUPRACOMMUNAUX, CATEGORIES_REGROUPEMENTS_COMMUNES, \
NUMEROS_REGIONS_HORS_DROM, NUMEROS_DEPARTEMENTS_DROM
from crater.crater_logger import log
from crater.outils import DictDataFrames
......@@ -26,7 +28,7 @@ def calculer_referentiel_territoires(
chemin_fichier_departements: Path,
chemin_fichier_regions: Path,
chemin_fichier_codes_postaux: Path,
fichiers_regroupements_communes: List[Dict[str, str]],
fichiers_regroupements_communes: List[Dict[str, List[Path]]],
chemin_dossier_output: Path
) -> None:
sources_territoires = _charger_sources_territoires(
......@@ -88,7 +90,8 @@ def _generer_referentiel_territoires(sources: DictDataFrames) -> DataFrame:
def _assembler_differents_territoires(sources: DictDataFrames) -> DataFrame:
communes = _normaliser_df_territoires(sources['communes'], 'id_commune', 'nom_commune', 'COMMUNE')
epcis = _normaliser_df_territoires(sources['epcis'], 'id_epci', 'nom_epci', "EPCI")
regroupements_communes = _normaliser_df_territoires(sources['regroupements_communes'], 'id_regroupement_communes', 'nom_regroupement_communes', "REGROUPEMENT_COMMUNES")
regroupements_communes = sources['composition_regroupements_communes'].loc[:, ['id_regroupement_communes', 'nom_regroupement_communes', 'categorie_regroupement_communes']].drop_duplicates()
regroupements_communes = _normaliser_df_territoires(regroupements_communes, 'id_regroupement_communes', 'nom_regroupement_communes', "REGROUPEMENT_COMMUNES")
departements = _normaliser_df_territoires(sources['departements'], 'id_departement', 'nom_departement', "DEPARTEMENT")
regions = _normaliser_df_territoires(sources['regions'], 'id_region', 'nom_region', "REGION")
pays = _creer_base_de_donnees_pays()
......@@ -167,13 +170,13 @@ def _ajouter_annee_dernier_mouvement_communes(
def _creer_base_de_donnees_pays() -> DataFrame:
pays = pd.DataFrame(
{'id_territoire': [outils_territoires.ID_FRANCE], 'nom_territoire': ['France'], 'categorie_territoire': ['PAYS']}
{'id_territoire': [crater.reglages.ID_FRANCE], 'nom_territoire': ['France'], 'categorie_territoire': ['PAYS']}
)
return pays
def _ajouter_id_pays_aux_territoires(territoires: DataFrame) -> DataFrame:
territoires.loc[territoires.categorie_territoire != 'PAYS', 'id_pays'] = outils_territoires.ID_FRANCE
territoires.loc[territoires.categorie_territoire != 'PAYS', 'id_pays'] = crater.reglages.ID_FRANCE
return territoires
......@@ -379,7 +382,7 @@ def _charger_sources_territoires(
chemin_fichier_departements: Path,
chemin_fichier_regions: Path,
chemin_fichier_codes_postaux: Path,
fichiers_regroupements_communes: List[Dict[str, str]]
fichiers_regroupements_communes: List[Dict[str, List[Path]]]
) -> DictDataFrames:
log.info("##### CHARGEMEMENT DES SOURCES DU REFERENTIEL TERRITOIRES #####")
......@@ -392,7 +395,6 @@ def _charger_sources_territoires(
codes_postaux = chargeur_codes_postaux.charger(chemin_fichier_codes_postaux)
composition_regroupements_communes = chargeur_regroupements_communes.charger_composition_regroupements_communes(fichiers_regroupements_communes)
composition_regroupements_communes = _ajouter_nouveau_departement_Rhone(composition_regroupements_communes, communes)
outils_territoires.verifier_absence_na(composition_regroupements_communes, 'id_commune', 'id_regroupement_communes')
communes, epcis = _traiter_communes_sans_epci(communes, epcis)
......@@ -400,18 +402,15 @@ def _charger_sources_territoires(
communes, arrondissements, mouvements_communes, epcis, composition_regroupements_communes, departements, regions, codes_postaux
)
regroupements_communes = composition_regroupements_communes.loc[:, ['id_regroupement_communes', 'nom_regroupement_communes', 'categorie_regroupement_communes']].drop_duplicates()
return {
'communes': communes,
'arrondissements': arrondissements,
'mouvements_communes': mouvements_communes,
'epcis': epcis,
'regroupements_communes': regroupements_communes,
'composition_regroupements_communes': composition_regroupements_communes,
'departements': departements,
'regions': regions,
'codes_postaux': codes_postaux,
'composition_regroupements_communes': composition_regroupements_communes
'codes_postaux': codes_postaux
}
......@@ -420,9 +419,9 @@ def _ajouter_nouveau_departement_Rhone(
communes: DataFrame
) -> DataFrame:
communes_departement_Rhone_sans_metropole_Lyon = communes.loc[(communes.id_departement == "D-69") & (communes.id_epci != "E-200046977"), ['id_commune', 'nom_commune']]
communes_departement_Rhone_sans_metropole_Lyon['id_regroupement_communes'] = 'ND-69D'
communes_departement_Rhone_sans_metropole_Lyon['categorie_regroupement_communes'] = CATEGORIES_REGROUPEMENTS_COMMUNES['ND']['categorie']
communes_departement_Rhone_sans_metropole_Lyon['id_regroupement_communes'] = CATEGORIES_REGROUPEMENTS_COMMUNES['ND']['prefixe_id'] + '-69D'
communes_departement_Rhone_sans_metropole_Lyon['nom_regroupement_communes'] = 'Nouveau-Rhône'
communes_departement_Rhone_sans_metropole_Lyon['categorie_regroupement_communes'] = 'NOUVEAU-DEPARTEMENT'
composition_regroupements_communes = pd.concat([composition_regroupements_communes,
communes_departement_Rhone_sans_metropole_Lyon])
......
......@@ -4,39 +4,51 @@ import pandas as pd
from pandas import DataFrame
from crater.crater_logger import log
from crater.territoires.outils import traduire_code_insee_vers_id_commune_crater
from crater.territoires.outils import traduire_code_insee_vers_id_commune_crater, \
verifier_absence_na, verifier_absence_doublons, verifier_colonne2_unique_par_colonne1, verifier_nommage_ids_territoires
from crater.reglages import CATEGORIES_REGROUPEMENTS_COMMUNES
def charger_composition_regroupements_communes(fichiers: List[Dict[str, str]]) -> DataFrame:
def charger_composition_regroupements_communes(fichiers_regroupements_communes: List[Dict[str, List[Path]]]) -> DataFrame:
df = pd.DataFrame(columns=['id_commune', 'nom_commune', 'id_regroupement_communes', 'nom_regroupement_communes', 'categorie_regroupement_communes'])
df2 = pd.DataFrame(columns=['id_regroupement_communes'])
for rc in fichiers_regroupements_communes:
categorie_regroupement_communes = CATEGORIES_REGROUPEMENTS_COMMUNES[rc['code']]['categorie']
prefixe_id_regroupement_communes = CATEGORIES_REGROUPEMENTS_COMMUNES[rc['code']]['prefixe_id']
for f in rc['fichiers_sources']:
log.info(" => Chargement de la composition des regroupements de communes %s depuis %s", categorie_regroupement_communes, f)
df_a_ajouter = pd.read_excel(
f,
sheet_name=0,
usecols='A:D',
skiprows=4,
dtype='str',
na_values=['']
)
df_a_ajouter.columns = ['id_commune', 'nom_commune', 'id_regroupement_communes', 'nom_regroupement_communes']
df_a_ajouter = _dupliquer_communes_appartenant_a_plusieurs_regroupements(f, df_a_ajouter)
df_a_ajouter = df_a_ajouter.loc[~df_a_ajouter['id_regroupement_communes'].isnull()]
df_a_ajouter['id_regroupement_communes'] = prefixe_id_regroupement_communes + '-' + df_a_ajouter['id_regroupement_communes']
df_a_ajouter['categorie_regroupement_communes'] = categorie_regroupement_communes
for f in fichiers:
categorie_regroupement_communes = f['categorie_regroupement_communes']
fichier_source = f['fichier_source']
log.info(" => Chargement de la composition des regroupements de communes %s depuis %s", categorie_regroupement_communes, fichier_source)
df_a_ajouter = pd.read_excel(
fichier_source,
sheet_name=0,
usecols='A:D',
skiprows=4,
dtype='str',
na_values=['']
)
df_a_ajouter.columns = ['id_commune', 'nom_commune', 'id_regroupement_communes', 'nom_regroupement_communes']
df_a_ajouter = _dupliquer_communes_appartenant_a_plusieurs_regroupements(categorie_regroupement_communes, fichier_source, df_a_ajouter)
df_a_ajouter = df_a_ajouter.loc[~df_a_ajouter['id_regroupement_communes'].isnull()]
df_a_ajouter['id_regroupement_communes'] = categorie_regroupement_communes + '-' + df_a_ajouter['id_regroupement_communes']
df_a_ajouter['categorie_regroupement_communes'] = categorie_regroupement_communes
df = pd.concat([df, df_a_ajouter])
verifier_absence_na(df_a_ajouter, 'id_commune', 'id_regroupement_communes')
verifier_absence_na(df_a_ajouter, 'id_commune', 'nom_regroupement_communes')
verifier_nommage_ids_territoires(df_a_ajouter, 'id_regroupement_communes')
verifier_colonne2_unique_par_colonne1(df_a_ajouter, 'id_regroupement_communes', 'nom_regroupement_communes')
verifier_colonne2_unique_par_colonne1(df_a_ajouter, 'nom_regroupement_communes', 'id_regroupement_communes', warning_only=True)
df = pd.concat([df, df_a_ajouter])
df2 = pd.concat([df2, df_a_ajouter.loc[:, ['id_regroupement_communes']].drop_duplicates()])
_traduire_code_insee_vers_id_crater(df)
verifier_absence_doublons(df2, 'id_regroupement_communes')
return df
def _dupliquer_communes_appartenant_a_plusieurs_regroupements(categorie_regroupement_communes, fichier_source, df):
if categorie_regroupement_communes == 'PNR':
def _dupliquer_communes_appartenant_a_plusieurs_regroupements(fichier_source, df):
if fichier_source.parent.parent.name == 'parcs_naturels_regionaux':
if fichier_source.name == 'com2021.xlsx':
df = _dupliquer_commune_Porte_de_Savoie_appartenant_a_2_PNR(df)
else:
......
......@@ -5,12 +5,7 @@ import geopandas as gpd
from pandas import DataFrame
from crater.crater_logger import log
ID_FRANCE = 'P-FR'
CATEGORIES_TERRITOIRES = ['COMMUNE', 'EPCI', 'REGROUPEMENT_COMMUNES', 'DEPARTEMENT', 'REGION', 'PAYS']
IDS_CATEGORIES_TERRITOIRES_SUPRACOMMUNAUX = ['id_epci', 'ids_regroupements_communes', 'id_departement', 'id_region', 'id_pays']
NUMEROS_REGIONS_HORS_DROM = range(1, 10, 1)
NUMEROS_DEPARTEMENTS_DROM = ["97", "98"]
from crater.reglages import CATEGORIES_TERRITOIRES, NUMEROS_DEPARTEMENTS_DROM
def categories_territoires_hors_communes(categories_territoires):
......@@ -42,15 +37,37 @@ def traduire_code_insee_vers_id_pays_crater(df_colonne):
def verifier_absence_doublons(df: DataFrame, colonne: str) -> None:
if df[colonne].duplicated().any():
doublons = df[df[colonne].duplicated()][colonne].tolist()
raise ValueError("ERREUR : plusieurs exemplaires pour " + colonne + " " + ', '.join(doublons))
doublons = df[df[colonne].duplicated()][colonne].tolist()
if len(doublons) > 0:
if len(doublons) > 100:
doublons = doublons[:100] + ['...']
raise ValueError("ERREUR, plusieurs exemplaires pour : " + colonne + " " + ', '.join(doublons))
def verifier_colonne2_unique_par_colonne1(df: DataFrame, colonne1: str, colonne2: str, warning_only = False) -> None:
nb_uniques_df1 = df.groupby(colonne1).nunique().reset_index()
l1 = nb_uniques_df1[nb_uniques_df1[colonne2]>1][colonne1].to_list()
if len(l1) > 0:
if len(l1) > 100:
l1 = l1[:100] + ['...']
if warning_only:
log.info("ATTENTION, les '" + colonne1 + "' suivants ont plusieurs '" + colonne2 + "' : " + ', '.join(l1))
else:
raise ValueError("ERREUR, les '" + colonne1 + "' suivants ont plusieurs '" + colonne2 + "' : " + ', '.join(l1))
def verifier_absence_na(df: DataFrame, colonne_id: str, colonne: str) -> None:
liste_territoires_colonne_na = df.loc[df[colonne].isnull()].reset_index()[colonne_id].tolist()
if len(liste_territoires_colonne_na) > 0:
raise ValueError("ERREUR : NA dans " + colonne + " pour les territoires " + ', '.join(liste_territoires_colonne_na))
if len(liste_territoires_colonne_na) > 100:
liste_territoires_colonne_na = liste_territoires_colonne_na[:100] + ['...']
raise ValueError("ERREUR, NA dans " + colonne + " pour les territoires : " + ', '.join(liste_territoires_colonne_na))
def verifier_nommage_ids_territoires(df: DataFrame, colonne_id: str) -> None:
liste_territoires_problematiques = df[df[colonne_id].str.contains(' ')][colonne_id].tolist()
if len(liste_territoires_problematiques) > 0:
raise ValueError("ERREUR : des " + colonne_id + " contiennent des espaces : " + ', '.join(liste_territoires_problematiques))
def obtenir_arrondissements_depuis_territoires(territoires: DataFrame) -> DataFrame:
......
......@@ -6,11 +6,11 @@ R-76;Occitanie;REGION;P-FR;;;;;;;3;;;;
D-32;Gers;DEPARTEMENT;P-FR;R-76;;;;;;3;;;;
D-40;Landes;DEPARTEMENT;P-FR;R-75;;;;;;2;;;;
D-75;Paris;DEPARTEMENT;P-FR;R-11;;;;;;1;;;;
PAT-1;Le PAT monocommunal du Gée-Rivière;REGROUPEMENT_COMMUNES;P-FR;R-76;D-32;;PAT;;;1;;;;
PAT-2;Le PAT interdepartemental D-32 (3 communes) D-40 (2 communes);REGROUPEMENT_COMMUNES;P-FR;R-76;D-32;;PAT;;;5;;;;
SCOT-1;Le SCoT monocommunal de Paris;REGROUPEMENT_COMMUNES;P-FR;R-11;D-75;;SCOT;;;1;;;;
SCOT-2;Le SCoT monocommunal de Gée-Rivière;REGROUPEMENT_COMMUNES;P-FR;R-76;D-32;;SCOT;;;1;;;;
SCOT-3;Le SCoT interdepartemental D-32 (3 communes) D-40 (2 communes);REGROUPEMENT_COMMUNES;P-FR;R-76;D-32;;SCOT;;;5;;;;
PAT-1;Le PAT monocommunal du Gée-Rivière;REGROUPEMENT_COMMUNES;P-FR;R-76;D-32;;PROJET_ALIMENTAIRE_TERRITORIAL;;;1;;;;
PAT-2;Le PAT interdepartemental D-32 (3 communes) D-40 (2 communes);REGROUPEMENT_COMMUNES;P-FR;R-76;D-32;;PROJET_ALIMENTAIRE_TERRITORIAL;;;5;;;;
SCOT-1;Le SCoT monocommunal de Paris;REGROUPEMENT_COMMUNES;P-FR;R-11;D-75;;SCHEMA_COHERENCE_TERRITORIAL;;;1;;;;
SCOT-2;Le SCoT monocommunal de Gée-Rivière;REGROUPEMENT_COMMUNES;P-FR;R-76;D-32;;SCHEMA_COHERENCE_TERRITORIAL;;;1;;;;
SCOT-3;Le SCoT interdepartemental D-32 (3 communes) D-40 (2 communes);REGROUPEMENT_COMMUNES;P-FR;R-76;D-32;;SCHEMA_COHERENCE_TERRITORIAL;;;5;;;;
E-200030435;CC d'Aire-sur-l'Adour;EPCI;P-FR;R-76;D-32;;;;COMMUNAUTE_COMMUNES;5;;;;
E-200054781;Métropole du Grand Paris;EPCI;P-FR;R-11;D-75;;;;METROPOLE;1;;;;
C-22016;Île-de-Bréhat (commune sans EPCI);COMMUNE;P-FR;R-53;D-22;;;;;1;;;;
......
......@@ -24,10 +24,8 @@ class TestTerritoires(unittest.TestCase):
CHEMIN_INPUT_DATA / DOSSIER_REFERENTIEL_TERRITOIRES / 'departements.csv',
CHEMIN_INPUT_DATA / DOSSIER_REFERENTIEL_TERRITOIRES / 'regions.csv',
CHEMIN_INPUT_DATA / DOSSIER_REFERENTIEL_TERRITOIRES / 'codes_postaux.csv',
[{'categorie_regroupement_communes': 'PAT',
'fichier_source': CHEMIN_INPUT_DATA / DOSSIER_REFERENTIEL_TERRITOIRES / 'regroupements_geographiques' / 'pat.xlsx'},
{'categorie_regroupement_communes': 'SCOT',
'fichier_source': CHEMIN_INPUT_DATA / DOSSIER_REFERENTIEL_TERRITOIRES / 'regroupements_geographiques' / 'scot.xlsx'}],
[{'code': 'PAT', 'fichiers_sources': [CHEMIN_INPUT_DATA / DOSSIER_REFERENTIEL_TERRITOIRES / 'regroupements_geographiques' / 'pat.xlsx']},
{'code': 'SCOT', 'fichiers_sources': [CHEMIN_INPUT_DATA / DOSSIER_REFERENTIEL_TERRITOIRES / 'regroupements_geographiques' / 'scot.xlsx']}],
CHEMIN_OUTPUT_DATA / DOSSIER_TERRITOIRES
)
......
......@@ -4,7 +4,8 @@ import geopandas as gpd
import numpy as np
from tests.test_outils import augmenter_nombre_colonnes_affichees_pandas
from crater.territoires.outils import verifier_coherence_referentiel_avec_geometries_communes, verifier_absence_doublons, verifier_absence_na
from crater.territoires.outils import verifier_coherence_referentiel_avec_geometries_communes, \
verifier_absence_doublons, verifier_colonne2_unique_par_colonne1, verifier_absence_na, verifier_nommage_ids_territoires
augmenter_nombre_colonnes_affichees_pandas()
......@@ -70,8 +71,43 @@ class TestUnitaireOutilsTerritoires(unittest.TestCase):
# then
with self.assertRaises(Exception):
verifier_absence_doublons(df, 'id')
def test_verifier_colonne2_unique_par_colonne1_ok(self):
# given
df1 = pd.DataFrame(
columns=['id', 'nom'],
data=[['1', 'A'],
['1', 'A']
])
df2 = pd.DataFrame(
columns=['id', 'nom'],
data=[['1', 'A'],
['2', 'A']
])
df3 = pd.DataFrame(
columns=['id', 'nom'],
data=[['1', 'A'],
['1', 'B']
])
# then
verifier_colonne2_unique_par_colonne1(df1, 'id', 'nom')
verifier_colonne2_unique_par_colonne1(df2, 'id', 'nom')
verifier_colonne2_unique_par_colonne1(df3, 'id', 'nom', warning_only=True)
def test_verifier_colonne2_unique_par_colonne1_ko(self):
# given
df = pd.DataFrame(
columns=['id', 'nom'],
data=[['1', 'A'],
['1', 'B']
])
# then
with self.assertRaises(Exception):
verifier_colonne2_unique_par_colonne1(df, 'id', 'nom')
def test_verifier_absence_na_ok(self):
# given
df = pd.DataFrame(
......@@ -93,6 +129,29 @@ class TestUnitaireOutilsTerritoires(unittest.TestCase):
# then
with self.assertRaises(Exception):
verifier_absence_na(df, 'id_territoire', 'colonne')
def test_verifier_nommage_ids_territoires_ok(self):
# given
df = pd.DataFrame(
columns=['id_territoire'],
data=[['nom_sans_espaces']
])
# then
verifier_nommage_ids_territoires(df, 'id_territoire')
def test_verifier_nommage_ids_territoires_ko(self):
# given
df = pd.DataFrame(
columns=['id_territoire'],
data=[['nom_sans_espaces'],
['nom avec_1_espace'],
['nom avec plusieurs espaces']
])
# then
with self.assertRaises(Exception):
verifier_nommage_ids_territoires(df, 'id_territoire')