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é.
Merge request reports
Activity
1 description: Part de la DSR (péréquation et cible) répartie en fonction du potentiel financier par hectare 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): 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 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 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)) 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 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) 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 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 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 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
@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.