Skip to content
Snippets Groups Projects
Commit 29874cbd authored by sandcha's avatar sandcha
Browse files

Merge branch 'analyse-strates' into 'main'

Initialise un notebook de calcul des impacts sur les strates

See merge request !8
parents 0a054831 8c0ee708
Branches
No related tags found
1 merge request!8Initialise un notebook de calcul des impacts sur les strates
# CHANGELOG
# 4.0.0 [!8](https://git.leximpact.dev/leximpact/simulateur-dotations-communes/data-exploration/-/merge_requests/8)
* Améliore et ajoute des calculs.
* Périmètre métier : DGF des communes (DF, DSR, DSU, DCN), territoires communaux.
* Période : 2021, 2024
* Détails :
* Corrige `dotations_2024/analyse_2024.ipynb`
* Met à jour `leximpact-dotations-back` de `^1.0.0` à `^2.0.0`
* Inclut la construction de simulation 2024 via `DotationsSimulation` de `leximpact_dotations_back`
* Inclut la mise à jour d'`openfisca-france-dotations-locales` à la v.`4.2.0` pour corriger une erreur de période de `dotations_2024/analyse_2024.ipynb`
* Ajoute un `.env` pour la configuration de `DotationsSimulation` 2024 et stabiliser le calcul des chemins de fichiers de données
* Ajoute les données INSEE des communes depuis 1943 `insee_commune_depuis_1943.csv` (code officiel géographique 2024) pour la `DCN`
* Met à jour `data/criteres_repartition_2024.csv` pour récupérer les valeurs de `DF` formatées en nombre
* Ajoute `dotations_2024/analyse_strates.ipynb`
* Ajoute les strates 2021 à `dotations_2021/simulation_2021.ipynb` et `utils/simulation_2021.py`
## 3.4.0 [!4](https://git.leximpact.dev/leximpact/simulateur-dotations-communes/data-exploration/-/merge_requests/4/)
* Ajoute des calculs.
* Périmètre métier : DGF des communes (DF, DSR, DSU, DCN), territoires communaux
* Périmètre métier : DGF des communes (DF, DSR, DSU, DCN), territoires communaux.
* Période : 2024
* Détails :
* Met à jour les données de critères 2024 `data/criteres_repartition_2024.csv`
......
This diff is collapsed.
......@@ -9,14 +9,17 @@ On traite de deux sujets :
## Exploration du calcul des dotations communales
Deux types de fichiers de données sont présents :
Trois types de fichiers de données sont présents :
* Les fichiers des montants des différentes dotations accordés à chaque commune par année
* Le fichier des critères de répartition utilisés pour le calcul des dotations. Ce fichier comprend aussi les montants des dotations
* Le fichier des communes depuis 1943 de l'INSEE fournissant la date de création des communes à partir de cette année-là et utile à l'estimation de la Dotation en faveur des Communes Nouvelles (DCN)
Les données ont été converties au format csv pour facilité leur manipulation dans le projet.
### Téléchargement
#### Données DGCL
Les données sont accessibles et téléchargeables via le [site](http://www.dotations-dgcl.interieur.gouv.fr/consultation/accueil.php) de la DGCL.
Pour la notification officielle des montants de dotations, la DGCL met à disposition un fichier par type de dotation et par année.
......@@ -36,6 +39,12 @@ Ils sont téléchargeables via cette [page](http://www.dotations-dgcl.interieur.
Pour les critères de répartition, la DGCL met à disposition un fichier par année et par type de collectivité (commune, EPCI, département, région).
Ils sont téléchargeables via cette [page](http://www.dotations-dgcl.interieur.gouv.fr/consultation/criteres_repartition.php) en choississant l'année et le type de dotation à l'aide des menus déroulants.
#### Données INSEE
Pour l'initialisation du calcul sur la DCN on emploie les données de l'INSEE, communes depuis 1943 : [COG millésime 2024](https://www.insee.fr/fr/information/7766585) > `Communes depuis 1943` > Téléchargement du CSV.
On obtient alors `v_commune_depuis_1943.csv` que l'on renomme en `insee_commune_depuis_1943.csv`
## Exploration de la liste des communes
La liste des communes est issue de la première notification annuelle des dotations (fichiers publiés le 15 avril au plus tard).
......
This diff is collapsed.
%% Cell type:code id: tags:
``` python
from data_exploration.utils.simulation_2021 import dotations_criteres_2021 as dgcl_data_2021
```
%% Output
Loading /Users/sch/dev/gitruc/data-exploration/data/criteres_repartition_2020.csv
/Users/sch/dev/gitruc/data-exploration/data_exploration/utils/utils.py:14: DtypeWarning: Columns (2,14,36,37,153,184,188,189,191) have mixed types. Specify dtype option on import or set low_memory=False.
data = pandas.read_csv(path, decimal=",", dtype={code_insee: str})
Loading /Users/sch/dev/gitruc/data-exploration/data/criteres_repartition_2021.csv
/Users/sch/dev/gitruc/data-exploration/data_exploration/utils/utils.py:14: DtypeWarning: Columns (2,14,36,37,38,153,186,190,191,192,193) have mixed types. Specify dtype option on import or set low_memory=False.
data = pandas.read_csv(path, decimal=",", dtype={code_insee: str})
Loading /Users/sch/dev/gitruc/data-exploration/data/criteres_repartition_2022.csv
%% Cell type:markdown id: tags:
/Users/sch/dev/gitruc/data-exploration/data_exploration/utils/utils.py:14: DtypeWarning: Columns (2,14,43,125,155,157,158,159,160,162,175,176,196,198,200,201,202,203) have mixed types. Specify dtype option on import or set low_memory=False.
data = pandas.read_csv(path, decimal=",", dtype={code_insee: str})
# Simulation 2021
Loading /Users/sch/dev/gitruc/data-exploration/data/criteres_repartition_2022.csv
/Users/sch/dev/gitruc/data-exploration/data_exploration/utils/utils.py:14: DtypeWarning: Columns (2,14,43,125,155,157,158,159,160,162,175,176,196,198,200,201,202,203) have mixed types. Specify dtype option on import or set low_memory=False.
data = pandas.read_csv(path, decimal=",", dtype={code_insee: str})
2022
Loading /Users/sch/dev/gitruc/data-exploration/data/criteres_repartition_2021.csv
/Users/sch/dev/gitruc/data-exploration/data_exploration/utils/utils.py:14: DtypeWarning: Columns (2,14,36,37,38,153,186,190,191,192,193) have mixed types. Specify dtype option on import or set low_memory=False.
data = pandas.read_csv(path, decimal=",", dtype={code_insee: str})
## Initialisation de la simulation (à compléter)
%% Cell type:code id: tags:
``` python
from openfisca_france_dotations_locales import (
CountryTaxBenefitSystem as DotationsLocales,
)
from data_exploration.utils.simulation_2021 import dotations_criteres_2021 as dgcl_data_2021
from data_exploration.utils.new_load_dgcl_criteres_data import adapt_dgcl_data, insert_dsr_garanties_communes_nouvelles
from data_exploration.utils.load_dgcl_criteres_data import insert_dsu_garanties
from data_exploration.utils.lecture_data import GARANTIES_DSU_PATH
CURRENT_YEAR = 2021
tbs = DotationsLocales()
try:
adapted_data_2021 = adapt_dgcl_data(dgcl_data_2021, "2021")
fully_adapted_data_2021 = insert_dsu_garanties(
adapted_data_2021, str(CURRENT_YEAR), GARANTIES_DSU_PATH
)
# insertion des garanties communes nouvelles au titre de la DSR (non calculées explicitement dans OFDL)
# TODO attention ! corriger ; par défaut, renvoie les garanties 2020 si l'année demandée > 2020
fully_adapted_data_2022 = insert_dsr_garanties_communes_nouvelles(
fully_adapted_data_2021, str(CURRENT_YEAR)
)
except ValueError as e:
# TODO, pour 2021, traiter : invalid literal for int() with base 10: 'NON'
print("Erreur inattendue dans les données adaptées : ", e)
```
%% Output
2021
Erreur inattendue dans les données adaptées : invalid literal for int() with base 10: 'NON'
%% Cell type:markdown id: tags:
## Strates démographiques en 2021
%% Cell type:code id: tags:
``` python
from data_exploration.utils.simulation_2021 import get_simulation_2021_strates_only, calculate_data_strates_2021
simulation_2021_strates = get_simulation_2021_strates_only()
data_strates_2021 = calculate_data_strates_2021(simulation_2021_strates)
data_strates_2021
```
%% Output
code_insee nom population_dgf strate_demographique
0 01001 ABERGEMENT-CLEMENCIAT 805 2
1 01002 ABERGEMENT-DE-VAREY 307 1
2 01004 AMBERIEU-EN-BUGEY 14771 8
3 01005 AMBERIEUX-EN-DOMBES 1757 3
4 01006 AMBLEON 130 1
... ... ... ... ...
35046 98829 THIO 3580 5
35047 98830 TOUHO 3610 5
35048 98831 VOH 3750 5
35049 98832 YATE 2756 4
35050 98833 KOUAOUA 1869 3
[35051 rows x 4 columns]
......
# read by leximpact_dotations_back/load_configuration.py
# default logger level: INFO
# possible values: https://docs.python.org/3/library/logging.html#logging-levels
LOGGING_LEVEL=INFO
ORIGINS=[https://leximpact.an.fr, http://localhost:5173, http://localhost:8000, http://localhost]
DATA_DIRECTORY="./../../data"
YEAR_PERIOD=2024
NEXT_YEAR_PLF=""
This diff is collapsed.
This diff is collapsed.
from pandas import DataFrame
from openfisca_core.simulation_builder import SimulationBuilder
from openfisca_france_dotations_locales import (
CountryTaxBenefitSystem as OpenFiscaFranceDotationsLocales,
)
from data_exploration.utils.lecture_data import CRITERES_2021_PATH
from data_exploration.utils.new_load_dgcl_criteres_data import load_dgcl_file
dotations_criteres_2021 = load_dgcl_file(CRITERES_2021_PATH)
def get_simulation_2021_strates_only(data_criteres_2021 = dotations_criteres_2021):
model = OpenFiscaFranceDotationsLocales()
sb = SimulationBuilder()
sb.create_entities(model)
sb.declare_person_entity("commune", data_criteres_2021.index)
etat_instance = sb.declare_entity("etat", ["france"])
nombre_communes = len(data_criteres_2021.index)
etat_communes = ["france"] * nombre_communes
communes_etats_roles = [None] * nombre_communes # no roles in our model
sb.join_with_persons(etat_instance, etat_communes, communes_etats_roles)
simulation_2021 = sb.build(model)
simulation_2021.set_input('code_insee', "2021-01", data_criteres_2021['Informations générales - Code INSEE de la commune'])
simulation_2021.set_input('nom', "2021-01", data_criteres_2021['Informations générales - Nom de la commune'])
simulation_2021.set_input('population_dgf', 2021, data_criteres_2021["Informations générales - Population DGF de l'année N"])
return simulation_2021
def calculate_data_strates_2021(simulation_2021):
strates_communes_2021 = {
'code_insee': simulation_2021.calculate('code_insee', "2021-01"),
'nom': simulation_2021.calculate('nom', "2021-01"),
'population_dgf': simulation_2021.calculate('population_dgf', 2021),
'strate_demographique': simulation_2021.calculate('strate_demographique', 2021)
}
data_strates_2021 = DataFrame(strates_communes_2021)
return data_strates_2021
from os import getcwd
from os.path import join
from openfisca_france_dotations_locales import CountryTaxBenefitSystem as OpenFiscaFranceDotationsLocales
from openfisca_france_dotations_locales import (
CountryTaxBenefitSystem as OpenFiscaFranceDotationsLocales,
)
from leximpact_dotations_back.calculate import create_simulation_with_data
from leximpact_dotations_back.data_building.build_dotations_data import get_insee_communes_1943_file_path, get_previous_year_data, load_criteres, load_insee_communes_history
from leximpact_dotations_back.data_building.adapt_dotations_criteres import adapt_criteres
from leximpact_dotations_back.data_building.build_dotations_data import get_previous_year_data, load_criteres
from leximpact_dotations_back.computing.simulation_2024 import build_simulation_2024
CURRENT_YEAR = 2024
print(getcwd())
DATA_DIRECTORY = join(getcwd(), "..", "..", "data")
MODEL_BASE = OpenFiscaFranceDotationsLocales()
def buid_data_2023_for_2024(data_directory = DATA_DIRECTORY, year = CURRENT_YEAR):
......@@ -24,18 +27,17 @@ def build_data_2024(data_directory = DATA_DIRECTORY, year = CURRENT_YEAR):
# hypothèse : le fichier de critères est nommé 'criteres_repartition_YYYY.csv'
# où YYYY est défini par la variable 'year'
data_criteres = load_criteres(data_directory, year)
data = adapt_criteres(data_criteres, year)
return data
data_criteres = load_criteres(year, data_directory)
insee_communes_1943_2024_file_path = get_insee_communes_1943_file_path(data_directory, year)
communes_history_2024 = load_insee_communes_history(insee_communes_1943_2024_file_path)
def create_simulation_2024(data, data_previous_year, year=CURRENT_YEAR):
model = OpenFiscaFranceDotationsLocales()
data = adapt_criteres(year, data_criteres, communes_history_2024)
return data
data_criteres = load_criteres(DATA_DIRECTORY, year)
data = adapt_criteres(data_criteres, year)
return create_simulation_with_data(model, year, data, data_previous_year)
def create_simulation_2024(data_adapted_criteres_2024, data_selection_2023, year=CURRENT_YEAR, model=MODEL_BASE):
return build_simulation_2024(year, model, data_adapted_criteres_2024, data_selection_2023)
def calculate_dotations(simulation, dotations_criteres_data, year = CURRENT_YEAR):
......
Source diff could not be displayed: it is too large. Options to address this: view the blob.
[tool.poetry]
name = "data-exploration"
version = "3.4.0"
version = "4.0.0"
description = "Les outils d'analyse des données en amont de dotations.incubateur.anct.gouv.fr"
authors = ["Equipe Dotations Locales <contact-dotations-locales@anct.gouv.fr>"]
license = "AGPL-3.0-or-later"
......@@ -20,9 +20,10 @@ black = ">= 24.0.0, < 25.0.0"
optional = true
[tool.poetry.group.from2024.dependencies]
leximpact-dotations-back = "^1.0.0"
leximpact-dotations-back = "^2.0.0"
# ou remplacer par ce qui suit pour installer une branche, en indiquant son nom à la place de "ma-branche-preferee" :
# leximpact-dotations-back = { git = "https://git.leximpact.dev/leximpact/simulateur-dotations-communes/leximpact-dotations-back.git", branch = "ma-branche-preferee" }
matplotlib = "^3.10.1"
[build-system]
requires = ["poetry-core>=1.0.0"]
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment