Skip to content
Snippets Groups Projects

Montants dsr : les trois fractions.

Created by: magemax

PR calculant le montant (hors garantie) des trois fractions de la DSR.

  • Le montant de la fraction cible est littéralement le même que la fraction péréquation (et a priori on ne changera pas cet état de fait dans les réformes possibles prévues) donc peut être que copier/coller comme j'ai fait est un peu bourrin et qu'on pourrait réduire la taille du code

  • Tous les mécanismes de calculs ont le même schéma global de fonctionnement : un montant global à attibuer aux communes éligibles est déterminé. Puis un score d'attribution est calculé pour chaque commune éligible, puis le montant global est réparti au prorata de ce score. Ce mécanisme arrive 9 fois dans la DSR ( 4 fois pour péréquation et cible, et une pour bourg-centre), à chaque fois on crée 4 variables (montant global attribué, score d'attribution, valeur du point et montant final résultant). Peut-être qu'on pourrait trouver un moyen de le faire plus économiquement en lignes de codes (i.e. calculer un truc qui calcule automatiquement avec comme variables le montant global attribué et la formule du score d'attribution)

  • Les mêmes paramètres d'attribution s'appliquent à la fraction péréquation et à la fraction cible. Je les ai donc rassemblés dans dotation_solidarite_rurale.attribution , mais ça n'est pas forcément la bonne approche. On pourrait aussi créer un dotation.solidarite_rurale.perequation_et_cible.attribution.

  • les variables finales sont pour l'instant du type "dsr_montant_hors_garanties_fraction_bourg_centre" , la variable "dsr_fraction_bourg_centre" n'est pas encore liée. Il y manque (elon les textes) les garanties aux communes nouvelles, aux communes nouvellement non éligibles, et les garanties de stabilité.

@sandcha

Merge request reports

Loading
Loading

Activity

Filter activity
  • Approvals
  • Assignees & reviewers
  • Comments (from bots)
  • Comments (from users)
  • Commits & branches
  • Edits
  • Labels
  • Lock status
  • Mentions
  • Merge request status
  • Tracking
  • Benoît Courty
    Benoît Courty @benoit-cty started a thread on commit 5b52fb28
  • 1 description: Part de la DSR (péréquation et cible) répartie en fonction du potentiel financier par hectare
    • Created by: sandcha

      Les paramètres peuvent également être réunis dans le même fichier. On pourrait avoir quelque chose comme poids_potentiel_financier.par_habitant et poids_potentiel_financier.par_hectare.

  • Benoît Courty
    Benoît Courty @benoit-cty started a thread on commit 5b52fb28
  • 238 population_attribution = np.minimum(population_dgf_plafonnee, plafond_population)
    239 facteur_pot_fin = 2 - potentiel_financier_par_habitant / pot_fin_10000
    240 facteur_zrr = np.where(zrr, coefficient_zrr, 1.0)
    241 facteur_effort_fiscal = np.minimum(plafond_effort_fiscal, effort_fiscal)
    242
    243 return dsr_eligible_fraction_bourg_centre * population_attribution * facteur_pot_fin * facteur_zrr * facteur_effort_fiscal
    244
    245
    246 class dsr_montant_total_eligibles_fraction_bourg_centre(Variable):
    247 value_type = float
    248 entity = Commune
    249 definition_period = YEAR
    250 label = "Montant disponible pour communes éligibles DSR fraction bourg-centre"
    251 reference = "http://www.dotations-dgcl.interieur.gouv.fr/consultation/documentAffichage.php?id=94"
    252
    253 def formula(commune, period, parameters):
  • Benoît Courty
    Benoît Courty @benoit-cty started a thread on commit 5b52fb28
  • 239 facteur_pot_fin = 2 - potentiel_financier_par_habitant / pot_fin_10000
    240 facteur_zrr = np.where(zrr, coefficient_zrr, 1.0)
    241 facteur_effort_fiscal = np.minimum(plafond_effort_fiscal, effort_fiscal)
    242
    243 return dsr_eligible_fraction_bourg_centre * population_attribution * facteur_pot_fin * facteur_zrr * facteur_effort_fiscal
    244
    245
    246 class dsr_montant_total_eligibles_fraction_bourg_centre(Variable):
    247 value_type = float
    248 entity = Commune
    249 definition_period = YEAR
    250 label = "Montant disponible pour communes éligibles DSR fraction bourg-centre"
    251 reference = "http://www.dotations-dgcl.interieur.gouv.fr/consultation/documentAffichage.php?id=94"
    252
    253 def formula(commune, period, parameters):
    254 montant_total_a_attribuer = 545_248_126 - 898_172 - 6_165_344
    • Created by: sandcha

      Typo dans le montant de la masse de crédits mis en répartition ? Dans la note page 9 il est dit : "La masse des crédits mis en répartition en métropole au titre de l'année 2019 s’élève à 45 248 126 €."

              montant_total_a_attribuer = 45_248_126 - 898_172 - 6_165_344
  • Created by sandcha

    Review: Changes requested

    1ers retours.

  • Benoît Courty
    Benoît Courty @benoit-cty started a thread on commit 5b52fb28
  • 239 facteur_pot_fin = 2 - potentiel_financier_par_habitant / pot_fin_10000
    240 facteur_zrr = np.where(zrr, coefficient_zrr, 1.0)
    241 facteur_effort_fiscal = np.minimum(plafond_effort_fiscal, effort_fiscal)
    242
    243 return dsr_eligible_fraction_bourg_centre * population_attribution * facteur_pot_fin * facteur_zrr * facteur_effort_fiscal
    244
    245
    246 class dsr_montant_total_eligibles_fraction_bourg_centre(Variable):
    247 value_type = float
    248 entity = Commune
    249 definition_period = YEAR
    250 label = "Montant disponible pour communes éligibles DSR fraction bourg-centre"
    251 reference = "http://www.dotations-dgcl.interieur.gouv.fr/consultation/documentAffichage.php?id=94"
    252
    253 def formula(commune, period, parameters):
    254 montant_total_a_attribuer = 545_248_126 - 898_172 - 6_165_344
    • Created by: sandcha

      Mais effectivement, page 2, il est dit : "545 248 129 € sont répartis au titre de la fraction « bourg - centre » (7,56 %)"

  • Benoît Courty
  • Benoît Courty
    Benoît Courty @benoit-cty started a thread on commit 5b52fb28
  • 221 zrr = commune('zrr', period)
    222 dsr_eligible_fraction_bourg_centre = commune("dsr_eligible_fraction_bourg_centre", period)
    223 outre_mer = commune('outre_mer', period)
    224 population_dgf = commune('population_dgf', period)
    225
    226 taille_max_commune = parameters(period).dotation_solidarite_rurale.seuil_nombre_habitants
    227
    228 coefficient_zrr = parameters(period).dotation_solidarite_rurale.bourg_centre.attribution.coefficient_zrr
    229 plafond_effort_fiscal = parameters(period).dotation_solidarite_rurale.bourg_centre.attribution.plafond_effort_fiscal
    230 plafond_population = parameters(period).dotation_solidarite_rurale.bourg_centre.attribution.plafond_population
    231
    232 # oui le taille_max_commune est le même que pour le seuil d'éligibilité, notre paramétrisation est ainsi
    233 communes_moins_10000 = (~outre_mer) * (population_dgf < taille_max_commune)
    234
    235 pot_fin_10000 = (np.sum(communes_moins_10000 * potentiel_financier)
    236 / np.sum(communes_moins_10000 * population_dgf))
    • Created by: sandcha

      Cette formule revient plusieurs fois dans ce fichier. En faire une variable intermédiaire d'autant qu'elle a un sens métier clair ?

  • Benoît Courty
  • Benoît Courty
    Benoît Courty @benoit-cty started a thread on commit 5b52fb28
  • 257 '''
    258
    259 def formula_2019_01(commune, period, parameters):
    260 montant_total_a_attribuer = 545_248_126 - 898_172 - 6_165_344
    261 # montant inscrit dans la note. Pour le transformer en formule il faut
    262 # que soient implémentés :
    263 # le montant global de la dgf (fait dans les paramètres)
    264 # les formules de garanties pour communes nouvellement non éligibles (moyen)
    265 # les garanties communes nouvelles (chaud)
    266 # la répartition du montant global vers la DSR (très difficile)
    267 return montant_total_a_attribuer
    268
    269
    270 class dsr_valeur_point_fraction_bourg_centre(Variable):
    271 value_type = float
    272 entity = Commune
  • Benoît Courty
  • Created by magemax

    Review: Commented

    Hmmm il faudra floorer à zéro le score lié au potentiel financier par hectare (et updater les tests) : avec le code d'aujourd'hui, le score peut être négatif.

  • Benoît Courty
    Benoît Courty @benoit-cty started a thread on commit 5b52fb28
  • 316 scores = commune("dsr_score_attribution_perequation_part_potentiel_financier_par_hectare", period)
    317 valeur_point = commune("dsr_valeur_point_fraction_perequation_part_potentiel_financier_par_hectare", period)
    318 return scores * valeur_point
    319
    320
    321 class dsr_montant_hors_garanties_fraction_perequation(Variable):
    322 value_type = float
    323 entity = Commune
    324 label = "Valeurs attribuée hors garanties de stabilité aux communes éligibles au titre de la fraction péréquation de la DSR"
    325 definition_period = YEAR
    326
    327 def formula(commune, period, parameters):
    328 part_potentiel_financier_par_habitant = commune('dsr_fraction_perequation_part_potentiel_financier_par_habitant', period)
    329 part_longueur_voirie = commune('dsr_fraction_perequation_part_longueur_voirie', period)
    330 part_enfants = commune('dsr_fraction_perequation_part_enfants', period)
    331 part_potentiel_financier_par_hectare = commune('dsr_fraction_perequation_part_potentiel_financier_par_hectare', period)
  • Benoît Courty
    Benoît Courty @benoit-cty started a thread on commit 5b52fb28
  • 214 value_type = float
    215 entity = Commune
    216 definition_period = YEAR
    217 label = "Valeur du point DSR fraction péréquation - part potentiel financier par habitant"
    218 reference = "http://www.dotations-dgcl.interieur.gouv.fr/consultation/documentAffichage.php?id=94"
    219
    220 def formula(commune, period, parameters):
    221 montant_total_a_attribuer = commune("dsr_montant_total_eligibles_fraction_perequation_part_potentiel_financier_par_habitant", period)
    222 dsr_score_attribution = commune("dsr_score_attribution_perequation_part_potentiel_financier_par_habitant", period)
    223 score_total = dsr_score_attribution.sum()
    224 return montant_total_a_attribuer / score_total
    225
    226
    227 class dsr_valeur_point_fraction_perequation_part_longueur_voirie(Variable):
    228 value_type = float
    229 entity = Commune
  • Benoît Courty
    Benoît Courty @benoit-cty started a thread on commit 5b52fb28
  • 251
    252 class dsr_montant_total_eligibles_fraction_bourg_centre(Variable):
    253 value_type = float
    254 entity = Commune
    255 definition_period = YEAR
    256 label = "Montant disponible pour communes de métropole éligibles DSR fraction bourg-centre"
    257 reference = "http://www.dotations-dgcl.interieur.gouv.fr/consultation/documentAffichage.php?id=94"
    258 documentation = '''
    259 2019 : La masse des crédits mis en répartition en métropole au titre de l'année 2019
    260 s’élève à 45 248 126 €. Le montant des garanties versées aux communes
    261 devenues inéligibles en 2018 (hors communes nouvelles) représente 898 172 €.
    262 Par ailleurs, 6 165 344 € ont été alloués aux communes nouvelles inéligibles.
    263 '''
    264
    265 def formula_2019_01(commune, period, parameters):
    266 montant_total_a_attribuer = 545_248_126 - 898_172 - 6_165_344
  • Benoît Courty
    Benoît Courty @benoit-cty started a thread on commit 5b52fb28
  • 209
    210 return dsr_eligible_fraction_perequation * population_dgf * facteur_pot_fin
    211
    212
    213 class dsr_valeur_point_fraction_perequation_part_potentiel_financier_par_habitant(Variable):
    214 value_type = float
    215 entity = Commune
    216 definition_period = YEAR
    217 label = "Valeur du point DSR fraction péréquation - part potentiel financier par habitant"
    218 reference = "http://www.dotations-dgcl.interieur.gouv.fr/consultation/documentAffichage.php?id=94"
    219
    220 def formula(commune, period, parameters):
    221 montant_total_a_attribuer = commune("dsr_montant_total_eligibles_fraction_perequation_part_potentiel_financier_par_habitant", period)
    222 dsr_score_attribution = commune("dsr_score_attribution_perequation_part_potentiel_financier_par_habitant", period)
    223 score_total = dsr_score_attribution.sum()
    224 return montant_total_a_attribuer / score_total
  • Benoît Courty
    Benoît Courty @benoit-cty started a thread on commit 5b52fb28
  • 27 28 return (~outre_mer) * (population_dgf < seuil_nombre_habitants) * (potentiel_financier_par_habitant <= plafond)
    28 29
    29 30
    31 class dsr_montant_total_eligibles_fraction_perequation(Variable):
    • Created by: sandcha

      Renommer en dsr_montant_perequation ? Ceci sachant qu'on manipule une liste de communes (donc on sait que ce n'est pas le montant national) et que cette liste couvre toutes les communes (même les non éligibles auront une valeur qui devrait être à zéro).

  • Created by sandcha

    Review: Approved

    Top ! Sera probablement amendé suite à la confrontation avec les données DGCL sur leximpact-server.

  • Created by: sandcha

    @magemax Pour répondre aux interrogations exprimées ci-dessus :

    Le montant de la fraction cible est littéralement le même que la fraction péréquation (et a priori on ne changera pas cet état de fait dans les réformes possibles prévues) donc peut être que copier/coller comme j'ai fait est un peu bourrin et qu'on pourrait réduire la taille du code

    On pourrait effectivement mettre en commun des variables. Il y en a de plusieurs sortes. On pourrait utiliser une variable pour les scores. Ceci dit, je ne suis pas certaine que cela nous rende service pour les réformes, sauf à conserver la dépendance de principe entre péréquation et cible pour l'usager. Il y a aussi des variables plutôt de l'ordre du helper mais qui prendraient sens au niveau métier (les moyennes où fait appel au sum numpy par exemple) qui elles pourraient être extraites sans impacter la réforme.

    Les mêmes paramètres d'attribution s'appliquent à la fraction péréquation et à la fraction cible. Je les ai donc rassemblés dans dotation_solidarite_rurale.attribution , mais ça n'est pas forcément la bonne approche. On pourrait aussi créer un dotation.solidarite_rurale.perequation_et_cible.attribution.

    Toujours dans l'esprit des réformes, je pense qu'on préfèrera manipuler les paramètres fraction par fraction et qu'il serait mieux de les séparer même si aujourd'hui les valeurs sont identiques. De manière générale, se pose aussi la question des perspectives d'évolution de la loi. Si c'est dans son esprit (et a de grandes chances de le rester) de structurer cible et péréquation de la même manière, cela prend sens de les rassembler et de les relier dans leximpact-client.

  • Merged by: magemax at 2020-07-21 08:28:47 UTC

  • Please register or sign in to reply
    Loading