Commit 50d62cbb authored by Benjam's avatar Benjam
Browse files

ajout nouvelles echelles territoriales supracommunales

parent 42eade4f
......@@ -70,6 +70,7 @@ def lancer_calcul_surface_agricole_utile(nombre_traitements_paralleles: int):
nombre_traitements_paralleles
)
def lancer_etape_crater(etape: Callable):
debut = time.time()
log.info(f"#### DEBUT DE L'ETAPE {etape.__name__} ####")
......@@ -81,7 +82,8 @@ def lancer_etape_crater(etape: Callable):
def lancer_calcul_complet_traitement_crater(nombre_traitements_paralleles: int):
lancer_calcul_territoires()
etapes_parallelisables = [lancer_calcul_population_agricole, lancer_calcul_politique_fonciere, lancer_calcul_pratiques_agricoles, lancer_calcul_production_besoins]
etapes_parallelisables = [lancer_calcul_population_agricole, lancer_calcul_politique_fonciere,
lancer_calcul_pratiques_agricoles, lancer_calcul_production_besoins]
duree_etapes_pool = []
with Pool(processes=nombre_traitements_paralleles) as pool:
duree_etapes_pool = pool.map(lancer_etape_crater, etapes_parallelisables)
......@@ -99,9 +101,11 @@ def lancer_calcul_territoires():
CHEMIN_SOURCE_DEPARTEMENTS,
CHEMIN_SOURCE_REGIONS,
CHEMIN_SOURCE_CODES_POSTAUX,
DOSSIER_CONFIG / "regroupements_geographiques",
CHEMIN_OUTPUT_DATA / DOSSIER_TERRITOIRES
)
# On recharge les dataframes des territoires a partir des fichiers calculés ci-dessus pour avoir systématiquement le même fonctionnement (erreurs d'arrondis possible pour les floats sinon)
# On recharge les dataframes des territoires a partir des fichiers calculés ci-dessus pour avoir systématiquement
# le même fonctionnement (erreurs d'arrondis possible pour les floats sinon)
territoires = charger_referentiel_territoires(CHEMIN_OUTPUT_DATA / DOSSIER_TERRITOIRES)
calculer_donnees_territoires(
......@@ -114,9 +118,7 @@ def lancer_calcul_territoires():
CHEMIN_OUTPUT_DATA / DOSSIER_TERRITOIRES
)
stocker_duree_etape('CALCUL_REFERENTIEL_TERRITOIRES',time.time() - debut )
stocker_duree_etape('CALCUL_REFERENTIEL_TERRITOIRES', time.time() - debut)
def lancer_calcul_population_agricole():
......@@ -199,14 +201,11 @@ def lancer_calcul_cartes():
CHEMIN_OUTPUT_DATA / DOSSIER_POLITIQUE_FONCIERE / 'synthese.csv',
CHEMIN_OUTPUT_DATA / 'crater_geojson'
)
stocker_duree_etape('CALCUL_DONEES_CARTES',time.time() - debut )
stocker_duree_etape('CALCUL_DONEES_CARTES', time.time() - debut)
if __name__ == '__main__':
debut = time.time()
parser = argparse.ArgumentParser()
parser = argparse.ArgumentParser(usage='%(prog)s [OPTIONS] ETAPE_CALCUL\n'
+ 'Permet de lancer une étape ou un groupe d\'étapes de traitements de crater-data\n'
+ "Valeurs possible pour ETAPE_CALCUL :\n"
......
......@@ -8,8 +8,6 @@ import pandas as pd
from crater.crater_logger import log
DictDataFrames: type = Dict[str, pd.DataFrame]
DictTerritoires: type = Dict[str, pd.DataFrame]
Territoires: type = pd.DataFrame
def reinitialiser_dossier(nom_dossier: Path):
if nom_dossier.exists():
......@@ -34,35 +32,6 @@ def comparer_valeurs(a, b):
" - Différence relative = " + str(round((b / a - 1) * 100, 1)) + "%"
def supprimer_donnees_apres_annee_mouvement_commune(
referentiel_territoires: DictTerritoires,
donnees: DictTerritoires,
colonnes_a_vider: List[str],
annee_donnees_sources: int
) -> None:
id_communes_avec_mouvement = referentiel_territoires['communes'].loc[
referentiel_territoires['communes']['annee_dernier_mouvement'] > annee_donnees_sources]
donnees['communes'].loc[
donnees['communes'].id_commune.isin(id_communes_avec_mouvement.id_commune),
colonnes_a_vider
] = np.nan
def supprimer_donnees_apres_annee_mouvement_commune2(
referentiel_territoires: DictTerritoires,
donnees: Territoires,
colonnes_a_vider: List[str],
annee_donnees_sources: int
) -> None:
id_communes_avec_mouvement = referentiel_territoires['communes'].loc[
referentiel_territoires['communes']['annee_dernier_mouvement'] > annee_donnees_sources]
donnees.loc[
donnees.id_commune.isin(id_communes_avec_mouvement.id_commune),
colonnes_a_vider
] = np.nan
def verifier_donnees_communes(
donnnes: pd.DataFrame,
source: pd.DataFrame,
......
......@@ -10,7 +10,7 @@ import crater.politique_fonciere.synthese_politique_fonciere as synthese_politiq
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 traduire_code_insee_vers_id_commune_crater, ids_echelles_geographiques_supracommunales
from crater.territoires.outils import traduire_code_insee_vers_id_commune_crater, IDS_CATEGORIES_TERRITOIRES_SUPRACOMMUNAUX
def calculer_politique_fonciere(
......@@ -68,7 +68,7 @@ def calculer_donnees_politique_fonciere(
territoires: DataFrame,
sources_politique_fonciere : DictDataFrames
) -> DataFrame:
colonnes = ['nom_territoire', 'categorie_territoire'] + ids_echelles_geographiques_supracommunales + ['annee_dernier_mouvement_commune', 'sau_productive_ha', 'population_totale_2017']
colonnes = ['nom_territoire', 'categorie_territoire'] + IDS_CATEGORIES_TERRITOIRES_SUPRACOMMUNAUX + ['annee_dernier_mouvement_commune', 'sau_productive_ha', 'population_totale_2017']
donnees_politique_fonciere = territoires[colonnes]
donnees_artificialisation = sources_politique_fonciere['artificialisation'].rename(
......@@ -92,17 +92,17 @@ def calculer_donnees_politique_fonciere(
donnees_politique_fonciere = outils_territoires.ajouter_donnees_supracommunales_par_somme_donnees_communales(
donnees_politique_fonciere,
'evolution_menages_2011_2016',
'Int64'
type='Int64'
)
donnees_politique_fonciere = outils_territoires.ajouter_donnees_supracommunales_par_somme_donnees_communales(
donnees_politique_fonciere,
'evolution_emplois_2011_2016',
'Int64'
type='Int64'
)
donnees_politique_fonciere = outils_territoires.ajouter_donnees_supracommunales_par_somme_donnees_communales(
donnees_politique_fonciere,
'evolution_menages_emplois_2011_2016',
'Int64'
type='Int64'
)
donnees_politique_fonciere = outils_territoires.ajouter_donnees_supracommunales_par_somme_donnees_communales(
donnees_politique_fonciere,
......@@ -125,7 +125,7 @@ def exporter(
reinitialiser_dossier(chemin_dossier_output)
outils_territoires.exporter_donnees_territoires(
donnees_politique_fonciere['donnees'].drop(columns=['annee_dernier_mouvement_commune'] + ids_echelles_geographiques_supracommunales),
donnees_politique_fonciere['donnees'].drop(columns=['annee_dernier_mouvement_commune'] + IDS_CATEGORIES_TERRITOIRES_SUPRACOMMUNAUX),
(chemin_dossier_output / "donnees.csv")
)
outils_territoires.exporter_donnees_territoires(
......
......@@ -11,7 +11,7 @@ import crater.population_agricole.synthese_population_agricole as synthese_popul
import crater.territoires.outils as outils_territoires
from crater.crater_logger import log
from crater.outils import reinitialiser_dossier, DictDataFrames
from crater.territoires.outils import traduire_code_insee_vers_id_commune_crater, ids_echelles_geographiques_supracommunales
from crater.territoires.outils import traduire_code_insee_vers_id_commune_crater, IDS_CATEGORIES_TERRITOIRES_SUPRACOMMUNAUX
def calculer_population_agricole(
......@@ -71,7 +71,7 @@ def exporter(
reinitialiser_dossier(chemin_dossier_output)
outils_territoires.exporter_donnees_territoires(
population_agricole['donnees'].drop(columns=['annee_dernier_mouvement_commune'] + ids_echelles_geographiques_supracommunales),
population_agricole['donnees'].drop(columns=['annee_dernier_mouvement_commune'] + IDS_CATEGORIES_TERRITOIRES_SUPRACOMMUNAUX),
(chemin_dossier_output / "donnees.csv")
)
outils_territoires.exporter_donnees_territoires(
......@@ -144,7 +144,7 @@ def calculer_donnees_population_agricole(
territoires: DataFrame,
sources_population_agricole: DataFrame
) -> DataFrame:
colonnes = ['nom_territoire', 'categorie_territoire'] + ids_echelles_geographiques_supracommunales + [
colonnes = ['nom_territoire', 'categorie_territoire'] + IDS_CATEGORIES_TERRITOIRES_SUPRACOMMUNAUX + [
'annee_dernier_mouvement_commune', 'population_totale_2010', 'population_totale_1990']
donnees_population_agricole = territoires[colonnes]
......@@ -173,12 +173,12 @@ def calculer_donnees_population_agricole(
donnees_population_agricole = outils_territoires.ajouter_donnees_supracommunales_par_somme_donnees_communales(
donnees_population_agricole,
'actifs_agricoles_permanents_2010',
'Int64'
type='Int64'
)
donnees_population_agricole = outils_territoires.ajouter_donnees_supracommunales_par_somme_donnees_communales(
donnees_population_agricole,
'actifs_agricoles_permanents_1988',
'Int64'
type='Int64'
)
return donnees_population_agricole
......@@ -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_echelles_geographiques_supracommunales
from crater.territoires.outils import IDS_CATEGORIES_TERRITOIRES_SUPRACOMMUNAUX
def calculer_pratiques_agricoles(
......@@ -18,7 +18,7 @@ def calculer_pratiques_agricoles(
) -> None:
log.info("##### CALCUL PRATIQUES AGRICOLES #####")
colonnes = ['nom_territoire', 'categorie_territoire'] + ids_echelles_geographiques_supracommunales + ['annee_dernier_mouvement_commune', 'sau_productive_ha']
colonnes = ['nom_territoire', 'categorie_territoire'] + IDS_CATEGORIES_TERRITOIRES_SUPRACOMMUNAUX + ['annee_dernier_mouvement_commune', 'sau_productive_ha']
donnees_pratiques_agricoles = territoires.loc[:, colonnes]
donnees_pratiques_agricoles = ajouter_indicateur_hvn(
......@@ -46,7 +46,7 @@ def _exporter(
log.info("##### EXPORT PRATIQUES AGRICOLES #####")
reinitialiser_dossier(chemin_dossier_output)
donnees_pratiques_agricoles.drop(columns=['annee_dernier_mouvement_commune'] + ids_echelles_geographiques_supracommunales
donnees_pratiques_agricoles.drop(columns=['annee_dernier_mouvement_commune'] + IDS_CATEGORIES_TERRITOIRES_SUPRACOMMUNAUX
).to_csv(
chemin_dossier_output / "pratiques_agricoles.csv",
sep=";",
......
......@@ -3,15 +3,16 @@ import numpy as np
from pandas import DataFrame
from crater.crater_logger import log
from crater.outils import Territoires, calculerNoteParInterpolation2Seuils
from crater.outils import calculerNoteParInterpolation2Seuils
from crater.pratiques_agricoles.gestionnaire_sources_pratiques_agricoles import importer_surfaces_bio
from crater.territoires.outils import ajouter_donnees_pays_par_somme_donnees_regions, ID_FRANCE
from crater.territoires.outils import ajouter_donnees_regroupements_de_communes_par_somme_donnees_communales, \
ajouter_donnees_pays_par_somme_donnees_regions, ID_FRANCE
def ajouter_indicateur_part_sau_bio(
donnees_pratiques_agricoles: DataFrame,
chemin_fichier_surfaces_bio: Path
) -> Territoires:
) -> DataFrame:
log.info(" => Indicateur Part SAU Bio")
donnees_pratiques_agricoles = _ajouter_donnees_surfaces_bio(
......@@ -38,6 +39,11 @@ def _ajouter_donnees_surfaces_bio(
donnees_pratiques_agricoles.loc[
donnees_pratiques_agricoles.annee_dernier_mouvement_commune > 2020, 'surface_bio_ha'] = np.nan
donnees_pratiques_agricoles = ajouter_donnees_regroupements_de_communes_par_somme_donnees_communales(
donnees_pratiques_agricoles,
'surface_bio_ha'
)
donnees_pratiques_agricoles = ajouter_donnees_pays_par_somme_donnees_regions(
donnees_pratiques_agricoles,
'surface_bio_ha'
......
from pathlib import Path
import pandas
from pandas import DataFrame
from crater.crater_logger import log
from crater.outils import DictTerritoires
from crater.production_besoins.chargeur_sources_production_besoins import \
charger_definition_cultures_et_groupes_cultures_besoins, charger_besoins_parcel, \
charger_repartition_produits_elevage_sur_groupes_cultures, \
charger__produits_hors_elevage_vers_cultures_besoins_humains
from crater.production_besoins.export_production_besoins import _exporter_besoins_par_culture
from crater.territoires.outils import assembler_dict_territoires_en_df_territoires
from crater.territoires.outils import filtrer_et_dupliquer_communes_appartenant_a_une_categorie_de_territoire
def calculer_besoins(territoires: DataFrame,
fichier_besoins_parcel_assiette_actuelle: Path,
......@@ -45,7 +42,7 @@ def _calculer_besoins_par_culture_et_par_assiette(fichier_besoins_parcel,
df_besoins = territoires.reset_index().loc[:,
['id_territoire', 'categorie_territoire', 'nom_territoire', 'id_region']]
df_besoins = _ajouter_colonne_region_appartenance_principale(df_besoins)
df_besoins = _ajouter_colonnes_donnees_besoins_parcel(df_besoins, fichier_besoins_parcel)
df_besoins = _ajouter_colonnes_donnees_besoins_parcel(df_besoins, fichier_besoins_parcel, territoires)
df_besoins = _ajouter_colonnes_cultures_besoins_humains(df_besoins,
fichier_produits_hors_elevage_vers_cultures_besoins_humains)
df_besoins = _ajouter_colonnes_cultures_besoins_animaux(df_besoins,
......@@ -72,45 +69,20 @@ def _ajouter_colonnes_groupes_cultures(df_besoins, fichier_cultures_et_groupes_c
def _ajouter_colonne_region_appartenance_principale(donnees_besoins):
# Plus utile car déjà calculé au niveau du référentiel territoire
# donnees_besoins = _ajouter_colonne_region_appartenance_pour_epcis(donnees_besoins, territoires)
# pour le niveau region et pays, on donne la valeur "id_territoire" (soit l'id_region, soit P-FR pour le pays)
donnees_besoins['id_region'].fillna(donnees_besoins['id_territoire'], inplace=True)
donnees_besoins.loc[donnees_besoins.categorie_territoire == 'PAYS', 'id_region'] = donnees_besoins.loc[donnees_besoins.categorie_territoire == 'PAYS', 'id_territoire']
donnees_besoins.loc[donnees_besoins.categorie_territoire == 'REGION', 'id_region'] = donnees_besoins.loc[donnees_besoins.categorie_territoire == 'REGION', 'id_territoire']
return donnees_besoins
# Plus utilisé car calculé au niveau du calcul référentiel territoire => a supprimer
# def _ajouter_colonne_region_appartenance_pour_epcis(donnees_besoins, territoires):
# nb_communes_par_epci_et_region = (territoires['communes']
# .groupby(['id_epci', 'id_region']).size()
# .reset_index()
# .rename(
# columns={0: "nb_communes_par_epci_et_region", "id_region": "id_region_pour_epci"})
# )
# index_lignes_avec_max_nb_communes = (nb_communes_par_epci_et_region
# .reset_index()
# .groupby(['id_epci'])
# ['nb_communes_par_epci_et_region']
# .idxmax())
#
# region_appartenance_epci = nb_communes_par_epci_et_region.loc[index_lignes_avec_max_nb_communes]
#
# donnees_besoins = donnees_besoins.merge(region_appartenance_epci,
# how='left',
# left_on='id_territoire',
# right_on='id_epci')
#
# donnees_besoins.loc[(donnees_besoins['categorie_territoire'] == 'EPCI'), ['id_region']] = \
# donnees_besoins[donnees_besoins['categorie_territoire'] == 'EPCI']['id_region_pour_epci']
#
# donnees_besoins = donnees_besoins.iloc[:, :-3]
#
# return donnees_besoins
def _ajouter_colonnes_donnees_besoins_parcel(donnees_besoins, fichier_besoins_parcel):
def _ajouter_colonnes_donnees_besoins_parcel(donnees_besoins, fichier_besoins_parcel, territoires):
besoins_parcel_arrondis_2_decimales = charger_besoins_parcel(fichier_besoins_parcel).round(2)
besoins_parcel_arrondis_2_decimales = _ajouter_besoins_regroupements_de_communes(
besoins_parcel_arrondis_2_decimales,
territoires
)
return donnees_besoins.merge(
besoins_parcel_arrondis_2_decimales,
how='left',
......@@ -119,6 +91,22 @@ def _ajouter_colonnes_donnees_besoins_parcel(donnees_besoins, fichier_besoins_pa
).drop(columns='id_territoire_crater')
def _ajouter_besoins_regroupements_de_communes(besoins_parcel_arrondis_2_decimales, territoires):
communes = filtrer_et_dupliquer_communes_appartenant_a_une_categorie_de_territoire(territoires, 'REGROUPEMENT_COMMUNES')
besoins_regroupements_communes = communes.reset_index().loc[:,
['id_territoire', 'categorie_territoire', 'id_regroupement_communes']]
besoins_regroupements_communes = pandas.merge(
besoins_regroupements_communes,
besoins_parcel_arrondis_2_decimales,
how='left',
left_on='id_territoire',
right_on='id_territoire_crater'
).drop(columns={'id_territoire', 'categorie_territoire', 'id_territoire_crater'}
).rename(columns={'id_regroupement_communes': 'id_territoire_crater'})
return pandas.concat([besoins_parcel_arrondis_2_decimales, besoins_regroupements_communes])
def _ajouter_colonnes_cultures_besoins_humains(donnees_besoins,
fichier_produits_hors_elevage_vers_cultures_besoins_humains):
correspondance_produits_hors_elevage = (charger__produits_hors_elevage_vers_cultures_besoins_humains(
......
......@@ -4,7 +4,6 @@ from pandas import DataFrame
import numpy
from crater.crater_logger import log
from crater.outils import DictTerritoires
from crater.production_besoins.besoins import calculer_besoins
from crater.production_besoins.export_production_besoins import _exporter_df_indicateur_par_territoire
from crater.production_besoins.production import calculer_production
......
import pandas
from crater.territoires.outils import CATEGORIES_TERRITOIRES
def _exporter_sau_par_culture(df_production, chemin_dossier_resultats):
_exporter_df_indicateur_par_territoire(df_production,
......@@ -22,8 +22,7 @@ def _exporter_df_indicateur_par_territoire(df_donnees_indicateur_par_territoire,
df_a_exporter['categorie_territoire_pour_tri'] = pandas.Categorical(
df_a_exporter['categorie_territoire'],
categories=["PAYS", "REGION", "DEPARTEMENT", "EPCI",
"COMMUNE"],
categories=CATEGORIES_TERRITOIRES[::-1],
ordered=True)
(df_a_exporter
......
import copy
import pandas
from crater.crater_logger import log
......@@ -8,7 +6,8 @@ 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 assembler_dict_territoires_en_df_territoires
from crater.territoires.outils import CATEGORIES_TERRITOIRES, categories_territoires_hors_communes, \
traduire_categorie_territoire_vers_id_categorie_territoire, filtrer_et_dupliquer_communes_appartenant_a_une_categorie_de_territoire
#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
......@@ -24,7 +23,7 @@ def calculer_production(territoires, fichiers_sau_production, fichier_cultures_e
territoires)
df_production_par_cultures = _ajouter_colonnes_production(df_production_par_cultures, fichiers_sau_production,
fichier_correspondance_cultures_rpg_vers_groupes_cultures)
df_production_par_cultures = _aggreger_production_sur_echelles_territoriales(df_production_par_cultures)
df_production_par_cultures = _aggreger_production_sur_categories_territoires(df_production_par_cultures)
df_production_par_cultures = _ajouter_colonnes_cultures_et_groupes_cultures(df_production_par_cultures,
fichier_cultures_et_groupes_cultures)
production_par_groupe_culture = (df_production_par_cultures
......@@ -73,11 +72,10 @@ def _ajouter_colonnes_cultures_et_groupes_cultures(df_production, fichier_cultur
return df_production
def _aggreger_production_sur_echelles_territoriales(df_production):
df_production = _aggreger_production_sur_echelle_territoriale(df_production, 'id_epci')
df_production = _aggreger_production_sur_echelle_territoriale(df_production, 'id_departement')
df_production = _aggreger_production_sur_echelle_territoriale(df_production, 'id_region')
df_production = _aggreger_production_sur_echelle_territoriale(df_production, 'id_pays')
def _aggreger_production_sur_categories_territoires(df_production):
for categorie_territoire in categories_territoires_hors_communes(CATEGORIES_TERRITOIRES):
df_production = _aggreger_production_sur_categorie_territoire(df_production, categorie_territoire)
return df_production.loc[:, ['id_territoire',
'categorie_territoire',
'nom_territoire',
......@@ -85,12 +83,14 @@ def _aggreger_production_sur_echelles_territoriales(df_production):
'production_culture_ha']]
def _aggreger_production_sur_echelle_territoriale(df_production, nom_colonnes_aggregation):
def _aggreger_production_sur_categorie_territoire(df_production, categorie_territoire):
id_categorie_territoire = traduire_categorie_territoire_vers_id_categorie_territoire(categorie_territoire)
df_production_par_commune = filtrer_et_dupliquer_communes_appartenant_a_une_categorie_de_territoire(df_production, categorie_territoire)
df_indicateur_aggrege = \
df_production.loc[df_production['categorie_territoire'] == 'COMMUNE'].groupby(
[nom_colonnes_aggregation, 'code_culture'],
df_production_par_commune.groupby(
[id_categorie_territoire, 'code_culture'],
as_index=False)[
['production_culture_ha']].sum().set_index([nom_colonnes_aggregation, 'code_culture'])
['production_culture_ha']].sum().set_index([id_categorie_territoire, 'code_culture'])
df_production = df_production.set_index(['id_territoire', 'code_culture'], drop=False)
df_production.update(df_indicateur_aggrege)
df_production = df_production.reset_index(drop=True)
......@@ -104,7 +104,7 @@ def _ajouter_colonnes_production(df_production,
fichier_correspondance_cultures_rpg_vers_groupes_cultures, fichiers_sau_production)
df_production = pandas.merge(df_production, df_production_communes_par_cultures, how='left',
left_on=['id_territoire', 'code_culture'], right_on=['id_commune', 'code_culture'],
suffixes=(False, False))
suffixes=(False, False)).drop(columns=['id_commune'])
df_production.loc[(df_production['categorie_territoire'] == 'COMMUNE'), ['production_culture_ha']] = \
df_production.loc[
(df_production['categorie_territoire'] == 'COMMUNE'), ['production_culture_ha']].fillna(0)
......
......@@ -138,7 +138,7 @@ def charger_communes_sig(
).query("categorie_territoire == 'COMMUNE'"
).rename(columns={'id_territoire':'id_commune'})
outils_territoires.differences_communes(
outils_territoires._differences_territoires(
communes['id_commune'],
communes_sig['id_commune']
)
......
......@@ -127,7 +127,7 @@ def _ajouter_colonne_population_totale(
# les populations totales sont donnés par arrondissements ou communes quand celle-ci n'a pas d'arrondissements
# on doit donc remplacer l'id arrondissement par l'id de sa commune le cas échéant
population_totale_final = population_totale.copy()
arrondissements = outils_territoires.obtenir_arrondissement_depuis_territoires(territoires)
arrondissements = outils_territoires.obtenir_arrondissements_depuis_territoires(territoires)
population_totale_final = ajouter_id_commune_de_arrondissement(
population_totale_final,
arrondissements
......@@ -147,7 +147,7 @@ def _ajouter_colonne_population_totale(
territoires = outils_territoires.ajouter_donnees_supracommunales_par_somme_donnees_communales(
territoires,
'population_totale_2017',
'Int64'
type='Int64'
)
return territoires
......@@ -170,12 +170,12 @@ def _ajouter_colonne_population_totale_historique(
territoires = outils_territoires.ajouter_donnees_supracommunales_par_somme_donnees_communales(
territoires,
'population_totale_2010',
'Int64'
type='Int64'
)
territoires = outils_territoires.ajouter_donnees_supracommunales_par_somme_donnees_communales(
territoires,
'population_totale_1990',
'Int64'
type='Int64'
)
return territoires
......
from pathlib import Path
import numpy as np
import pandas as pd
from pandas import DataFrame
......@@ -9,6 +8,7 @@ import crater.territoires.chargeur_codes_postaux as chargeur_codes_postaux
import crater.territoires.chargeur_communes as chargeur_communes
import crater.territoires.chargeur_departements as chargeur_departements
import crater.territoires.chargeur_epcis as chargeur_epcis
import crater.territoires.chargeur_regroupements_communes as chargeur_regroupements_communes
import crater.territoires.chargeur_mouvements_communes as chargeur_mouvements_communes
import crater.territoires.chargeur_regions as chargeur_regions
import crater.territoires.chargeur_referentiel_territoires as chargeur_referentiel_territoires
......@@ -24,6 +24,7 @@ def calculer_referentiel_territoires(
chemin_fichier_departements: Path,
chemin_fichier_regions: Path,
chemin_fichier_codes_postaux: Path,
chemin_dossier_regroupements_communes: Path,
chemin_dossier_output: Path
) -> None:
sources_territoires = _charger_sources_territoires(
......@@ -32,7 +33,8 @@ def calculer_referentiel_territoires(
chemin_fichier_epcis,
chemin_fichier_departements,
chemin_fichier_regions,
chemin_fichier_codes_postaux
chemin_fichier_codes_postaux,
chemin_dossier_regroupements_communes
)
territoires = _generer_referentiel_territoires(
......@@ -51,7 +53,7 @@ def _generer_referentiel_territoires(sources: DictDataFrames) -> DataFrame:
territoires = _ajouter_id_pays_aux_territoires(territoires)
territoires = _ajouter_id_departement_et_region_aux_epcis(territoires)
territoires = _ajouter_id_departement_et_region_aux_epcis_et_regroupements_de_communes(territoires)
territoires = _ajouter_arrondissements(
territoires,
......@@ -80,10 +82,21 @@ def _assembler_differents_territoires(sources: DictDataFrames) -> DataFrame:
regions = _normaliser_df_territoires(sources['regions'], 'id_region', 'nom_region', "REGION")
pays = _creer_base_de_donnees_pays()
regroupements_de_communes_par_commune = sources['regroupements_de_communes'].sort_values(
by=["id_regroupement_communes"]
).groupby(['id_commune'], as_index=False
).agg({'id_regroupement_communes': '|'.join}
).rename(columns={'id_regroupement_communes': 'ids_regroupements_communes'})
communes = pd.merge(communes, regroupements_de_communes_par_commune.loc[:, ['id_commune', 'ids_regroupements_communes']], left_on='id_territoire', right_on='id_commune', how='left')
regroupements_de_communes = sources['regroupements_de_communes'].loc[:, ['id_regroupement_communes', 'nom_regroupement_communes', 'categorie_regroupement_communes']].drop_duplicates()
regroupements_de_communes = _normaliser_df_territoires(regroupements_de_communes, 'id_regroupement_communes', 'nom_regroupement_communes', "REGROUPEMENT_COMMUNES")
territoires = pd.concat(
[pays,
regions,
departements,
regroupements_de_communes,
epcis,
communes
],
......@@ -117,13 +130,17 @@ def _reordonner_colonnes(territoires: DataFrame) -> DataFrame:
'id_pays',
'id_region',
'id_departement',
'ids_regroupements_communes',
'categorie_regroupement_communes',
'id_epci',
'categorie_epci',
'ids_arrondissements_commune',
'codes_postaux_commune',
'annee_dernier_mouvement_commune',
'type_mouvement_commune'
])
],
fill_value='missing'
)
return territoires
......@@ -159,21 +176,33 @@ def _ajouter_id_pays_aux_territoires(territoires: DataFrame) -> DataFrame:
return territoires
def _ajouter_id_departement_et_region_aux_epcis(territoires: DataFrame) -> DataFrame:
#NB on atrribue le département (et donc la région) qui contient le plus de communes de l'epci
nb_communes_par_epci_et_departement = (territoires.query("categorie_territoire == 'COMMUNE'")
.groupby(['id_epci', 'id_departement']).size()
def _ajouter_id_departement_et_region_aux_epcis_et_regroupements_de_communes(territoires: DataFrame) -> DataFrame:
territoires = _ajouter_id_departement_et_region_aux_ensembles_de_communes(territoires, 'EPCI')
territoires = _ajouter_id_departement_et_region_aux_ensembles_de_communes(territoires, 'REGROUPEMENT_COMMUNES')
return territoires
def _ajouter_id_departement_et_region_aux_ensembles_de_communes(
territoires: DataFrame,
categorie_ensemble_de_communes: str
) -> DataFrame:
#NB on atrribue le département (et donc la région) qui contient le plus de communes de l'ensemble de communes
communes = outils_territoires.filtrer_et_dupliquer_communes_appartenant_a_une_categorie_de_territoire(territoires, categorie_ensemble_de_communes)
id_ensemble_de_communes = outils_territoires.traduire_categorie_territoire_vers_id_categorie_territoire(categorie_ensemble_de_communes)
nb_communes_par_ensemble_de_communes_et_departement = (communes
.groupby([id_ensemble_de_communes, 'id_departement']).size()
.reset_index()
.rename(
columns={0: "nb_communes_par_epci_et_departement"})
columns={0: "nb_communes_par_ensemble_de_communes_et_departement"})
)
index_lignes_avec_max_nb_communes = (nb_communes_par_epci_et_departement
index_lignes_avec_max_nb_communes = (nb_communes_par_ensemble_de_communes_et_departement
.reset_index()
.groupby(['id_epci'])
['nb_communes_par_epci_et_departement']