Skip to content
Snippets Groups Projects
Commit 2460766d authored by sandcha's avatar sandcha
Browse files

Vérifie la cohérence de DF pour une commune en 2024

parent 6db93c83
Branches
No related tags found
1 merge request!7Ajoute un notebook d'analyse d'une unique commune configurable pour 2024
%% Cell type:markdown id: tags:
# Analyse des critères et dotations d'une commune
%% Cell type:code id: tags:
``` python
YEAR = 2024
CODE_INSEE_COMMUNE = "01317" # code postal = "01250"
NOM_COMMUNE = "Ramasse"
```
%% Cell type:markdown id: tags:
## Données brutes
%% Cell type:code id: tags:
``` python
# Activate multi-output in notebook
# %matplotlib inline (pour des graphes)
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
```
%% Cell type:code id: tags:
``` python
import logging
from leximpact_dotations_back import logger
logger.setLevel(logging.INFO)
```
%% Cell type:code id: tags:
``` python
from os import getcwd
from os.path import join
from leximpact_dotations_back.data_building.build_dotations_data import load_criteres
DATA_DIRECTORY = join(getcwd(), "..", "..", "data")
data_brutes_criteres_2023 = load_criteres(YEAR-1, DATA_DIRECTORY)
data_brutes_criteres_2024 = load_criteres(YEAR, DATA_DIRECTORY)
NOMBRE_TOTAL_COMMUNES_2024 = len(data_brutes_criteres_2024)
print("Nombre de communes 2024 :", NOMBRE_TOTAL_COMMUNES_2024)
# data_brutes_criteres_2024.columns
# data_brutes_criteres_2024.columns[data_brutes_criteres_2024.columns.str.contains("rural")]
# data_brutes_criteres_2024.columns[data_brutes_criteres_2024.columns.str.contains("écrêtement")]
```
%% Output
🔹 INFO
Loading /Users/sch/dev/gitruc/data-exploration/data/criteres_repartition_2023.csv...
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:57: DtypeWarning: Columns (2,19,37,39,43,45,52,57,59,65,66,79,98,102,108,130,138,140,141,142,143,149,151,152,157,166,167,168,169,171,175,176,177) have mixed types. Specify dtype option on import or set low_memory=False.
dgcl_data = read_csv(
🔹 INFO
Loading /Users/sch/dev/gitruc/data-exploration/data/criteres_repartition_2024.csv...
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:57: DtypeWarning: Columns (2,19,25,26,35,36,38,42,44,51,57,59,63,64,77,105,119,120,121,122,135,137,138,139,145,147,148,154,159) have mixed types. Specify dtype option on import or set low_memory=False.
dgcl_data = read_csv(
Nombre de communes 2024 : 35021
Index(['Dotation forfaitaire - Montant de l'écrêtement'], dtype='object')
%% Cell type:code id: tags:
``` python
def get_commune_in_data_criteres(data_brutes_criteres, code_insee_commune):
filter_code_insee = data_brutes_criteres['Informations générales - Code INSEE de la commune'] == code_insee_commune
commune_in_data = data_brutes_criteres[filter_code_insee]
return commune_in_data
print("2023 - Données brutes :")
commune_in_data_2023 = get_commune_in_data_criteres(data_brutes_criteres_2023, CODE_INSEE_COMMUNE)
commune_in_data_2023
print("2024 - Données brutes :")
commune_in_data_2024 = get_commune_in_data_criteres(data_brutes_criteres_2024, CODE_INSEE_COMMUNE)
commune_in_data_2024
```
%% Output
2023 - Données brutes :
Informations générales - Code INSEE de la commune \
267 01317
Informations générales - Nom de la commune \
267 RAMASSE
Informations générales - Code département de la commune \
267 1
Informations générales - Code SIREN de l'EPCI \
267 200071751
Informations générales - Nom de l'EPCI Informations générales - Exercice \
267 CA DU BASSIN DE BOURG-EN-BRESSE 2023
Informations générales - Régime fiscal de l'EPCI N \
267 FPU
Informations générales - Population DGF de l'année N \
267 348
Informations générales - Population INSEE de l'année N \
267 337
Informations générales - Résidences secondaires de l'année N ... \
267 11 ...
Dotation d’aménagement des communes et circonscriptions territoriales d’outre-mer - Montant total de DACOM réparti \
267 0
Dotation d’aménagement des communes et circonscriptions territoriales d’outre-mer - Centimes additionnels \
267 0
Dotation d’aménagement des communes et circonscriptions territoriales d’outre-mer - Eloignement par rapport au chef-lieu du territoire \
267 0
Dotation d’aménagement des communes et circonscriptions territoriales d’outre-mer - Impôts ménages \
267 0
Dotation d’aménagement des communes et circonscriptions territoriales d’outre-mer - Commune aurifère \
267 0
Dotation d’aménagement des communes et circonscriptions territoriales d’outre-mer - Indice synthétique DPOM \
267 0.0
Dotation d’aménagement des communes et circonscriptions territoriales d’outre-mer - Coefficient de majoration de l'IS \
267 0.0
Dotation d’aménagement des communes et circonscriptions territoriales d’outre-mer - Potentiel financier majoré de l'octroi de mer \
267 0
Dotation d’aménagement des communes et circonscriptions territoriales d’outre-mer - Potentiel financier majoré de l'octroi de mer par habitant \
267 0
Dotation d’aménagement des communes et circonscriptions territoriales d’outre-mer - Nombre de foyers bénéficiaires du RSA
267 0
[1 rows x 178 columns]
2024 - Données brutes :
Informations générales - Code INSEE de la commune \
267 01317
Informations générales - Nom de la commune \
267 RAMASSE
Informations générales - Code département de la commune \
267 1
Informations générales - Code SIREN de l'EPCI \
267 200071751
Informations générales - Nom de l'EPCI Informations générales - Exercice \
267 CA DU BASSIN DE BOURG-EN-BRESSE 2024
Informations générales - Régime fiscal de l'EPCI N \
267 FPU
Informations générales - Population DGF de l'année N \
267 348
Informations générales - Population INSEE de l'année N \
267 337
Informations générales - Résidences secondaires de l'année N ... \
267 11 ...
Dotation d’aménagement des communes et circonscriptions territoriales d’outre-mer - Coefficient de majoration de l'IS \
267 n.c
Dotation d’aménagement des communes et circonscriptions territoriales d’outre-mer - Potentiel financier majoré de l'octroi de mer \
267 n.c
Dotation d’aménagement des communes et circonscriptions territoriales d’outre-mer - Potentiel financier majoré de l'octroi de mer par habitant \
267 n.c
Dotation d’aménagement des communes et circonscriptions territoriales d’outre-mer - Nombre de foyers bénéficiaires du RSA \
267 n.c
Dotation en faveur des communes nouvelles - Commune éligible à la part de garantie \
267 0
Dotation en faveur des communes nouvelles - DGF de référence de la commune nouvelle \
267 0
Dotation en faveur des communes nouvelles - Montant de la part garantie \
267 0
Dotation en faveur des communes nouvelles - Commune éligible à la part d'amorçage \
267 0
Dotation en faveur des communes nouvelles - Montant de la part d'amorçage \
267 0
Dotation en faveur des communes nouvelles - Montant total réparti
267 0.0
[1 rows x 180 columns]
%% Cell type:markdown id: tags:
### Dotations de la commune dans les données brutes
%% Cell type:code id: tags:
``` python
# from leximpact_dotations_back.mapping.criteres_dgcl_2024 import montants_dotations_2024
# montants_dotations_2024
DGCL_VALUE__STRING_NON_BREAKING_SPACE = '\xa0'
# numeric_value : chaîne de caractères représentant une valeur numérique
# (si déjà un nombre, renvoyé sans modification)
def format_string_numeric_with_spaces_to_numeric(numeric_value):
if type(numeric_value) == str:
clean_value = numeric_value
is_float = ("," in numeric_value) or ("." in numeric_value)
if is_float:
clean_value = numeric_value.replace(',', '.')
clean_value = clean_value.replace(DGCL_VALUE__STRING_NON_BREAKING_SPACE, "")
return float(clean_value) if is_float else int(clean_value)
else :
return numeric_value
df_notifiee_2024 = format_string_numeric_with_spaces_to_numeric(commune_in_data_2024['Dotation forfaitaire - Dotation forfaitaire notifiée N'].values[0])
dsr_notifiee_2024 = format_string_numeric_with_spaces_to_numeric(commune_in_data_2024['Dotation de solidarité rurale - Montant total réparti'].values[0])
dsu_notifiee_2024 = format_string_numeric_with_spaces_to_numeric(commune_in_data_2024['Dotation de solidarité urbaine et de cohésion sociale - Montant total réparti'].values[0])
dcn_notifiee_2024 = format_string_numeric_with_spaces_to_numeric(commune_in_data_2024['Dotation en faveur des communes nouvelles - Montant total réparti'].values[0])
print(f"[{YEAR}][🧳 DF] Notification : {df_notifiee_2024}")
print(f"[{YEAR}][🌻 DSR] Notification : {dsr_notifiee_2024}")
print(f"[{YEAR}][🏢 DSU] Notification : {dsu_notifiee_2024}")
print(f"[{YEAR}][🪴 DCN] Notification : {dcn_notifiee_2024}")
```
%% Output
[2024][🧳 DF] Notification : 15288.0
[2024][🌻 DSR] Notification : 10783
[2024][🏢 DSU] Notification : 0.0
[2024][🪴 DCN] Notification : 0.0
%% Cell type:markdown id: tags:
### Dotations de la commune dans les données calculées par leximpact-dotations-back
%% Cell type:code id: tags:
``` python
# Option 1) from leximpact_dotations_back.preload import dotations_adapted_criteres_2024, simulation_2024
# (mais contraintes de chemins de données à adapter)
## Option 2)
## from pandas import DataFrame
## from leximpact_dotations_back.computing.simulation_2024 import build_data_2024, get_simulation_2024
## (oui, on charge les données une seconde fois ici)
## dotations_adapted_criteres_2024: DataFrame = build_data_2024(data_directory = DATA_DIRECTORY, year = YEAR)
### Option 3) pour vérification rapide sans contraintes de chemins de données
from data_exploration.utils.simulation_2024 import buid_data_2023_for_2024, build_data_2024, create_simulation_2024
from numpy import full
dotations_adapted_criteres_2024 = build_data_2024()
selection_data_2023 = buid_data_2023_for_2024()
simulation_2024 = create_simulation_2024(dotations_adapted_criteres_2024, selection_data_2023)
# Fix bug NaN DSU
dsu_montant_enveloppe_metropole_2023 = simulation_2024.tax_benefit_system.parameters(YEAR-1).dotation_solidarite_urbaine.montant.metropole
simulation_2024.set_input('dsu_montant_total', YEAR -1, full(NOMBRE_TOTAL_COMMUNES_2024, dsu_montant_enveloppe_metropole_2023))
# fin fix
# Fix montant DSR
dsr_cible_montant_enveloppe_metropole_2023 = simulation_2024.tax_benefit_system.parameters(YEAR-1).dotation_solidarite_rurale.cible.montant # métropole
simulation_2024.set_input('dsr_montant_total_fraction_cible', YEAR -1, full(NOMBRE_TOTAL_COMMUNES_2024, dsr_cible_montant_enveloppe_metropole_2023))
dsr_bourg_centre_montant_enveloppe_metropole_2023 = simulation_2024.tax_benefit_system.parameters(YEAR-1).dotation_solidarite_rurale.bourg_centre.montant # métropole
simulation_2024.set_input('dsr_montant_total_fraction_bourg_centre', YEAR -1, [dsr_bourg_centre_montant_enveloppe_metropole_2023]) # entité État
dsr_perequation_montant_enveloppe_metropole_2023 = simulation_2024.tax_benefit_system.parameters(YEAR-1).dotation_solidarite_rurale.perequation.montant # métropole
simulation_2024.set_input('dsr_montant_total_fraction_perequation', YEAR -1, full(NOMBRE_TOTAL_COMMUNES_2024, dsr_perequation_montant_enveloppe_metropole_2023))
# fin fix
```
%% Output
/Users/sch/dev/gitruc/data-exploration/data_exploration/dotations_2024
🔹 INFO
Loading /Users/sch/dev/gitruc/data-exploration/data/criteres_repartition_2024.csv...
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:57: DtypeWarning: Columns (2,19,25,26,35,36,38,42,44,51,57,59,63,64,77,105,119,120,121,122,135,137,138,139,145,147,148,154,159) have mixed types. Specify dtype option on import or set low_memory=False.
dgcl_data = read_csv(
🔹 INFO
Loading /Users/sch/dev/gitruc/data-exploration/data/insee_commune_depuis_1943.csv...
🔸 WARNING
Specific treatment applied to some communes: 57163 and 87116
🔹 INFO
Loading /Users/sch/dev/gitruc/data-exploration/data/criteres_repartition_2023.csv...
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:57: DtypeWarning: Columns (2,19,37,39,43,45,52,57,59,65,66,79,98,102,108,130,138,140,141,142,143,149,151,152,157,166,167,168,169,171,175,176,177) have mixed types. Specify dtype option on import or set low_memory=False.
dgcl_data = read_csv(
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:164: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits[nom_ofdl] = data[nom_dgcl]
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:164: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits[nom_ofdl] = data[nom_dgcl]
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:164: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits[nom_ofdl] = data[nom_dgcl]
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:164: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits[nom_ofdl] = data[nom_dgcl]
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:164: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits[nom_ofdl] = data[nom_dgcl]
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:164: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits[nom_ofdl] = data[nom_dgcl]
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:164: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits[nom_ofdl] = data[nom_dgcl]
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:164: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits[nom_ofdl] = data[nom_dgcl]
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:164: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits[nom_ofdl] = data[nom_dgcl]
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:164: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits[nom_ofdl] = data[nom_dgcl]
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:164: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits[nom_ofdl] = data[nom_dgcl]
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:164: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits[nom_ofdl] = data[nom_dgcl]
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:164: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits[nom_ofdl] = data[nom_dgcl]
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:164: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits[nom_ofdl] = data[nom_dgcl]
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:164: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits[nom_ofdl] = data[nom_dgcl]
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:164: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits[nom_ofdl] = data[nom_dgcl]
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:164: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits[nom_ofdl] = data[nom_dgcl]
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:164: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits[nom_ofdl] = data[nom_dgcl]
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:173: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits["dsu_montant_eligible"] = (
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:183: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits["dsr_montant_hors_garanties_fraction_perequation"] = data[
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:191: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits["dsr_montant_eligible_fraction_perequation"] = (
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/leximpact_dotations_back/data_building/build_dotations_data.py:200: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
resultats_extraits["dsr_montant_hors_garanties_fraction_cible"] = data[
%% Cell type:code id: tags:
``` python
from numpy import where
codes_insee_2024 = simulation_2024.calculate("code_insee", f"{YEAR}-01")
index_commune_in_simulation = where(codes_insee_2024 == CODE_INSEE_COMMUNE)[0][0]
print(f"Index de la commune '{NOM_COMMUNE}' dans la simulation : {index_commune_in_simulation}")
df_simulee_2024 = simulation_2024.calculate("dotation_forfaitaire", YEAR)[index_commune_in_simulation]
dsr_simulee_2024 = simulation_2024.calculate("dotation_solidarite_rurale", YEAR)[index_commune_in_simulation]
dsu_simulee_2024 = simulation_2024.calculate("dsu_montant", YEAR)[index_commune_in_simulation]
dcn_simulee_2024 = simulation_2024.calculate("dotation_communes_nouvelles", YEAR)[index_commune_in_simulation]
print(f"[{YEAR}][🧳 DF] Simulée : {df_simulee_2024}")
print(f"[{YEAR}][🌻 DSR] Simulée : {dsr_simulee_2024}")
print(f"[{YEAR}][🏢 DSU] Simulée : {dsu_simulee_2024}")
print(f"[{YEAR}][🪴 DCN] Simulée : {dcn_simulee_2024}")
```
%% Output
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/openfisca_france_dotations_locales/variables/dotation_forfaitaire.py:190: RuntimeWarning: divide by zero encountered in log10
dotation_supp_par_habitant = facteur_minimum + (facteur_maximum - facteur_minimum) * max_(0, min_(1, facteur_du_coefficient_logarithmique * log10(safe_divide(population_majoree_dgf, plancher_dgcl_population_dgf_majoree, 1))))
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/openfisca_france_dotations_locales/variables/dotation_forfaitaire.py:40: RuntimeWarning: divide by zero encountered in log10
coefficient_logarithmique = max_(1, min_(2, 1 + facteur_du_coefficient_logarithmique * log10(population_dgf / plancher_dgcl_population_dgf)))
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/openfisca_france_dotations_locales/variables/dotation_forfaitaire.py:72: RuntimeWarning: divide by zero encountered in divide
potentiel_fiscal_moyen_commune = where(population_logarithmee > 0, potentiel_fiscal / population_logarithmee, 0)
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/openfisca_france_dotations_locales/variables/dotation_forfaitaire.py:157: RuntimeWarning: divide by zero encountered in divide
potentiel_fiscal_moyen_commune = where(population_logarithmee > 0, potentiel_fiscal / population_logarithmee, 0)
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/openfisca_france_dotations_locales/variables/dotation_solidarite_urbaine.py:425: RuntimeWarning: invalid value encountered in divide
facteur_qpv = (1 + np.where(population_insee > 0, poids_quartiers_prioritaires_ville * population_qpv / population_insee, 0))
/Users/sch/Library/Caches/pypoetry/virtualenvs/data-exploration-VsNz68cn-py3.11/lib/python3.11/site-packages/openfisca_france_dotations_locales/variables/dotation_solidarite_urbaine.py:426: RuntimeWarning: invalid value encountered in divide
facteur_zfu = (1 + np.where(population_insee > 0, poids_zone_franche_urbaine * population_zfu / population_insee, 0))
Index de la commune 'Ramasse' dans la simulation : 267
[2024][🧳 DF] Simulée : 13512.0
[2024][🌻 DSR] Simulée : 15769.4052734375
[2024][🏢 DSU] Simulée : 0.0
[2024][🪴 DCN] Simulée : 0.0
%% Cell type:markdown id: tags:
## Analyse de [in]cohérence
%% Cell type:code id: tags:
``` python
index_commune_in_criteres_bruts_2024 = data_brutes_criteres_2024.index[data_brutes_criteres_2024['Informations générales - Code INSEE de la commune'] == CODE_INSEE_COMMUNE][0]
index_commune_in_adapted_criteres_2024 = dotations_adapted_criteres_2024.index[dotations_adapted_criteres_2024['code_insee'] == CODE_INSEE_COMMUNE][0]
assert index_commune_in_criteres_bruts_2024 == index_commune_in_adapted_criteres_2024
assert index_commune_in_criteres_bruts_2024 == index_commune_in_simulation
```
%% Cell type:code id: tags:
``` python
ecart_df_2024 = df_simulee_2024 - df_notifiee_2024
ecart_dsr_2024 = dsr_simulee_2024 - dsr_notifiee_2024
ecart_dsu_2024 = dsu_simulee_2024 - dsu_notifiee_2024
ecart_dcn_2024 = dcn_simulee_2024 - dcn_notifiee_2024
print(f"[{YEAR}][🧳 DF] Écart dotation calculée par simulation [{df_simulee_2024}] - officielle notifiée [{df_notifiee_2024}] : {ecart_df_2024}")
print(f"[{YEAR}][🌻 DSR] Écart dotation calculée par simulation [{dsr_simulee_2024}] - officielle notifiée [{dsr_notifiee_2024}] : {ecart_dsr_2024}")
print(f"[{YEAR}][🏢 DSU] Écart dotation calculée par simulation [{dsu_simulee_2024}] - officielle notifiée [{dsu_notifiee_2024}] : {ecart_dsu_2024}")
print(f"[{YEAR}][🪴 DCN] Écart dotation calculée par simulation [{dcn_simulee_2024}] - officielle notifiée [{dcn_notifiee_2024}] : {ecart_dcn_2024}")
```
%% Output
[2024][🧳 DF] Écart dotation calculée par simulation [13512.0] - officielle notifiée [15288.0] : -1776.0
[2024][🌻 DSR] Écart dotation calculée par simulation [15769.4052734375] - officielle notifiée [10783] : 4986.4052734375
[2024][🏢 DSU] Écart dotation calculée par simulation [0.0] - officielle notifiée [0.0] : 0.0
[2024][🪴 DCN] Écart dotation calculée par simulation [0.0] - officielle notifiée [0.0] : 0.0
%% Cell type:code id: tags:
``` python
def calculate_ecart_2023(dgcl_column_name, openfisca_variable_name, print_prefix = ""):
# écarts entre données DGCL de référence 2023
# et calculs de simulation chargée sur données 2023 et 2024
notifiee_2023 = format_string_numeric_with_spaces_to_numeric(
commune_in_data_2023[dgcl_column_name].values[0]
)
LAST_YEAR = YEAR-1
simulee_2023 = simulation_2024.calculate(openfisca_variable_name, LAST_YEAR)[index_commune_in_simulation]
ecart_2023 = simulee_2023 - notifiee_2023
print(f"[{LAST_YEAR}]{print_prefix} Écart calculé par simulation [{simulee_2023}] - officiellement notifié [{notifiee_2023}] : {ecart_2023}")
def calculate_ecart_2024(dgcl_column_name, openfisca_variable_name, print_prefix = ""):
# écarts entre données DGCL de référence 2024
# et calculs de simulation chargée sur données 2023 et 2024
notifiee_2024 = format_string_numeric_with_spaces_to_numeric(
commune_in_data_2024[dgcl_column_name].values[0]
)
simulee_2024 = simulation_2024.calculate(openfisca_variable_name, YEAR)[index_commune_in_simulation]
ecart_2024 = simulee_2024 - notifiee_2024
print(f"[{YEAR}]{print_prefix} Écart calculé par simulation [{simulee_2024}] - officiellement notifié [{notifiee_2024}] : {ecart_2024}")
```
%% Cell type:markdown id: tags:
### 🪴 DCN
%% Cell type:code id: tags:
``` python
# variables intervenant dans le calcul de dotation_communes_nouvelles_part_garantie
print(f"dotation_communes_nouvelles_eligible_part_garantie = {simulation_2024.calculate('dotation_communes_nouvelles_eligible_part_garantie', YEAR)[index_commune_in_simulation]}")
print(f"dotation_globale_fonctionnement_reference_communes = {simulation_2024.calculate('dotation_globale_fonctionnement_reference_communes', YEAR)[index_commune_in_simulation]}")
print(f"dotation_globale_fonctionnement_communes = {simulation_2024.calculate('dotation_globale_fonctionnement_communes', YEAR)[index_commune_in_simulation]}")
# variables intervenant dans le calcul de dotation_globale_fonctionnement_communes (appelée par dotation_communes_nouvelles_part_garantie)
print(f"dotation_forfaitaire = {simulation_2024.calculate('dotation_forfaitaire', YEAR)[index_commune_in_simulation]}")
print(f"dotation_solidarite_rurale = {simulation_2024.calculate('dotation_solidarite_rurale', YEAR)[index_commune_in_simulation]}")
print(f"dsu_montant = {simulation_2024.calculate('dsu_montant', YEAR)[index_commune_in_simulation]}")
print(f"dotation_nationale_perequation = {simulation_2024.calculate('dotation_nationale_perequation', YEAR)[index_commune_in_simulation]}")
```
%% Output
dotation_communes_nouvelles_eligible_part_garantie = 0.0
dotation_globale_fonctionnement_reference_communes = 0.0
dotation_globale_fonctionnement_communes = 29281.40625
dotation_forfaitaire = 13512.0
dotation_solidarite_rurale = 15769.4052734375
dsu_montant = 0.0
dotation_nationale_perequation = 0.0
%% Cell type:code id: tags:
``` python
# dotation_communes_nouvelles
# = dotation_communes_nouvelles_part_amorcage + dotation_communes_nouvelles_part_garantie
calculate_ecart_2024(
"Dotation en faveur des communes nouvelles - Montant de la part d'amorçage",
"dotation_communes_nouvelles_part_amorcage",
"[🪴 DCN][part amorçage]"
)
calculate_ecart_2024(
"Dotation en faveur des communes nouvelles - Montant de la part garantie",
"dotation_communes_nouvelles_part_garantie",
"[🪴 DCN][part garantie]"
)
```
%% Output
[2024][🪴 DCN][part amorçage] Écart calculé par simulation [0.0] - officiellement notifié [0] : 0.0
[2024][🪴 DCN][part garantie] Écart calculé par simulation [0.0] - officiellement notifié [0] : 0.0
%% Cell type:markdown id: tags:
### 🧳 DF
%% Cell type:code id: tags:
``` python
# Historique d'évolution de la DF 2024 résumé ici : https://git.leximpact.dev/leximpact/simulateur-dotations-communes/openfisca-france-dotations-locales/-/issues/8#note_22081
print(f"dotation_forfaitaire = {simulation_2024.calculate('dotation_forfaitaire', YEAR)[index_commune_in_simulation]}")
print(f"[{YEAR - 1}] dotation_forfaitaire = {simulation_2024.calculate('dotation_forfaitaire', YEAR - 1)[index_commune_in_simulation]}")
print(f"df_evolution_part_dynamique = {simulation_2024.calculate('df_evolution_part_dynamique', YEAR)[index_commune_in_simulation]}")
# écrêtement rétabli en LF 2024
print(f"df_montant_ecretement = {simulation_2024.calculate('df_montant_ecretement', YEAR)[index_commune_in_simulation]}")
```
%% Output
dotation_forfaitaire = 13512.0
[2023] dotation_forfaitaire = 15517.0
df_evolution_part_dynamique = 0
df_montant_ecretement = 2005
%% Cell type:code id: tags:
``` python
calculate_ecart_2024(
"Dotation forfaitaire - Montant de l'écrêtement",
"df_montant_ecretement",
"[🧳 DF]"
)
```
%% Cell type:markdown id: tags:
### 🌻 DSR
%% Cell type:markdown id: tags:
#### Fraction cible
Toutes les colonnes disponibles dans les données brutes 2024 :
* 'Dotation de solidarité rurale - Fraction cible - Revenu imposable moyen par habitant sur 3 ans'
* 'Dotation de solidarité rurale - Fraction cible - Indice synthétique DSR Cible'
* 'Dotation de solidarité rurale - Fraction cible - Rang DSR Cible'
* 'Dotation de solidarité rurale - Fraction cible - Commune éligible'
* 'Dotation de solidarité rurale - Fraction cible - Part Pfi'
* 'Dotation de solidarité rurale - Fraction cible - Part VOIRIE'
* 'Dotation de solidarité rurale - Fraction cible - Part ENFANTS'
* 'Dotation de solidarité rurale - Fraction cible - Part Pfi/hectare (Pfis)'
* 'Dotation de solidarité rurale - Fraction cible - Montant de la garantie de sortie cible des communes devenues inéligibles en N'
* 'Dotation de solidarité rurale - Fraction cible - Montant global réparti'
%% Cell type:code id: tags:
``` python
calculate_ecart_2024(
"Dotation de solidarité rurale - Fraction cible - Montant global réparti",
"dsr_fraction_cible",
"[🌻 DSR][cible]"
)
```
%% Output
[2024][🌻 DSR][cible] Écart calculé par simulation [0.0] - officiellement notifié [0.0] : 0.0
%% Cell type:markdown id: tags:
#### Fraction bourg-centre
Toutes les colonnes disponibles dans les données brutes 2024 :
* 'Dotation de solidarité rurale - Fraction bourg-centre - Montant de la commune éligible'
* 'Dotation de solidarité rurale - Fraction bourg-centre - Montant de la garantie de sortie BC'
* 'Dotation de solidarité rurale - Fraction bourg-centre - Montant global réparti'
* 'Dotation de solidarité rurale - Fraction bourg-centre - Population DGF plafonnée'
* 'Dotation de solidarité rurale - Fraction bourg-centre - Population DGF des communes du canton d'appartenance en 2014'
* 'Dotation de solidarité rurale - Fraction bourg-centre - Pourcentage de la population communale dans le canton d'appartenance en 2014'
* 'Dotation de solidarité rurale - Fraction bourg-centre - Population DGF des communes de l'unité urbaine'
* 'Dotation de solidarité rurale - Fraction bourg-centre - Population départementale de référence de l'unité urbaine'
* 'Dotation de solidarité rurale - Fraction bourg-centre - La commune appartient à une UU avec un CL de département ?'
* 'Dotation de solidarité rurale - Fraction bourg-centre - Code commune chef-lieu de canton au 1er janvier 2014'
* 'Dotation de solidarité rurale - Fraction bourg-centre - Nom commune chef-lieu de canton au 1er janvier 2014'
* 'Dotation de solidarité rurale - Fraction bourg-centre - Bureaux centralisateurs'
* 'Dotation de solidarité rurale - Fraction bourg-centre - Chef-lieu d'arrondissement au 31 décembre 2014'
* 'Dotation de solidarité rurale - Fraction bourg-centre - Commune située en ZRR'
* 'Dotation de solidarité rurale - Fraction bourg-centre - Grille de densité de l'INSEE'
%% Cell type:code id: tags:
``` python
# dsr_fraction_bourg_centre
# = max_(
# dsr_montant_eligible_fraction_bourg_centre,
# max_(dsr_montant_garantie_non_eligible_fraction_bourg_centre, dsr_garantie_commune_nouvelle_fraction_bourg_centre))
print(f'dsr_montant_garantie_non_eligible_fraction_bourg_centre = {simulation_2024.calculate("dsr_montant_garantie_non_eligible_fraction_bourg_centre", YEAR)[index_commune_in_simulation]}')
print(f'dsr_garantie_commune_nouvelle_fraction_bourg_centre = {simulation_2024.calculate("dsr_garantie_commune_nouvelle_fraction_bourg_centre", YEAR)[index_commune_in_simulation]}')
print(f'dsr_montant_eligible_fraction_bourg_centre = {simulation_2024.calculate("dsr_montant_eligible_fraction_bourg_centre", YEAR)[index_commune_in_simulation]}')
# dsr_montant_eligible_fraction_bourg_centre (montant attribué fraction bourg-centre incluant garanties de stabilité)
# = where(
# (dsr_montant_hors_garanties_fraction_bourg_centre > 0) & (montant_an_precedent > 0),
# max_(plancher_progression * montant_an_precedent,
# min_(plafond_progression * montant_an_precedent, dsr_montant_hors_garanties_fraction_bourg_centre)),
# dsr_montant_hors_garanties_fraction_bourg_centre)
print(f'[{YEAR-1}] dsr_montant_eligible_fraction_bourg_centre = {simulation_2024.calculate("dsr_montant_eligible_fraction_bourg_centre", YEAR-1)[index_commune_in_simulation]}')
print(f'dsr_montant_hors_garanties_fraction_bourg_centre = {simulation_2024.calculate("dsr_montant_hors_garanties_fraction_bourg_centre", YEAR)[index_commune_in_simulation]}')
# dsr_montant_hors_garanties_fraction_bourg_centre
# = dsr_score_attribution_fraction_bourg_centre * dsr_valeur_point_fraction_bourg_centre
print(f'dsr_score_attribution_fraction_bourg_centre = {simulation_2024.calculate("dsr_score_attribution_fraction_bourg_centre", YEAR)[index_commune_in_simulation]}')
print(f'dsr_valeur_point_fraction_bourg_centre = {simulation_2024.calculate("dsr_valeur_point_fraction_bourg_centre", YEAR)[0]}') # Entité État
print("-----")
calculate_ecart_2024(
"Dotation de solidarité rurale - Fraction bourg-centre - Montant global réparti",
"dsr_fraction_bourg_centre",
"[🌻 DSR][bourg-centre]"
)
```
%% Output
dsr_montant_garantie_non_eligible_fraction_bourg_centre = 0.0
dsr_garantie_commune_nouvelle_fraction_bourg_centre = 0.0
dsr_montant_eligible_fraction_bourg_centre = 5178.048828125
[2023] dsr_montant_eligible_fraction_bourg_centre = 0.0
dsr_montant_hors_garanties_fraction_bourg_centre = 5178.048828125
dsr_score_attribution_fraction_bourg_centre = 228.64430236816406
dsr_valeur_point_fraction_bourg_centre = 22.646743774414062
-----
[2024][🌻 DSR][bourg-centre] Écart calculé par simulation [5178.048828125] - officiellement notifié [0.0] : 5178.048828125
%% Cell type:markdown id: tags:
#### Fraction péréquation
Toutes les colonnes disponibles dans les données brutes 2024 :
* 'Dotation de solidarité rurale - Fraction péréquation - Part Pfi'
* 'Dotation de solidarité rurale - Fraction péréquation - Part VOIRIE'
* 'Dotation de solidarité rurale - Fraction péréquation - Part ENFANTS'
* 'Dotation de solidarité rurale - Fraction péréquation - Part Pfi/hectare'
* 'Dotation de solidarité rurale - Fraction péréquation - Commune éligible'
* 'Dotation de solidarité rurale - Fraction péréquation - Montant global réparti'
* 'Dotation de solidarité rurale - Fraction péréquation - Commune située en zone de montagne'
* 'Dotation de solidarité rurale - Fraction péréquation - Commune insulaire'
* 'Dotation de solidarité rurale - Fraction péréquation - Population 3 à 16 ans'
* 'Dotation de solidarité rurale - Fraction péréquation - Longueur de voirie en mètres'
%% Cell type:code id: tags:
``` python
# variables intervenant dans le calcul de dsr_fraction_perequation
print(f'dsr_garantie_commune_nouvelle_fraction_perequation = {simulation_2024.calculate("dsr_garantie_commune_nouvelle_fraction_perequation", YEAR)[index_commune_in_simulation]}') # input value
print(f'dsr_montant_eligible_fraction_perequation = {simulation_2024.calculate("dsr_montant_eligible_fraction_perequation", YEAR)[index_commune_in_simulation]}')
# variables intervenant dans le calcul de dsr_montant_eligible_fraction_perequation 2024
print(f'[{YEAR-1}] dsr_montant_eligible_fraction_perequation = {simulation_2024.calculate("dsr_montant_eligible_fraction_perequation", YEAR-1)[index_commune_in_simulation]}')
print(f'dsr_montant_hors_garanties_fraction_perequation = {simulation_2024.calculate("dsr_montant_hors_garanties_fraction_perequation", YEAR)[index_commune_in_simulation]}')
```
%% Output
dsr_garantie_commune_nouvelle_fraction_perequation = 0.0
dsr_montant_eligible_fraction_perequation = 10591.3564453125
[2023] dsr_montant_eligible_fraction_perequation = 9897.0
dsr_montant_hors_garanties_fraction_perequation = 10591.3564453125
%% Cell type:markdown id: tags:
> variables intervenant dans le calcul de dsr_montant_hors_garanties_fraction_perequation
##### Part Pfi
%% Cell type:code id: tags:
``` python
# dsr_fraction_perequation_part_potentiel_financier_par_habitant
# = dsr_score_attribution_perequation_part_potentiel_financier_par_habitant * dsr_valeur_point_fraction_perequation_part_potentiel_financier_par_habitant
print(f'dsr_score_attribution_perequation_part_potentiel_financier_par_habitant = {simulation_2024.calculate("dsr_score_attribution_perequation_part_potentiel_financier_par_habitant", YEAR)[index_commune_in_simulation]}')
print(f'dsr_valeur_point_fraction_perequation_part_potentiel_financier_par_habitant = {simulation_2024.calculate("dsr_valeur_point_fraction_perequation_part_potentiel_financier_par_habitant", YEAR)[index_commune_in_simulation]}')
# dsr_valeur_point_fraction_perequation_part_potentiel_financier_par_habitant
# = dsr_montant_total_eligibles_fraction_perequation_part_potentiel_financier_par_habitant / somme(dsr_score_attribution_perequation_part_potentiel_financier_par_habitant)
print(f'dsr_montant_total_eligibles_fraction_perequation_part_potentiel_financier_par_habitant = {simulation_2024.calculate("dsr_montant_total_eligibles_fraction_perequation_part_potentiel_financier_par_habitant", YEAR)[index_commune_in_simulation]}')
print(f'dsr_score_attribution_perequation_part_potentiel_financier_par_habitant = {simulation_2024.calculate("dsr_score_attribution_perequation_part_potentiel_financier_par_habitant", YEAR).sum()}')
# dsr_montant_total_eligibles_fraction_perequation_part_potentiel_financier_par_habitant
# = dsr_montant_total_eligibles_fraction_perequation * paramètre de poids
print(f'dsr_montant_total_eligibles_fraction_perequation = {simulation_2024.calculate("dsr_montant_total_eligibles_fraction_perequation", YEAR)[index_commune_in_simulation]}')
# dsr_montant_total_eligibles_fraction_perequation
# = dsr_montant_total_fraction_perequation - ((~dsr_eligible_fraction_perequation) * dsr_garantie_commune_nouvelle_fraction_perequation).sum()
print(f'dsr_montant_total_fraction_perequation = {simulation_2024.calculate("dsr_montant_total_fraction_perequation", YEAR)[index_commune_in_simulation]}')
print(f'dsr_garantie_commune_nouvelle_fraction_perequation = {simulation_2024.calculate("dsr_garantie_commune_nouvelle_fraction_perequation", YEAR)[index_commune_in_simulation]}')
print(f'dsr_eligible_fraction_perequation = {simulation_2024.calculate("dsr_eligible_fraction_perequation", YEAR)[index_commune_in_simulation]}')
# dsr_montant_total_fraction_perequation
print(f'dsr_montant_total_fraction_perequation = {simulation_2024.calculate("dsr_montant_total_fraction_perequation", YEAR-1)[index_commune_in_simulation]}') # TODO ajouter à l'initialisation
print(f'dsr_perequation_accroissement_metropole = {simulation_2024.calculate("dsr_perequation_accroissement_metropole", YEAR)[0]}') # Entité État
print("-----")
calculate_ecart_2024(
"Dotation de solidarité rurale - Fraction péréquation - Part Pfi",
"dsr_fraction_perequation_part_potentiel_financier_par_habitant",
"[🌻 DSR][péréquation][part potentiel financier / hab.]"
)
```
%% Output
dsr_score_attribution_perequation_part_potentiel_financier_par_habitant = 176.2482452392578
dsr_valeur_point_fraction_perequation_part_potentiel_financier_par_habitant = 6.72520112991333
dsr_montant_total_eligibles_fraction_perequation_part_potentiel_financier_par_habitant = 258615328.0
dsr_score_attribution_perequation_part_potentiel_financier_par_habitant = 38454660.0
dsr_montant_total_eligibles_fraction_perequation = 862051072.0
dsr_montant_total_fraction_perequation = 862051072.0
dsr_garantie_commune_nouvelle_fraction_perequation = 0.0
dsr_eligible_fraction_perequation = True
dsr_montant_total_fraction_perequation = 778308352.0
dsr_perequation_accroissement_metropole = 0.1075957790017128
-----
[2024][🌻 DSR][péréquation][part potentiel financier / hab.] Écart calculé par simulation [1185.304931640625] - officiellement notifié [1190.0] : -4.695068359375
%% Cell type:markdown id: tags:
##### Part voirie
%% Cell type:code id: tags:
``` python
calculate_ecart_2024(
"Dotation de solidarité rurale - Fraction péréquation - Part VOIRIE",
"dsr_fraction_perequation_part_longueur_voirie",
"[🌻 DSR][péréquation][part voirie]"
)
```
%% Output
[2024][🌻 DSR][péréquation][part voirie] Écart calculé par simulation [3954.677978515625] - officiellement notifié [4167] : -212.322021484375
%% Cell type:markdown id: tags:
##### Part enfants
%% Cell type:code id: tags:
``` python
calculate_ecart_2024(
"Dotation de solidarité rurale - Fraction péréquation - Part ENFANTS",
"dsr_fraction_perequation_part_enfants",
"[🌻 DSR][péréquation][part enfants]"
)
```
%% Output
[2024][🌻 DSR][péréquation][part enfants] Écart calculé par simulation [3356.709228515625] - officiellement notifié [3340] : 16.709228515625
%% Cell type:markdown id: tags:
##### Part Pfi/hectare
%% Cell type:code id: tags:
``` python
calculate_ecart_2024(
"Dotation de solidarité rurale - Fraction péréquation - Part Pfi/hectare",
"dsr_fraction_perequation_part_potentiel_financier_par_hectare",
"[🌻 DSR][péréquation][part potentiel financier / hectare]"
)
```
%% Output
[2024][🌻 DSR][péréquation][part potentiel financier / hectare] Écart calculé par simulation [2094.663818359375] - officiellement notifié [2086] : 8.663818359375
%% Cell type:code id: tags:
``` python
calculate_ecart_2024(
"Dotation de solidarité rurale - Fraction péréquation - Montant global réparti",
"dsr_fraction_perequation",
"[🌻 DSR][péréquation]"
)
```
%% Output
[2024][🌻 DSR][péréquation] Écart calculé par simulation [10591.3564453125] - officiellement notifié [10783.0] : -191.6435546875
%% Cell type:markdown id: tags:
### 🏢 DSU
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
#### DSU éligibilité
%% Cell type:code id: tags:
``` python
dsu_eligible_notifiee_2024_deduite = dsu_notifiee_2024 > 0
dsu_eligible_simulee_2024 = simulation_2024.calculate("dsu_eligible", YEAR)[index_commune_in_simulation]
print(f"[🏢 DSU][éligibilité] Écarts calculée par simulation [{dsu_eligible_simulee_2024}] v.s officielle notifiée (déduite du montant) [{dsu_eligible_notifiee_2024_deduite}].")
```
%% Output
[🏢 DSU][éligibilité] Écarts calculée par simulation [False] v.s officielle notifiée (déduite du montant) [False].
%% Cell type:markdown id: tags:
### DSU - non éligible - garantie
%% Cell type:code id: tags:
``` python
calculate_ecart_2024(
"Dotation de solidarité urbaine et de cohésion sociale - Montant de la garantie effectivement appliquée à la commune",
"dsu_montant_garantie_non_eligible",
"[🏢 DSU][non éligible][garantie]"
)
```
%% Output
[2024][🏢 DSU][non éligible][garantie] Écart calculé par simulation [0.0] - officiellement notifié [0.0] : 0.0
%% Cell type:markdown id: tags:
### DSU - éligible (de l'année, sans garantie de fin d'éligibilité)
%% Cell type:code id: tags:
``` python
# dsu_montant_eligible
# (montant communes éligibles actuellement à la DSU
# sans cas des communes qui ne sont plus éligibles actuellement mais perçoivent un montant pour garantie)
dsu_montant_eligible = simulation_2024.calculate("dsu_montant_eligible", YEAR)[index_commune_in_simulation]
print(f'dsu_montant_eligible = {dsu_montant_eligible}')
# pas de colonne équivalente dans les données DGCL
dgcl_dsu_montant_total_reparti = format_string_numeric_with_spaces_to_numeric(commune_in_data_2024['Dotation de solidarité urbaine et de cohésion sociale - Montant total réparti'].values[0])
dgcl_dsu_montant_garantie_effective = format_string_numeric_with_spaces_to_numeric(commune_in_data_2024['Dotation de solidarité urbaine et de cohésion sociale - Montant de la garantie effectivement appliquée à la commune'].values[0])
dgcl_dsu_montant_eligible_deduit = dgcl_dsu_montant_total_reparti - dgcl_dsu_montant_garantie_effective
print(f'[{YEAR}][🏢 DSU][éligible][montant] Écart calculé par simulation [{dsu_montant_eligible}] vs. officiel notifié (déduit)[{dgcl_dsu_montant_eligible_deduit}]')
# print("-----")
# montants_an_precedent
# TODO données dgcl : soustraire les garanties des communes non éligibles pour correspondre à dsu_montant_eligible
# calculate_ecart_2023(
# "Dotation de solidarité urbaine et de cohésion sociale - Montant total réparti",
# "dsu_montant_eligible",
# "[🏢 DSU][montant]"
# )
```
%% Output
dsu_montant_eligible = 0.0
[2024][🏢 DSU][éligible][montant] Écart calculé par simulation [0.0] vs. officiel notifié (déduit)[0.0]
%% Cell type:code id: tags:
``` python
# variables appelées par dsu_montant_eligible en 2024
print(f'dsu_montant_total = {simulation_2024.calculate("dsu_montant_total", YEAR)[index_commune_in_simulation]}')
print(f'[{YEAR-1}] dsu_montant_total = {simulation_2024.calculate("dsu_montant_total", YEAR-1)[index_commune_in_simulation]}')
print(f'[{YEAR-1}] dsu_montant_eligible = {simulation_2024.calculate("dsu_montant_eligible", YEAR-1)[index_commune_in_simulation]}')
print(f'dsu_eligible = {simulation_2024.calculate("dsu_eligible", YEAR)[index_commune_in_simulation]}')
print(f'dsu_montant_total_eligibles = {simulation_2024.calculate("dsu_montant_total_eligibles", YEAR)[index_commune_in_simulation]}')
print(f'rang_indice_synthetique_dsu_seuil_bas = {simulation_2024.calculate("rang_indice_synthetique_dsu_seuil_bas", YEAR)[index_commune_in_simulation]}')
print(f'rang_indice_synthetique_dsu_seuil_haut = {simulation_2024.calculate("rang_indice_synthetique_dsu_seuil_haut", YEAR)[index_commune_in_simulation]}')
print(f'dsu_nombre_communes_eligibles_seuil_bas = {simulation_2024.calculate("dsu_nombre_communes_eligibles_seuil_bas", YEAR)[index_commune_in_simulation]}')
print(f'dsu_nombre_communes_eligibles_seuil_haut = {simulation_2024.calculate("dsu_nombre_communes_eligibles_seuil_haut", YEAR)[index_commune_in_simulation]}')
print(f'effort_fiscal = {simulation_2024.calculate("effort_fiscal", YEAR)[index_commune_in_simulation]}')
# OK commune_in_data_2024['Effort fiscal - Effort fiscal final'].values[0]
# mais précision différente DGCL '0.630673' / SIMU 0.6306729912757874 !
print(f'population_insee = {simulation_2024.calculate("population_insee", YEAR)[index_commune_in_simulation]}')
# OK commune_in_data_2024["Informations générales - Population INSEE de l'année N"].values[0]
print(f'population_qpv = {simulation_2024.calculate("population_qpv", YEAR)[index_commune_in_simulation]}')
# OK commune_in_data_2024['Dotation de solidarité urbaine et de cohésion sociale - Population QPV'].values[0]
print(f'population_zfu = {simulation_2024.calculate("population_zfu", YEAR)[index_commune_in_simulation]}')
# OK commune_in_data_2024['Dotation de solidarité urbaine et de cohésion sociale - Population ZFU'].values[0]
print(f'population_dgf = {simulation_2024.calculate("population_dgf", YEAR)[index_commune_in_simulation]}')
# OK commune_in_data_2024["Informations générales - Population DGF de l'année N"].values[0]
print(f'indice_synthetique_dsu = {simulation_2024.calculate("indice_synthetique_dsu", YEAR)[index_commune_in_simulation]}')
# OK commune_in_data_2024["Dotation de solidarité urbaine et de cohésion sociale - Valeur de l'indice synthétique de classement de la commune à la DSU"].values[0]
# data_brutes_criteres_2024.columns[data_brutes_criteres_2024.columns.str.contains("urbain")]
```
%% Output
dsu_montant_total = 2618489088.0
[2023] dsu_montant_total = 2479034368.0
[2023] dsu_montant_eligible = 0.0
dsu_eligible = False
dsu_montant_total_eligibles = 2616009728.0
rang_indice_synthetique_dsu_seuil_bas = 23643
rang_indice_synthetique_dsu_seuil_haut = 23569
dsu_nombre_communes_eligibles_seuil_bas = 127
dsu_nombre_communes_eligibles_seuil_haut = 706
effort_fiscal = 0.6306729912757874
population_insee = 337
population_qpv = 0
population_zfu = 0
population_dgf = 348
indice_synthetique_dsu = 0.0
%% Cell type:markdown id: tags:
#### [TEMPORAIRE] Vérifie que le fix d'enveloppee de DSU à l'initialisation corrige bien le NaN sortant de dsu_montant_total
Copie locale du code de dsu_montant_total pour faciliter le debug :
%% Cell type:code id: tags:
``` python
from openfisca_core.model_api import min_
from openfisca_france_dotations_locales import CountryTaxBenefitSystem as OpenFiscaFranceDotationsLocales
from openfisca_france_dotations_locales.variables.base import safe_divide
import numpy as np
ofdl = OpenFiscaFranceDotationsLocales()
# --- dsu_montant_total
# TODO set_input('dsu_montant_total', YEAR -1)
# np.full(NOMBRE_TOTAL_COMMUNES_2024, ofdl.parameters(YEAR-1).dotation_solidarite_urbaine.montant.metropole)
dsu_montant_total_montants_an_precedent = simulation_2024.calculate('dsu_montant_total', YEAR -1)
dsu_montant_total_montants_an_precedent[267]
dsu_accroissement_metropole = simulation_2024.calculate('dsu_accroissement_metropole', YEAR) # Etat
dsu_montant_total_formula = dsu_montant_total_montants_an_precedent + (dsu_montant_total_montants_an_precedent * dsu_accroissement_metropole)
# --- dsu_montant_eligible
dsu_montant_total = simulation_2024.calculate('dsu_montant_total', YEAR)
# dsu_montant_total[267]
dsu_an_precedent = simulation_2024.calculate('dsu_montant_total', YEAR-1)
montants_an_precedent = simulation_2024.calculate('dsu_montant_eligible', YEAR-1)
dsu_eligible = simulation_2024.calculate('dsu_eligible', YEAR)
total_a_distribuer = simulation_2024.calculate('dsu_montant_total_eligibles', YEAR)
rang_indice_synthetique_dsu_seuil_bas = simulation_2024.calculate('rang_indice_synthetique_dsu_seuil_bas', YEAR)
rang_indice_synthetique_dsu_seuil_haut = simulation_2024.calculate('rang_indice_synthetique_dsu_seuil_haut', YEAR)
nombre_elig_seuil_bas = simulation_2024.calculate('dsu_nombre_communes_eligibles_seuil_bas', YEAR)
nombre_elig_seuil_haut = simulation_2024.calculate('dsu_nombre_communes_eligibles_seuil_haut', YEAR)
effort_fiscal = simulation_2024.calculate('effort_fiscal', YEAR)
population_insee = simulation_2024.calculate('population_insee', YEAR)
population_qpv = simulation_2024.calculate('population_qpv', YEAR)
population_zfu = simulation_2024.calculate('population_zfu', YEAR)
population_dgf = simulation_2024.calculate('population_dgf', YEAR)
indice_synthetique_dsu = simulation_2024.calculate('indice_synthetique_dsu', YEAR)
facteur_classement_max = ofdl.parameters(YEAR).dotation_solidarite_urbaine.attribution.facteur_classement_max
facteur_classement_min = ofdl.parameters(YEAR).dotation_solidarite_urbaine.attribution.facteur_classement_min
poids_quartiers_prioritaires_ville = ofdl.parameters(YEAR).dotation_solidarite_urbaine.attribution.poids_quartiers_prioritaires_ville
poids_zone_franche_urbaine = ofdl.parameters(YEAR).dotation_solidarite_urbaine.attribution.poids_zone_franche_urbaine
plafond_effort_fiscal = ofdl.parameters(YEAR).dotation_solidarite_urbaine.attribution.plafond_effort_fiscal
augmentation_max = ofdl.parameters(YEAR).dotation_solidarite_urbaine.attribution.augmentation_max
seuil_bas = ofdl.parameters(YEAR).dotation_solidarite_urbaine.eligibilite.seuil_bas_nombre_habitants
seuil_haut = ofdl.parameters(YEAR).dotation_solidarite_urbaine.eligibilite.seuil_haut_nombre_habitants
pourcentage_augmentation_dsu = dsu_montant_total / dsu_an_precedent - 1
eligible_groupe_haut = dsu_eligible * (seuil_haut <= population_dgf)
eligible_groupe_bas = dsu_eligible * (seuil_bas <= population_dgf) * (seuil_haut > population_dgf)
toujours_eligible_groupe_bas = eligible_groupe_bas * (montants_an_precedent > 0)
toujours_eligible_groupe_haut = eligible_groupe_haut * (montants_an_precedent > 0)
nouvellement_eligible_groupe_bas = eligible_groupe_bas * (montants_an_precedent == 0)
nouvellement_eligible_groupe_haut = eligible_groupe_haut * (montants_an_precedent == 0)
toujours_eligible = toujours_eligible_groupe_bas | toujours_eligible_groupe_haut
# Détermination des scores
facteur_classement_seuil_bas = np.where(rang_indice_synthetique_dsu_seuil_bas <= nombre_elig_seuil_bas, (facteur_classement_min - facteur_classement_max) * safe_divide((rang_indice_synthetique_dsu_seuil_bas - 1), (nombre_elig_seuil_bas - 1), 0) + facteur_classement_max, 0)
facteur_classement_seuil_haut = np.where(rang_indice_synthetique_dsu_seuil_haut <= nombre_elig_seuil_haut, (facteur_classement_min - facteur_classement_max) * safe_divide((rang_indice_synthetique_dsu_seuil_haut - 1), (nombre_elig_seuil_haut - 1), 0) + facteur_classement_max, 0)
facteur_classement = facteur_classement_seuil_bas + facteur_classement_seuil_haut
facteur_effort_fiscal = min_(effort_fiscal, plafond_effort_fiscal)
facteur_qpv = (1 + np.where(population_insee > 0, poids_quartiers_prioritaires_ville * population_qpv / population_insee, 0))
facteur_zfu = (1 + np.where(population_insee > 0, poids_zone_franche_urbaine * population_zfu / population_insee, 0))
score_attribution = indice_synthetique_dsu * population_dgf * facteur_classement * facteur_effort_fiscal * facteur_qpv * facteur_zfu
score_anciens_eligibles_groupe_haut = (score_attribution * toujours_eligible_groupe_haut)
score_nouveaux_eligibles_groupe_haut = (score_attribution * nouvellement_eligible_groupe_haut)
score_anciens_eligibles_groupe_bas = (score_attribution * toujours_eligible_groupe_bas)
score_nouveaux_eligibles_groupe_bas = (score_attribution * nouvellement_eligible_groupe_bas)
# clef de répartition groupe haut/groupe bas
total_pop_eligible_augmentation_groupe_bas = (toujours_eligible_groupe_bas * population_dgf).sum()
total_pop_eligible_augmentation_groupe_haut = (toujours_eligible_groupe_haut * population_dgf).sum()
total_pop_eligible_augmentation = total_pop_eligible_augmentation_groupe_haut + total_pop_eligible_augmentation_groupe_bas
# s'il n'y a pas de population, on répartit selon la population totale des groupes (non spécifié par la loi)
if not total_pop_eligible_augmentation:
total_pop_eligible_augmentation_groupe_bas = (eligible_groupe_bas * population_dgf).sum()
total_pop_eligible_augmentation_groupe_haut = (eligible_groupe_haut * population_dgf).sum()
total_pop_eligible_augmentation = total_pop_eligible_augmentation_groupe_haut + total_pop_eligible_augmentation_groupe_bas
part_augmentation_groupe_bas = total_pop_eligible_augmentation_groupe_bas / total_pop_eligible_augmentation
part_augmentation_groupe_haut = 1 - part_augmentation_groupe_bas
# clef de répartition : on attribue une valeur des points d'augmentation égale au pourcentage
# d'augmentation de la DSU
rapport_valeur_point = pourcentage_augmentation_dsu # Le rapport valeur point dépend
# probablement du groupe, mais on ignore les détails de son calcul
total_points_groupe_bas = (score_anciens_eligibles_groupe_bas * rapport_valeur_point + score_nouveaux_eligibles_groupe_bas).sum()
total_points_groupe_haut = (score_anciens_eligibles_groupe_haut * rapport_valeur_point + score_nouveaux_eligibles_groupe_haut).sum()
# Détermination de la valeur du point
montant_garanti_eligible = (toujours_eligible * montants_an_precedent).sum()
valeur_point_groupe_bas = (total_a_distribuer - montant_garanti_eligible) * part_augmentation_groupe_bas / total_points_groupe_bas if total_points_groupe_bas else 0
valeur_point_groupe_haut = (total_a_distribuer - montant_garanti_eligible) * part_augmentation_groupe_haut / total_points_groupe_haut if total_points_groupe_haut else 0
montant_toujours_eligible_groupe_bas = (min_(valeur_point_groupe_bas * rapport_valeur_point * score_attribution, augmentation_max) + montants_an_precedent) * toujours_eligible_groupe_bas
montant_toujours_eligible_groupe_haut = (min_(valeur_point_groupe_haut * rapport_valeur_point * score_attribution, augmentation_max) + montants_an_precedent) * toujours_eligible_groupe_haut
montant_nouvellement_eligible_groupe_bas = valeur_point_groupe_bas * score_attribution * nouvellement_eligible_groupe_bas
montant_nouvellement_eligible_groupe_haut = valeur_point_groupe_haut * score_attribution * nouvellement_eligible_groupe_haut
result = montant_toujours_eligible_groupe_bas + montant_toujours_eligible_groupe_haut + montant_nouvellement_eligible_groupe_bas + montant_nouvellement_eligible_groupe_haut
result[267]
```
%% Output
2479034400.0
/var/folders/6j/g2pqrjdd17bfw3f59gdj03dm0000gn/T/ipykernel_42426/3445433324.py:62: RuntimeWarning: invalid value encountered in divide
facteur_qpv = (1 + np.where(population_insee > 0, poids_quartiers_prioritaires_ville * population_qpv / population_insee, 0))
/var/folders/6j/g2pqrjdd17bfw3f59gdj03dm0000gn/T/ipykernel_42426/3445433324.py:63: RuntimeWarning: invalid value encountered in divide
facteur_zfu = (1 + np.where(population_insee > 0, poids_zone_franche_urbaine * population_zfu / population_insee, 0))
0.0
%% Cell type:markdown id: tags:
### DSU - éligible - part spontanée
%% Cell type:code id: tags:
``` python
# dsu_part_spontanee
# = np.where((montants_an_precedent > 0) * dsu_eligible, montants_an_precedent, dsu_montant_eligible)
calculate_ecart_2024(
"Dotation de solidarité urbaine et de cohésion sociale - Montant attribution spontanée DSU",
"dsu_part_spontanee",
"[🏢 DSU][part spontanée]"
)
```
%% Output
[2024][🏢 DSU][part spontanée] Écart calculé par simulation [0.0] - officiellement notifié [0] : 0.0
%% Cell type:markdown id: tags:
### DSU - éligible - part augmentation
%% Cell type:code id: tags:
``` python
# progression = augmentation ?
# 'Dotation de solidarité urbaine et de cohésion sociale - Montant progression de la DSU'
# dsu_part_augmentation = dsu_montant_eligible - dsu_part_spontanee
```
%% Cell type:markdown id: tags:
### DSU - total montant
%% Cell type:code id: tags:
``` python
# dsu_montant_eligible
# = montant_toujours_eligible_groupe_bas + montant_toujours_eligible_groupe_haut
# + montant_nouvellement_eligible_groupe_bas + montant_nouvellement_eligible_groupe_haut
# "Montant total reçu par la commune au titre de son éligibilité à la DSU (incluant part spontanée et augmentation)"
# dsu_montant
# = dsu_montant_eligible + dsu_montant_garantie_non_eligible
```
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment