diff --git a/notebooks/memos/_memo_prestations_familiales.ipynb b/notebooks/memos/_memo_prestations_familiales.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..1acc06909861b4b788c906562c74776c77efa305 --- /dev/null +++ b/notebooks/memos/_memo_prestations_familiales.ipynb @@ -0,0 +1,991 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "iaidrdi has been updated in leximpact-survey-scenario\n", + "plus_values_prelevement_forfaitaire_unique_ir has been updated in leximpact-survey-scenario\n", + "rfr_plus_values_hors_rni has been updated in leximpact-survey-scenario\n", + "rpns_imposables has been updated in leximpact-survey-scenario\n", + "rpns_autres_revenus has been updated in leximpact-survey-scenario\n", + "paje_naissance has been updated in leximpact-survey-scenario\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "import os\n", + "\n", + "from leximpact_prepare_data.pipeline_survey_scenario import PipelineErfsSurveyScenario" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Données de la CNAF : Dépenses tous régimes des prestations familiales et sociales gérées par la branche Famille\n", + "http://data.caf.fr/dataset/les-depenses-tous-regimes-de-prestations-familiales-et-sociales\n", + "\n", + "Les chiffres france entière tout régimes correspondent aux chiffres publiés dans la fiche 33 du PANORAMA DREES Minima sociaux et prestations sociales - Ménages aux revenus modestes et redistribution - Édition 2023\n", + "\n", + "https://drees.solidarites-sante.gouv.fr/publications-communique-de-presse-documents-de-reference/panoramas-de-la-drees/minima-sociaux-et" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "current_path = os.getcwd()\n", + "prestations = pd.read_csv(f\"{current_path}/data/cnaf_prestations_2021.csv\",sep = \";\",encoding = \"iso-8859-3\",decimal = ',')" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['En millions d'euros', 'Dep_Ts_Regimes_Metro_2021',\n", + " 'Dep_Caf_Metro_2021', 'Dep_Ts_Regimes_Dom_2021', 'Dep_Caf_Dom_2021',\n", + " 'Dep_Ts_Regimes_2021', 'Dep_Caf_2021'],\n", + " dtype='object')" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "prestations.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "comparaison_metrop_dom = prestations[[\"En millions d'euros\",'Dep_Ts_Regimes_Metro_2021','Dep_Ts_Regimes_Dom_2021','Dep_Ts_Regimes_2021']].copy()\n", + "comparaison_metrop_dom.columns = ['nom','metropole','dom','france_entiere']\n", + "comparaison_metrop_dom['part_dom'] = comparaison_metrop_dom.dom / comparaison_metrop_dom.france_entiere\n", + "comparaison_metrop_dom = comparaison_metrop_dom.iloc[[1,2,3,4,5,9,10,11,19]]" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>nom</th>\n", + " <th>metropole</th>\n", + " <th>dom</th>\n", + " <th>france_entiere</th>\n", + " <th>part_dom</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>Allocations familiales (AF)</td>\n", + " <td>12131.740930</td>\n", + " <td>528.228413</td>\n", + " <td>12659.969340</td>\n", + " <td>0.041724</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>Complément familial (CF)</td>\n", + " <td>2271.825331</td>\n", + " <td>88.924939</td>\n", + " <td>2360.750270</td>\n", + " <td>0.037668</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>Allocation de rentrée scolaire (ARS)</td>\n", + " <td>1945.299985</td>\n", + " <td>101.926929</td>\n", + " <td>2047.226915</td>\n", + " <td>0.049788</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>Allocation de soutien familial (ASF)</td>\n", + " <td>1567.451734</td>\n", + " <td>206.984701</td>\n", + " <td>1774.436435</td>\n", + " <td>0.116648</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5</th>\n", + " <td>Allocation déducation de lenfant handicapé</td>\n", + " <td>1165.679768</td>\n", + " <td>53.954245</td>\n", + " <td>1219.634013</td>\n", + " <td>0.044238</td>\n", + " </tr>\n", + " <tr>\n", + " <th>9</th>\n", + " <td>PAJE naissance adoption</td>\n", + " <td>699.242865</td>\n", + " <td>30.070908</td>\n", + " <td>729.313773</td>\n", + " <td>0.041232</td>\n", + " </tr>\n", + " <tr>\n", + " <th>10</th>\n", + " <td>PAJE naissance adoption de base (AB)</td>\n", + " <td>2857.611244</td>\n", + " <td>128.789330</td>\n", + " <td>2986.400574</td>\n", + " <td>0.043125</td>\n", + " </tr>\n", + " <tr>\n", + " <th>11</th>\n", + " <td>PAJE complément (optionnel) libre choix activi...</td>\n", + " <td>761.976684</td>\n", + " <td>8.255074</td>\n", + " <td>770.231757</td>\n", + " <td>0.010718</td>\n", + " </tr>\n", + " <tr>\n", + " <th>19</th>\n", + " <td>PAJE complément mode de garde (CMG)</td>\n", + " <td>6237.270601</td>\n", + " <td>120.318693</td>\n", + " <td>6357.589294</td>\n", + " <td>0.018925</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " nom metropole \\\n", + "1 Allocations familiales (AF) 12131.740930 \n", + "2 Complément familial (CF) 2271.825331 \n", + "3 Allocation de rentrée scolaire (ARS) 1945.299985 \n", + "4 Allocation de soutien familial (ASF) 1567.451734 \n", + "5 Allocation déducation de lenfant handicapé 1165.679768 \n", + "9 PAJE naissance adoption 699.242865 \n", + "10 PAJE naissance adoption de base (AB) 2857.611244 \n", + "11 PAJE complément (optionnel) libre choix activi... 761.976684 \n", + "19 PAJE complément mode de garde (CMG) 6237.270601 \n", + "\n", + " dom france_entiere part_dom \n", + "1 528.228413 12659.969340 0.041724 \n", + "2 88.924939 2360.750270 0.037668 \n", + "3 101.926929 2047.226915 0.049788 \n", + "4 206.984701 1774.436435 0.116648 \n", + "5 53.954245 1219.634013 0.044238 \n", + "9 30.070908 729.313773 0.041232 \n", + "10 128.789330 2986.400574 0.043125 \n", + "11 8.255074 770.231757 0.010718 \n", + "19 120.318693 6357.589294 0.018925 " + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "comparaison_metrop_dom" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "--> A l'exception de l'ASF, les versements dans les DOM représentent moins de 5 % de chaque prestation familiale. Donc ça fait une extrapolation pour les DOM assez raisonnable." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "LeximpactErfsSurveyScenario : Using /home/cgl/.config/openfisca-survey-manager as config_files_directory\n", + "years_available=[2021] vs years=[2021]\n", + "Données du scénario : \n", + " {'input_data_table_by_entity_by_period': {2021: {'individu': 'individu_2021', 'famille': 'famille_2021', 'foyer_fiscal': 'foyer_fiscal_2021', 'menage': 'menage_2021'}}, 'survey': 'leximpact_2021', 'config_files_directory': '/home/cgl/.config/openfisca-survey-manager'}\n" + ] + } + ], + "source": [ + "survey_scenario = PipelineErfsSurveyScenario(\n", + " annee_donnees=2021,\n", + " period = 2021,\n", + " collection = \"leximpact\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th>age</th>\n", + " <th>-1</th>\n", + " <th>0</th>\n", + " <th>1</th>\n", + " <th>2</th>\n", + " <th>3</th>\n", + " <th>4</th>\n", + " <th>5</th>\n", + " <th>6</th>\n", + " <th>7</th>\n", + " <th>8</th>\n", + " <th>9</th>\n", + " <th>10</th>\n", + " <th>11</th>\n", + " <th>12</th>\n", + " <th>13</th>\n", + " <th>14</th>\n", + " <th>15</th>\n", + " <th>16</th>\n", + " <th>17</th>\n", + " <th>18</th>\n", + " <th>19</th>\n", + " <th>20</th>\n", + " <th>21</th>\n", + " <th>22</th>\n", + " <th>23</th>\n", + " <th>24</th>\n", + " <th>25</th>\n", + " <th>26</th>\n", + " <th>27</th>\n", + " <th>28</th>\n", + " <th>29</th>\n", + " <th>30</th>\n", + " <th>31</th>\n", + " <th>32</th>\n", + " <th>33</th>\n", + " <th>34</th>\n", + " <th>35</th>\n", + " <th>36</th>\n", + " <th>37</th>\n", + " <th>38</th>\n", + " <th>39</th>\n", + " <th>40</th>\n", + " <th>41</th>\n", + " <th>42</th>\n", + " <th>43</th>\n", + " <th>44</th>\n", + " <th>45</th>\n", + " <th>46</th>\n", + " <th>47</th>\n", + " <th>48</th>\n", + " <th>49</th>\n", + " <th>50</th>\n", + " <th>51</th>\n", + " <th>52</th>\n", + " <th>53</th>\n", + " <th>54</th>\n", + " <th>55</th>\n", + " <th>56</th>\n", + " <th>57</th>\n", + " <th>58</th>\n", + " <th>59</th>\n", + " <th>60</th>\n", + " <th>61</th>\n", + " <th>62</th>\n", + " <th>63</th>\n", + " <th>64</th>\n", + " <th>65</th>\n", + " <th>66</th>\n", + " <th>67</th>\n", + " <th>68</th>\n", + " <th>69</th>\n", + " <th>70</th>\n", + " <th>71</th>\n", + " <th>72</th>\n", + " <th>73</th>\n", + " <th>74</th>\n", + " <th>75</th>\n", + " <th>76</th>\n", + " <th>77</th>\n", + " <th>78</th>\n", + " <th>79</th>\n", + " <th>80</th>\n", + " <th>81</th>\n", + " <th>82</th>\n", + " <th>83</th>\n", + " <th>84</th>\n", + " <th>85</th>\n", + " <th>86</th>\n", + " <th>87</th>\n", + " <th>88</th>\n", + " <th>89</th>\n", + " <th>90</th>\n", + " <th>91</th>\n", + " <th>92</th>\n", + " <th>93</th>\n", + " <th>94</th>\n", + " <th>95</th>\n", + " <th>96</th>\n", + " <th>97</th>\n", + " <th>98</th>\n", + " <th>99</th>\n", + " <th>100</th>\n", + " <th>101</th>\n", + " <th>102</th>\n", + " <th>103</th>\n", + " <th>104</th>\n", + " <th>106</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>weight_individus</th>\n", + " <td>11813.797852</td>\n", + " <td>595541.125</td>\n", + " <td>747895.875</td>\n", + " <td>706839.125</td>\n", + " <td>764462.3125</td>\n", + " <td>767905.9375</td>\n", + " <td>740570.3125</td>\n", + " <td>809808.1875</td>\n", + " <td>802674.6875</td>\n", + " <td>785522.0625</td>\n", + " <td>870029.4375</td>\n", + " <td>825446.6875</td>\n", + " <td>804788.125</td>\n", + " <td>841076.0625</td>\n", + " <td>846182.625</td>\n", + " <td>817947.1875</td>\n", + " <td>782874.75</td>\n", + " <td>809716.6875</td>\n", + " <td>768674.0625</td>\n", + " <td>802181.0</td>\n", + " <td>783870.125</td>\n", + " <td>765311.9375</td>\n", + " <td>752411.25</td>\n", + " <td>727639.5</td>\n", + " <td>688626.8125</td>\n", + " <td>629202.875</td>\n", + " <td>632790.25</td>\n", + " <td>687917.9375</td>\n", + " <td>714123.5</td>\n", + " <td>769003.875</td>\n", + " <td>799839.375</td>\n", + " <td>717439.375</td>\n", + " <td>774477.4375</td>\n", + " <td>785195.3125</td>\n", + " <td>805350.125</td>\n", + " <td>842627.4375</td>\n", + " <td>777170.9375</td>\n", + " <td>809260.25</td>\n", + " <td>839693.625</td>\n", + " <td>807203.125</td>\n", + " <td>860324.0</td>\n", + " <td>812370.0625</td>\n", + " <td>791403.8125</td>\n", + " <td>777163.9375</td>\n", + " <td>801891.4375</td>\n", + " <td>756334.4375</td>\n", + " <td>852508.8125</td>\n", + " <td>890294.875</td>\n", + " <td>866621.0</td>\n", + " <td>919736.875</td>\n", + " <td>839377.875</td>\n", + " <td>827294.625</td>\n", + " <td>796370.625</td>\n", + " <td>834541.75</td>\n", + " <td>913440.875</td>\n", + " <td>900558.3125</td>\n", + " <td>858038.6875</td>\n", + " <td>900795.5625</td>\n", + " <td>795671.875</td>\n", + " <td>831813.0625</td>\n", + " <td>811629.0625</td>\n", + " <td>826684.375</td>\n", + " <td>784713.6875</td>\n", + " <td>801806.0</td>\n", + " <td>787167.9375</td>\n", + " <td>758968.6875</td>\n", + " <td>768000.4375</td>\n", + " <td>760722.125</td>\n", + " <td>738066.8125</td>\n", + " <td>749705.625</td>\n", + " <td>758123.125</td>\n", + " <td>729365.8125</td>\n", + " <td>712206.125</td>\n", + " <td>724757.9375</td>\n", + " <td>679096.3125</td>\n", + " <td>476587.71875</td>\n", + " <td>493704.15625</td>\n", + " <td>430994.5</td>\n", + " <td>448851.9375</td>\n", + " <td>352450.34375</td>\n", + " <td>378944.40625</td>\n", + " <td>397003.9375</td>\n", + " <td>368305.96875</td>\n", + " <td>340749.15625</td>\n", + " <td>319667.3125</td>\n", + " <td>302771.0625</td>\n", + " <td>284818.09375</td>\n", + " <td>261440.859375</td>\n", + " <td>223485.890625</td>\n", + " <td>211814.859375</td>\n", + " <td>186309.125</td>\n", + " <td>139709.46875</td>\n", + " <td>128412.46875</td>\n", + " <td>75231.273438</td>\n", + " <td>70013.09375</td>\n", + " <td>57901.6875</td>\n", + " <td>45743.027344</td>\n", + " <td>28557.216797</td>\n", + " <td>18364.171875</td>\n", + " <td>9658.157227</td>\n", + " <td>9413.837891</td>\n", + " <td>5723.911133</td>\n", + " <td>3112.810059</td>\n", + " <td>1125.075806</td>\n", + " <td>466.519348</td>\n", + " <td>611.301208</td>\n", + " <td>2054.092773</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + "age -1 0 1 2 \\\n", + "weight_individus 11813.797852 595541.125 747895.875 706839.125 \n", + "\n", + "age 3 4 5 6 \\\n", + "weight_individus 764462.3125 767905.9375 740570.3125 809808.1875 \n", + "\n", + "age 7 8 9 10 \\\n", + "weight_individus 802674.6875 785522.0625 870029.4375 825446.6875 \n", + "\n", + "age 11 12 13 14 15 \\\n", + "weight_individus 804788.125 841076.0625 846182.625 817947.1875 782874.75 \n", + "\n", + "age 16 17 18 19 20 \\\n", + "weight_individus 809716.6875 768674.0625 802181.0 783870.125 765311.9375 \n", + "\n", + "age 21 22 23 24 25 \\\n", + "weight_individus 752411.25 727639.5 688626.8125 629202.875 632790.25 \n", + "\n", + "age 26 27 28 29 30 \\\n", + "weight_individus 687917.9375 714123.5 769003.875 799839.375 717439.375 \n", + "\n", + "age 31 32 33 34 \\\n", + "weight_individus 774477.4375 785195.3125 805350.125 842627.4375 \n", + "\n", + "age 35 36 37 38 39 \\\n", + "weight_individus 777170.9375 809260.25 839693.625 807203.125 860324.0 \n", + "\n", + "age 40 41 42 43 \\\n", + "weight_individus 812370.0625 791403.8125 777163.9375 801891.4375 \n", + "\n", + "age 44 45 46 47 48 \\\n", + "weight_individus 756334.4375 852508.8125 890294.875 866621.0 919736.875 \n", + "\n", + "age 49 50 51 52 53 \\\n", + "weight_individus 839377.875 827294.625 796370.625 834541.75 913440.875 \n", + "\n", + "age 54 55 56 57 \\\n", + "weight_individus 900558.3125 858038.6875 900795.5625 795671.875 \n", + "\n", + "age 58 59 60 61 62 \\\n", + "weight_individus 831813.0625 811629.0625 826684.375 784713.6875 801806.0 \n", + "\n", + "age 63 64 65 66 \\\n", + "weight_individus 787167.9375 758968.6875 768000.4375 760722.125 \n", + "\n", + "age 67 68 69 70 \\\n", + "weight_individus 738066.8125 749705.625 758123.125 729365.8125 \n", + "\n", + "age 71 72 73 74 \\\n", + "weight_individus 712206.125 724757.9375 679096.3125 476587.71875 \n", + "\n", + "age 75 76 77 78 \\\n", + "weight_individus 493704.15625 430994.5 448851.9375 352450.34375 \n", + "\n", + "age 79 80 81 82 \\\n", + "weight_individus 378944.40625 397003.9375 368305.96875 340749.15625 \n", + "\n", + "age 83 84 85 86 \\\n", + "weight_individus 319667.3125 302771.0625 284818.09375 261440.859375 \n", + "\n", + "age 87 88 89 90 \\\n", + "weight_individus 223485.890625 211814.859375 186309.125 139709.46875 \n", + "\n", + "age 91 92 93 94 \\\n", + "weight_individus 128412.46875 75231.273438 70013.09375 57901.6875 \n", + "\n", + "age 95 96 97 98 \\\n", + "weight_individus 45743.027344 28557.216797 18364.171875 9658.157227 \n", + "\n", + "age 99 100 101 102 \\\n", + "weight_individus 9413.837891 5723.911133 3112.810059 1125.075806 \n", + "\n", + "age 103 104 106 \n", + "weight_individus 466.519348 611.301208 2054.092773 " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "simulation = survey_scenario.simulations['baseline']\n", + "simulation.compute_pivot_table(columns=['age'],period=\"2021-12\",aggfunc = \"count\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "607354.922852" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "595541.125 + 11813.797852" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.38128611886322833" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "simulation.compute_aggregate(\"paje_naissance\",period=2021)/1e9" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "from leximpact_survey_scenario.scenario_tools.input_variables_list import leximpact_used_as_input_variables" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'leximpact_used_as_input_variables' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m/home/cgl/leximpact/leximpact-prepare-data/notebooks/memos/_memo_prestations_familiales.ipynb Cell 12\u001b[0m line \u001b[0;36m1\n\u001b[0;32m----> <a href='vscode-notebook-cell:/home/cgl/leximpact/leximpact-prepare-data/notebooks/memos/_memo_prestations_familiales.ipynb#X14sZmlsZQ%3D%3D?line=0'>1</a>\u001b[0m temp_tot \u001b[39m=\u001b[39m simulation\u001b[39m.\u001b[39mcreate_data_frame_by_entity(leximpact_used_as_input_variables, merge \u001b[39m=\u001b[39m \u001b[39mTrue\u001b[39;00m, period \u001b[39m=\u001b[39m \u001b[39m2021\u001b[39m)\n", + "\u001b[0;31mNameError\u001b[0m: name 'leximpact_used_as_input_variables' is not defined" + ] + } + ], + "source": [ + "temp_tot = simulation.create_data_frame_by_entity(leximpact_used_as_input_variables, merge = True, period = 2021)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "temp = simulation.create_data_frame_by_entity([\"age\", \"date_naissance\",\"paje_naissance\", \"af_nbenf\",\"prestations_familiales_base_ressources\", \"en_couple\",\"biactivite\"], period=\"2023-12\", merge = True)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "test = temp.loc[temp.age < 1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_13297/2433895206.py:1: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " test.af_nbenf = test.af_nbenf / 12\n", + "/tmp/ipykernel_13297/2433895206.py:2: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " test.paje_naissance = test.paje_naissance/12\n", + "/tmp/ipykernel_13297/2433895206.py:3: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " test.prestations_familiales_base_ressources = test.prestations_familiales_base_ressources/12\n" + ] + } + ], + "source": [ + "test.af_nbenf = test.af_nbenf / 12\n", + "test.paje_naissance = test.paje_naissance/12\n", + "test.prestations_familiales_base_ressources = test.prestations_familiales_base_ressources/12" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'temp_tot' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m/home/cgl/leximpact/leximpact-prepare-data/notebooks/memos/_memo_prestations_familiales.ipynb Cell 16\u001b[0m line \u001b[0;36m1\n\u001b[0;32m----> <a href='vscode-notebook-cell:/home/cgl/leximpact/leximpact-prepare-data/notebooks/memos/_memo_prestations_familiales.ipynb#X20sZmlsZQ%3D%3D?line=0'>1</a>\u001b[0m temp_tot\u001b[39m.\u001b[39mloc[temp_tot\u001b[39m.\u001b[39mfamille_id \u001b[39m==\u001b[39m \u001b[39m48986\u001b[39m]\n", + "\u001b[0;31mNameError\u001b[0m: name 'temp_tot' is not defined" + ] + } + ], + "source": [ + "temp_tot.loc[temp_tot.famille_id == 48986]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>person_id</th>\n", + " <th>date_naissance</th>\n", + " <th>age</th>\n", + " <th>famille_id</th>\n", + " <th>famille_role</th>\n", + " <th>famille_position</th>\n", + " <th>foyer_fiscal_id</th>\n", + " <th>foyer_fiscal_role</th>\n", + " <th>foyer_fiscal_position</th>\n", + " <th>menage_id</th>\n", + " <th>menage_role</th>\n", + " <th>menage_position</th>\n", + " <th>idfam</th>\n", + " <th>af_nbenf</th>\n", + " <th>en_couple</th>\n", + " <th>prestations_familiales_base_ressources</th>\n", + " <th>paje_naissance</th>\n", + " <th>biactivite</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>98623</th>\n", + " <td>98623</td>\n", + " <td>1986-11-30</td>\n", + " <td>37</td>\n", + " <td>48986</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>48986</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>45007</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>48986</td>\n", + " <td>2</td>\n", + " <td>True</td>\n", + " <td>24580.335938</td>\n", + " <td>0.0</td>\n", + " <td>False</td>\n", + " </tr>\n", + " <tr>\n", + " <th>98624</th>\n", + " <td>98624</td>\n", + " <td>1998-10-07</td>\n", + " <td>25</td>\n", + " <td>48986</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>48986</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>45007</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>48986</td>\n", + " <td>2</td>\n", + " <td>True</td>\n", + " <td>24580.335938</td>\n", + " <td>0.0</td>\n", + " <td>False</td>\n", + " </tr>\n", + " <tr>\n", + " <th>98625</th>\n", + " <td>98625</td>\n", + " <td>2022-11-21</td>\n", + " <td>1</td>\n", + " <td>48986</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>48986</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>45007</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>48986</td>\n", + " <td>2</td>\n", + " <td>True</td>\n", + " <td>24580.335938</td>\n", + " <td>0.0</td>\n", + " <td>False</td>\n", + " </tr>\n", + " <tr>\n", + " <th>98626</th>\n", + " <td>98626</td>\n", + " <td>2023-11-25</td>\n", + " <td>0</td>\n", + " <td>48986</td>\n", + " <td>2</td>\n", + " <td>3</td>\n", + " <td>48986</td>\n", + " <td>2</td>\n", + " <td>3</td>\n", + " <td>45007</td>\n", + " <td>2</td>\n", + " <td>3</td>\n", + " <td>48986</td>\n", + " <td>2</td>\n", + " <td>True</td>\n", + " <td>24580.335938</td>\n", + " <td>0.0</td>\n", + " <td>False</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " person_id date_naissance age famille_id famille_role \\\n", + "98623 98623 1986-11-30 37 48986 0 \n", + "98624 98624 1998-10-07 25 48986 1 \n", + "98625 98625 2022-11-21 1 48986 2 \n", + "98626 98626 2023-11-25 0 48986 2 \n", + "\n", + " famille_position foyer_fiscal_id foyer_fiscal_role \\\n", + "98623 0 48986 0 \n", + "98624 1 48986 1 \n", + "98625 2 48986 2 \n", + "98626 3 48986 2 \n", + "\n", + " foyer_fiscal_position menage_id menage_role menage_position idfam \\\n", + "98623 0 45007 0 0 48986 \n", + "98624 1 45007 1 1 48986 \n", + "98625 2 45007 2 2 48986 \n", + "98626 3 45007 2 3 48986 \n", + "\n", + " af_nbenf en_couple prestations_familiales_base_ressources \\\n", + "98623 2 True 24580.335938 \n", + "98624 2 True 24580.335938 \n", + "98625 2 True 24580.335938 \n", + "98626 2 True 24580.335938 \n", + "\n", + " paje_naissance biactivite \n", + "98623 0.0 False \n", + "98624 0.0 False \n", + "98625 0.0 False \n", + "98626 0.0 False " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "temp.loc[temp.famille_id == 48986]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.9327020048976027" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "simulation.compute_aggregate(\"cf\",period=2021)/1e9" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## PAJE - prime à la naissance :\n", + "- versée au 7e mois de grossesse\n", + "- son montant est 2.2975 fois la BMAF\n", + "- le montant est doublé en cas d'adoption mais le nombre d'adoption est très faible (max quelques milliers) donc ne devrait jouer que de quelques pourcents dans le montant total de la prestation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**ATTENTION** pour les prestations familiales, ou pour toutes les prestations d'ailleurs, si on cale sur la masse on va avoir des montants supérieurs aux montants qui sont des forfaits donc c'est quand même une grosse limite... A voir comment on deal avec ça, on ne peut pas faire des montants moyens par exemple.\n", + "Peut être que c'est l'occasion de reprendre le calage sur marge !!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "leximpact-prepare-data-kernel", + "language": "python", + "name": "leximpact-prepare-data-kernel" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/memos/data/README_cnaf_prestations_2021 b/notebooks/memos/data/README_cnaf_prestations_2021 new file mode 100644 index 0000000000000000000000000000000000000000..f8633489b6169485ca7dbea3ddf595e793d23d52 --- /dev/null +++ b/notebooks/memos/data/README_cnaf_prestations_2021 @@ -0,0 +1,43 @@ +Descriptif des données des dépenses tous régimes de prestations familiales et sociales gérées par la branche Famille + +Libellés des colonnes : + +Prestations Prestations versées par la branche Famille (Allocations familiales (AF), Allocation logement familiale (ALF) etc.) +Dep_Ts_Regimes_Metro_20XX Dépenses tous régimes, au titre de l'année 20XX, France métropolitaine +Dep_Caf_Metro_20XX Dépenses régime général (CAF), au titre de l'année 20XX, France métropolitaine +Dep_Ts_Regimes_Dom_20XX Dépenses tous régimes, au titre de l'année 20XX, DOM +Dep_Caf_Dom_20XX Dépenses régime général (CAF), au titre de l'année 20XX, DOM +Dep_Ts_Regimes_20XX Dépenses tous régimes, au titre de l'année 20XX, France entière +Dep_Caf_20XX Dépenses régime général (CAF), au titre de l'année 20XX, France entière + + +Remarques : + +Les dépenses sont exprimées en millions d’Euros. + +La dépense est indiquée pour chacune des prestations familiales (petite enfance et enfance jeunesse) et sociales (aides au logement, revenu de solidarité active). Elle est déclinée selon les catégories suivantes : +- Tous régimes France entière +- Tous régimes métropole +- Tous régimes DOM +- Régime général (CAF), France entière +- Régime général (CAF), métropole +- Régime général (CAF), DOM + +Le champ tous régimes agrège les données du régime général (CAF), du régime agricole (salariés et exploitants) et des régimes spéciaux (SNCF et RATP jusqu’en 2014, EDF jusqu’en 2012). +Les dépenses de RSA de plusieurs départements ont été recentralisées dans les comptes de l'Etat. Il s'agit de la Guyane et de Mayotte à partir de 2019, de la Réunion à compter de 2020, ainsi que de la Seine-Saint-Denis et des Pyrénées Orientales à compter respectivement de janvier 2021 et juillet 2022. + +Pour l'année 2021, la répartition des dépenses de prime inflation entre Métropole et Dom se fait à l'aide d'une clé de passage. + +Les caisses des Dom ont la particularité de verser les prestations aux allocataires de l'ensemble des régimes. + +Le foyer allocataire est l’entité administrative à laquelle les Caf et les autres régimes versent au moins une prestation. Il est composé de l’allocataire (personne qui perçoit au moins une +prestation au regard de sa situation familiale et/ou ses ressources), de son conjoint/concubin/pacsé éventuel, des enfants à charge et autres personnes à charge au sens de +la réglementation en vigueur. Un foyer allocataire peut donc comporter une ou plusieurs personnes. + +Le droit versable signifie que le foyer allocataire remplit toutes les conditions pour être effectivement payé au titre du mois d’observation. En particulier ne sont pas +inclus dans ce périmètre les bénéficiaires qui n’ont pas fourni l’intégralité de leurs pièces justificatives, ou ceux dont le montant de la prestation est inférieur au +seuil de versement. + +Vous pouvez trouver plus d'informations sur le site de la branche famille: http://www.caf.fr/ +et sur le Cahier des données sociales : http://www.caf.fr/etudes-et-statistiques/publications/cahier-des-donnees-sociales + diff --git a/pyproject.toml b/pyproject.toml index 4d9ecd004dfe867b1af31e248c28debcd02cc92a..b0fe4348d073b2b36b229703355c6fee8114d17b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,8 +28,9 @@ diagrams = { version = "^0.20.0", optional = true} python-dotenv = {version = "^0.19.2", optional = true} # for vaex vaex-server = "^0.8.1" vaex-jupyter = "^0.7.0" -leximpact-survey-scenario = "^1.0.1" -#leximpact-survey-scenario = {git = "https://git.leximpact.dev/leximpact/simulateur-socio-fiscal/budget/leximpact-survey-scenario.git", rev="master"} +# leximpact-survey-scenario = "0.1.2" +#leximpact-survey-scenario = {git = "https://git.leximpact.dev/leximpact/simulateur-socio-fiscal/budget/leximpact-survey-scenario.git", rev="refacto-scenario"} +leximpact-survey-scenario = {git = "https://git.leximpact.dev/leximpact/simulateur-socio-fiscal/budget/leximpact-survey-scenario.git", rev="2-adaptation-prestations-familiales"} leximpact-aggregates = "^0.0.28" multipledispatch = "^0.6.0" nbdev = "^2.2.10" diff --git a/tests/aggregates.ipynb b/tests/aggregates.ipynb index 2b6260fe67cb816d7471f992482b90df6e4b2d45..c59c5e71342898ec0fecd6c584a6531aa82ef12d 100644 --- a/tests/aggregates.ipynb +++ b/tests/aggregates.ipynb @@ -15,7 +15,8 @@ "plus_values_prelevement_forfaitaire_unique_ir has been updated in leximpact-survey-scenario\n", "rfr_plus_values_hors_rni has been updated in leximpact-survey-scenario\n", "rpns_imposables has been updated in leximpact-survey-scenario\n", - "rpns_autres_revenus has been updated in leximpact-survey-scenario\n" + "rpns_autres_revenus has been updated in leximpact-survey-scenario\n", + "paje_naissance has been updated in leximpact-survey-scenario\n" ] } ], @@ -25,7 +26,7 @@ "from openfisca_france_data.aggregates import FranceAggregates\n", "from leximpact_common_python_libraries.config import Configuration\n", "\n", - "annee_de_calcul = 2021\n", + "annee_de_calcul = 2023\n", "annee_donnees = 2021\n", "source_cible = \"france_entiere\" # \"ines\"\n", "\n", @@ -35,7 +36,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": { "tags": [] }, @@ -45,15 +46,32 @@ "output_type": "stream", "text": [ "LeximpactErfsSurveyScenario : Using /home/cgl/.config/openfisca-survey-manager as config_files_directory\n", - "years_available=[2021] vs years=[2021]\n", + "years_available=[2021] vs years=[2023]\n", + "WARNING: no data for 2023, will took 2021\n", "Données du scénario : \n", - " {'input_data_table_by_entity_by_period': {2021: {'individu': 'individu_2021', 'famille': 'famille_2021', 'foyer_fiscal': 'foyer_fiscal_2021', 'menage': 'menage_2021'}}, 'survey': 'leximpact_2021', 'config_files_directory': '/home/cgl/.config/openfisca-survey-manager'}\n" + " {'input_data_table_by_entity_by_period': {2023: {'individu': 'individu_2021', 'famille': 'famille_2021', 'foyer_fiscal': 'foyer_fiscal_2021', 'menage': 'menage_2021'}}, 'survey': 'leximpact_2021', 'config_files_directory': '/home/cgl/.config/openfisca-survey-manager'}\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ + "/home/cgl/leximpact/leximpact-prepare-data/.venv/lib/python3.10/site-packages/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/travail_non_salarie.py:199: RuntimeWarning:\n", + "\n", + "divide by zero encountered in divide\n", + "\n", + "/home/cgl/leximpact/leximpact-prepare-data/.venv/lib/python3.10/site-packages/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/travail_non_salarie.py:199: RuntimeWarning:\n", + "\n", + "invalid value encountered in multiply\n", + "\n", + "/home/cgl/leximpact/leximpact-prepare-data/.venv/lib/python3.10/site-packages/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/travail_non_salarie.py:199: RuntimeWarning:\n", + "\n", + "divide by zero encountered in divide\n", + "\n", + "/home/cgl/leximpact/leximpact-prepare-data/.venv/lib/python3.10/site-packages/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/travail_non_salarie.py:199: RuntimeWarning:\n", + "\n", + "invalid value encountered in multiply\n", + "\n", "/home/cgl/leximpact/leximpact-prepare-data/.venv/lib/python3.10/site-packages/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/travail_non_salarie.py:199: RuntimeWarning:\n", "\n", "divide by zero encountered in divide\n", @@ -131,24 +149,27 @@ "output_type": "stream", "text": [ "LeximpactErfsSurveyScenario : Using /home/cgl/.config/openfisca-survey-manager as config_files_directory\n", - "years_available=[2021] vs years=[2021]\n", + "years_available=[2023] vs years=[2023]\n", "Données du scénario : \n", - " {'input_data_table_by_entity_by_period': {2021: {'individu': 'individu_2021', 'famille': 'famille_2021', 'foyer_fiscal': 'foyer_fiscal_2021', 'menage': 'menage_2021'}}, 'survey': 'leximpact_2021', 'config_files_directory': '/home/cgl/.config/openfisca-survey-manager'}\n" + " {'input_data_table_by_entity_by_period': {2023: {'individu': 'individu_2023', 'famille': 'famille_2023', 'foyer_fiscal': 'foyer_fiscal_2023', 'menage': 'menage_2023'}}, 'survey': 'leximpact_2023', 'config_files_directory': '/home/cgl/.config/openfisca-survey-manager'}\n" ] }, { - "ename": "AttributeError", - "evalue": "'PipelineErfsSurveyScenario' object has no attribute 'tax_benefits_systems'", + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: '/home/cgl/leximpact/leximpact-aggregates/aggregates/POTE/distribution_100/2023/assiette_csg_plus_values.yaml'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m/home/cgl/leximpact/leximpact-prepare-data/tests/aggregates.ipynb Cell 3\u001b[0m line \u001b[0;36m2\n\u001b[1;32m <a href='vscode-notebook-cell:/home/cgl/leximpact/leximpact-prepare-data/tests/aggregates.ipynb#W2sZmlsZQ%3D%3D?line=0'>1</a>\u001b[0m target_variables \u001b[39m=\u001b[39m [\n\u001b[1;32m <a href='vscode-notebook-cell:/home/cgl/leximpact/leximpact-prepare-data/tests/aggregates.ipynb#W2sZmlsZQ%3D%3D?line=1'>2</a>\u001b[0m \u001b[39m\"\u001b[39m\u001b[39massiette_csg_plus_values\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[1;32m <a href='vscode-notebook-cell:/home/cgl/leximpact/leximpact-prepare-data/tests/aggregates.ipynb#W2sZmlsZQ%3D%3D?line=2'>3</a>\u001b[0m \u001b[39m\"\u001b[39m\u001b[39massiette_csg_revenus_capital\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m <a href='vscode-notebook-cell:/home/cgl/leximpact/leximpact-prepare-data/tests/aggregates.ipynb#W2sZmlsZQ%3D%3D?line=17'>18</a>\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mrpns_imposables\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[1;32m <a href='vscode-notebook-cell:/home/cgl/leximpact/leximpact-prepare-data/tests/aggregates.ipynb#W2sZmlsZQ%3D%3D?line=18'>19</a>\u001b[0m ]\n\u001b[1;32m <a href='vscode-notebook-cell:/home/cgl/leximpact/leximpact-prepare-data/tests/aggregates.ipynb#W2sZmlsZQ%3D%3D?line=20'>21</a>\u001b[0m comparator \u001b[39m=\u001b[39m LeximpactErfsComparator(\n\u001b[1;32m <a href='vscode-notebook-cell:/home/cgl/leximpact/leximpact-prepare-data/tests/aggregates.ipynb#W2sZmlsZQ%3D%3D?line=21'>22</a>\u001b[0m period\u001b[39m=\u001b[39mannee_de_calcul, annee_donnees\u001b[39m=\u001b[39mannee_de_calcul, copules_comparaison\u001b[39m=\u001b[39m\u001b[39mFalse\u001b[39;00m\n\u001b[1;32m <a href='vscode-notebook-cell:/home/cgl/leximpact/leximpact-prepare-data/tests/aggregates.ipynb#W2sZmlsZQ%3D%3D?line=22'>23</a>\u001b[0m )\n\u001b[0;32m---> <a href='vscode-notebook-cell:/home/cgl/leximpact/leximpact-prepare-data/tests/aggregates.ipynb#W2sZmlsZQ%3D%3D?line=23'>24</a>\u001b[0m comparator\u001b[39m.\u001b[39;49mcompare(\n\u001b[1;32m <a href='vscode-notebook-cell:/home/cgl/leximpact/leximpact-prepare-data/tests/aggregates.ipynb#W2sZmlsZQ%3D%3D?line=24'>25</a>\u001b[0m browse\u001b[39m=\u001b[39;49m\u001b[39mFalse\u001b[39;49;00m,\n\u001b[1;32m <a href='vscode-notebook-cell:/home/cgl/leximpact/leximpact-prepare-data/tests/aggregates.ipynb#W2sZmlsZQ%3D%3D?line=25'>26</a>\u001b[0m load\u001b[39m=\u001b[39;49m\u001b[39mFalse\u001b[39;49;00m,\n\u001b[1;32m <a href='vscode-notebook-cell:/home/cgl/leximpact/leximpact-prepare-data/tests/aggregates.ipynb#W2sZmlsZQ%3D%3D?line=26'>27</a>\u001b[0m verbose\u001b[39m=\u001b[39;49m\u001b[39mFalse\u001b[39;49;00m,\n\u001b[1;32m <a href='vscode-notebook-cell:/home/cgl/leximpact/leximpact-prepare-data/tests/aggregates.ipynb#W2sZmlsZQ%3D%3D?line=27'>28</a>\u001b[0m debug\u001b[39m=\u001b[39;49m\u001b[39mFalse\u001b[39;49;00m,\n\u001b[1;32m <a href='vscode-notebook-cell:/home/cgl/leximpact/leximpact-prepare-data/tests/aggregates.ipynb#W2sZmlsZQ%3D%3D?line=28'>29</a>\u001b[0m target_variables\u001b[39m=\u001b[39;49mtarget_variables,\n\u001b[1;32m <a href='vscode-notebook-cell:/home/cgl/leximpact/leximpact-prepare-data/tests/aggregates.ipynb#W2sZmlsZQ%3D%3D?line=29'>30</a>\u001b[0m period\u001b[39m=\u001b[39;49m\u001b[39mNone\u001b[39;49;00m,\n\u001b[1;32m <a href='vscode-notebook-cell:/home/cgl/leximpact/leximpact-prepare-data/tests/aggregates.ipynb#W2sZmlsZQ%3D%3D?line=30'>31</a>\u001b[0m rebuild\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m,\n\u001b[1;32m <a href='vscode-notebook-cell:/home/cgl/leximpact/leximpact-prepare-data/tests/aggregates.ipynb#W2sZmlsZQ%3D%3D?line=31'>32</a>\u001b[0m summary\u001b[39m=\u001b[39;49m\u001b[39mFalse\u001b[39;49;00m,\n\u001b[1;32m <a href='vscode-notebook-cell:/home/cgl/leximpact/leximpact-prepare-data/tests/aggregates.ipynb#W2sZmlsZQ%3D%3D?line=32'>33</a>\u001b[0m )\n", - "File \u001b[0;32m~/leximpact/leximpact-prepare-data/.venv/lib/python3.10/site-packages/openfisca_france_data/comparator.py:457\u001b[0m, in \u001b[0;36mAbstractComparator.compare\u001b[0;34m(self, browse, load, verbose, debug, target_variables, period, rebuild, summary, compute_divergence)\u001b[0m\n\u001b[1;32m 455\u001b[0m \u001b[39mprint\u001b[39m(error)\n\u001b[1;32m 456\u001b[0m pdb\u001b[39m.\u001b[39mpost_mortem(sys\u001b[39m.\u001b[39mexc_info()[\u001b[39m2\u001b[39m])\n\u001b[0;32m--> 457\u001b[0m \u001b[39mraise\u001b[39;00m error\n", - "File \u001b[0;32m~/leximpact/leximpact-prepare-data/.venv/lib/python3.10/site-packages/openfisca_france_data/comparator.py:399\u001b[0m, in \u001b[0;36mAbstractComparator.compare\u001b[0;34m(self, browse, load, verbose, debug, target_variables, period, rebuild, summary, compute_divergence)\u001b[0m\n\u001b[1;32m 395\u001b[0m input_dataframe_by_entity, target_dataframe_by_entity \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mget_test_dataframes(rebuild)\n\u001b[1;32m 397\u001b[0m log\u001b[39m.\u001b[39mdebug(\u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mTest data has been prepared in \u001b[39m\u001b[39m{\u001b[39;00mdatetime\u001b[39m.\u001b[39mdatetime\u001b[39m.\u001b[39mnow()\u001b[39m \u001b[39m\u001b[39m-\u001b[39m\u001b[39m \u001b[39mstart_time\u001b[39m}\u001b[39;00m\u001b[39m\"\u001b[39m)\n\u001b[0;32m--> 399\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mcompute_aggregates_comparison(\n\u001b[1;32m 400\u001b[0m input_dataframe_by_entity \u001b[39m=\u001b[39;49m input_dataframe_by_entity,\n\u001b[1;32m 401\u001b[0m )\n\u001b[1;32m 403\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcompute_distibution_comparison(input_dataframe_by_entity \u001b[39m=\u001b[39m input_dataframe_by_entity)\n\u001b[1;32m 405\u001b[0m \u001b[39mif\u001b[39;00m compute_divergence:\n", - "File \u001b[0;32m~/leximpact/leximpact-prepare-data/leximpact_prepare_data/scenario_tools/comparison.py:631\u001b[0m, in \u001b[0;36mLeximpactErfsComparator.compute_aggregates_comparison\u001b[0;34m(self, input_dataframe_by_entity)\u001b[0m\n\u001b[1;32m 628\u001b[0m summary[\u001b[39m\"\u001b[39m\u001b[39msource\u001b[39m\u001b[39m\"\u001b[39m] \u001b[39m=\u001b[39m \u001b[39m\"\u001b[39m\u001b[39msimulation\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 629\u001b[0m \u001b[39mreturn\u001b[39;00m summary\n\u001b[0;32m--> 631\u001b[0m survey_scenario \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mget_survey_scenario()\n\u001b[1;32m 633\u001b[0m records \u001b[39m=\u001b[39m (\n\u001b[1;32m 634\u001b[0m [\n\u001b[1;32m 635\u001b[0m summarize_variable_from_pote(variable)\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 649\u001b[0m ]\n\u001b[1;32m 650\u001b[0m )\n\u001b[1;32m 652\u001b[0m df \u001b[39m=\u001b[39m (\n\u001b[1;32m 653\u001b[0m pd\u001b[39m.\u001b[39mDataFrame\u001b[39m.\u001b[39mfrom_records(records)\n\u001b[1;32m 654\u001b[0m \u001b[39m.\u001b[39msort_values([\u001b[39m\"\u001b[39m\u001b[39mvariable\u001b[39m\u001b[39m\"\u001b[39m, \u001b[39m\"\u001b[39m\u001b[39msource\u001b[39m\u001b[39m\"\u001b[39m])\n\u001b[1;32m 655\u001b[0m \u001b[39m.\u001b[39mset_index([\u001b[39m\"\u001b[39m\u001b[39mvariable\u001b[39m\u001b[39m\"\u001b[39m, \u001b[39m\"\u001b[39m\u001b[39msource\u001b[39m\u001b[39m\"\u001b[39m])\n\u001b[1;32m 656\u001b[0m )\n", - "File \u001b[0;32m~/leximpact/leximpact-prepare-data/leximpact_prepare_data/scenario_tools/comparison.py:79\u001b[0m, in \u001b[0;36mLeximpactErfsComparator.get_survey_scenario\u001b[0;34m(self, data, survey_name)\u001b[0m\n\u001b[1;32m 70\u001b[0m survey_scenario \u001b[39m=\u001b[39m PipelineErfsSurveyScenario(\n\u001b[1;32m 71\u001b[0m period\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mperiod,\n\u001b[1;32m 72\u001b[0m annee_donnees\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mannee_donnees,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 75\u001b[0m data\u001b[39m=\u001b[39mdata,\n\u001b[1;32m 76\u001b[0m ) \n\u001b[1;32m 78\u001b[0m \u001b[39m#survey_scenario.tax_benefit_system = survey_scenario.tax_benefits_systems['baseline']\u001b[39;00m\n\u001b[0;32m---> 79\u001b[0m tbs \u001b[39m=\u001b[39m survey_scenario\u001b[39m.\u001b[39;49mtax_benefits_systems[\u001b[39m'\u001b[39m\u001b[39mbaseline\u001b[39m\u001b[39m'\u001b[39m]\n\u001b[1;32m 80\u001b[0m \u001b[39mfor\u001b[39;00m variable \u001b[39min\u001b[39;00m foyer_projected_variables:\n\u001b[1;32m 81\u001b[0m class_name \u001b[39m=\u001b[39m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39m{\u001b[39;00mvariable\u001b[39m}\u001b[39;00m\u001b[39m_foyer_fiscal\u001b[39m\u001b[39m\"\u001b[39m\n", - "\u001b[0;31mAttributeError\u001b[0m: 'PipelineErfsSurveyScenario' object has no attribute 'tax_benefits_systems'" + "File \u001b[0;32m~/leximpact/openfisca-france-data/openfisca_france_data/comparator.py:457\u001b[0m, in \u001b[0;36mAbstractComparator.compare\u001b[0;34m(self, browse, load, verbose, debug, target_variables, period, rebuild, summary, compute_divergence)\u001b[0m\n\u001b[1;32m 455\u001b[0m \u001b[39mprint\u001b[39m(error)\n\u001b[1;32m 456\u001b[0m pdb\u001b[39m.\u001b[39mpost_mortem(sys\u001b[39m.\u001b[39mexc_info()[\u001b[39m2\u001b[39m])\n\u001b[0;32m--> 457\u001b[0m \u001b[39mraise\u001b[39;00m error\n", + "File \u001b[0;32m~/leximpact/openfisca-france-data/openfisca_france_data/comparator.py:399\u001b[0m, in \u001b[0;36mAbstractComparator.compare\u001b[0;34m(self, browse, load, verbose, debug, target_variables, period, rebuild, summary, compute_divergence)\u001b[0m\n\u001b[1;32m 395\u001b[0m input_dataframe_by_entity, target_dataframe_by_entity \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mget_test_dataframes(rebuild)\n\u001b[1;32m 397\u001b[0m log\u001b[39m.\u001b[39mdebug(\u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mTest data has been prepared in \u001b[39m\u001b[39m{\u001b[39;00mdatetime\u001b[39m.\u001b[39mdatetime\u001b[39m.\u001b[39mnow()\u001b[39m \u001b[39m\u001b[39m-\u001b[39m\u001b[39m \u001b[39mstart_time\u001b[39m}\u001b[39;00m\u001b[39m\"\u001b[39m)\n\u001b[0;32m--> 399\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mcompute_aggregates_comparison(\n\u001b[1;32m 400\u001b[0m input_dataframe_by_entity \u001b[39m=\u001b[39;49m input_dataframe_by_entity,\n\u001b[1;32m 401\u001b[0m )\n\u001b[1;32m 403\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcompute_distibution_comparison(input_dataframe_by_entity \u001b[39m=\u001b[39m input_dataframe_by_entity)\n\u001b[1;32m 405\u001b[0m \u001b[39mif\u001b[39;00m compute_divergence:\n", + "File \u001b[0;32m~/leximpact/leximpact-prepare-data/leximpact_prepare_data/scenario_tools/comparison.py:664\u001b[0m, in \u001b[0;36mLeximpactErfsComparator.compute_aggregates_comparison\u001b[0;34m(self, input_dataframe_by_entity)\u001b[0m\n\u001b[1;32m 651\u001b[0m \u001b[39mreturn\u001b[39;00m summary\n\u001b[1;32m 653\u001b[0m survey_scenario \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mget_survey_scenario()\n\u001b[1;32m 655\u001b[0m records \u001b[39m=\u001b[39m (\n\u001b[1;32m 656\u001b[0m [\n\u001b[1;32m 657\u001b[0m summarize_variable_from_pote(variable)\n\u001b[1;32m 658\u001b[0m \u001b[39mfor\u001b[39;00m variable \u001b[39min\u001b[39;00m variable_pote_by_variable\u001b[39m.\u001b[39mkeys()\n\u001b[1;32m 659\u001b[0m ]\n\u001b[1;32m 660\u001b[0m \u001b[39m+\u001b[39m [\n\u001b[1;32m 661\u001b[0m summarize_variable(variable, survey_scenario, period)\n\u001b[1;32m 662\u001b[0m \u001b[39mfor\u001b[39;00m variable \u001b[39min\u001b[39;00m variable_pote_by_variable\u001b[39m.\u001b[39mkeys()\n\u001b[1;32m 663\u001b[0m ]\n\u001b[0;32m--> 664\u001b[0m \u001b[39m+\u001b[39m [\n\u001b[1;32m 665\u001b[0m summarize_variable_from_pote_tenth(variable)\n\u001b[1;32m 666\u001b[0m \u001b[39mfor\u001b[39;00m variable \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mtarget_variables\n\u001b[1;32m 667\u001b[0m ]\n\u001b[1;32m 668\u001b[0m \u001b[39m+\u001b[39m [\n\u001b[1;32m 669\u001b[0m summarize_variable(variable, survey_scenario, period)\n\u001b[1;32m 670\u001b[0m \u001b[39mfor\u001b[39;00m variable \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mtarget_variables\n\u001b[1;32m 671\u001b[0m ]\n\u001b[1;32m 672\u001b[0m )\n\u001b[1;32m 674\u001b[0m df \u001b[39m=\u001b[39m (\n\u001b[1;32m 675\u001b[0m pd\u001b[39m.\u001b[39mDataFrame\u001b[39m.\u001b[39mfrom_records(records)\n\u001b[1;32m 676\u001b[0m \u001b[39m.\u001b[39msort_values([\u001b[39m\"\u001b[39m\u001b[39mvariable\u001b[39m\u001b[39m\"\u001b[39m, \u001b[39m\"\u001b[39m\u001b[39msource\u001b[39m\u001b[39m\"\u001b[39m])\n\u001b[1;32m 677\u001b[0m \u001b[39m.\u001b[39mset_index([\u001b[39m\"\u001b[39m\u001b[39mvariable\u001b[39m\u001b[39m\"\u001b[39m, \u001b[39m\"\u001b[39m\u001b[39msource\u001b[39m\u001b[39m\"\u001b[39m])\n\u001b[1;32m 678\u001b[0m )\n\u001b[1;32m 680\u001b[0m aggregates_table \u001b[39m=\u001b[39m pd\u001b[39m.\u001b[39mDataFrame(index\u001b[39m=\u001b[39mdf\u001b[39m.\u001b[39mindex)\n", + "File \u001b[0;32m~/leximpact/leximpact-prepare-data/leximpact_prepare_data/scenario_tools/comparison.py:665\u001b[0m, in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 651\u001b[0m \u001b[39mreturn\u001b[39;00m summary\n\u001b[1;32m 653\u001b[0m survey_scenario \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mget_survey_scenario()\n\u001b[1;32m 655\u001b[0m records \u001b[39m=\u001b[39m (\n\u001b[1;32m 656\u001b[0m [\n\u001b[1;32m 657\u001b[0m summarize_variable_from_pote(variable)\n\u001b[1;32m 658\u001b[0m \u001b[39mfor\u001b[39;00m variable \u001b[39min\u001b[39;00m variable_pote_by_variable\u001b[39m.\u001b[39mkeys()\n\u001b[1;32m 659\u001b[0m ]\n\u001b[1;32m 660\u001b[0m \u001b[39m+\u001b[39m [\n\u001b[1;32m 661\u001b[0m summarize_variable(variable, survey_scenario, period)\n\u001b[1;32m 662\u001b[0m \u001b[39mfor\u001b[39;00m variable \u001b[39min\u001b[39;00m variable_pote_by_variable\u001b[39m.\u001b[39mkeys()\n\u001b[1;32m 663\u001b[0m ]\n\u001b[1;32m 664\u001b[0m \u001b[39m+\u001b[39m [\n\u001b[0;32m--> 665\u001b[0m summarize_variable_from_pote_tenth(variable)\n\u001b[1;32m 666\u001b[0m \u001b[39mfor\u001b[39;00m variable \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mtarget_variables\n\u001b[1;32m 667\u001b[0m ]\n\u001b[1;32m 668\u001b[0m \u001b[39m+\u001b[39m [\n\u001b[1;32m 669\u001b[0m summarize_variable(variable, survey_scenario, period)\n\u001b[1;32m 670\u001b[0m \u001b[39mfor\u001b[39;00m variable \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mtarget_variables\n\u001b[1;32m 671\u001b[0m ]\n\u001b[1;32m 672\u001b[0m )\n\u001b[1;32m 674\u001b[0m df \u001b[39m=\u001b[39m (\n\u001b[1;32m 675\u001b[0m pd\u001b[39m.\u001b[39mDataFrame\u001b[39m.\u001b[39mfrom_records(records)\n\u001b[1;32m 676\u001b[0m \u001b[39m.\u001b[39msort_values([\u001b[39m\"\u001b[39m\u001b[39mvariable\u001b[39m\u001b[39m\"\u001b[39m, \u001b[39m\"\u001b[39m\u001b[39msource\u001b[39m\u001b[39m\"\u001b[39m])\n\u001b[1;32m 677\u001b[0m \u001b[39m.\u001b[39mset_index([\u001b[39m\"\u001b[39m\u001b[39mvariable\u001b[39m\u001b[39m\"\u001b[39m, \u001b[39m\"\u001b[39m\u001b[39msource\u001b[39m\u001b[39m\"\u001b[39m])\n\u001b[1;32m 678\u001b[0m )\n\u001b[1;32m 680\u001b[0m aggregates_table \u001b[39m=\u001b[39m pd\u001b[39m.\u001b[39mDataFrame(index\u001b[39m=\u001b[39mdf\u001b[39m.\u001b[39mindex)\n", + "File \u001b[0;32m~/leximpact/leximpact-prepare-data/leximpact_prepare_data/scenario_tools/comparison.py:547\u001b[0m, in \u001b[0;36mLeximpactErfsComparator.compute_aggregates_comparison.<locals>.summarize_variable_from_pote_tenth\u001b[0;34m(variable)\u001b[0m\n\u001b[1;32m 543\u001b[0m config \u001b[39m=\u001b[39m Configuration(project_folder\u001b[39m=\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mleximpact-prepare-data\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[1;32m 544\u001b[0m aggregate_manager \u001b[39m=\u001b[39m AggregateManager(\n\u001b[1;32m 545\u001b[0m aggregates_path\u001b[39m=\u001b[39mconfig\u001b[39m.\u001b[39mget(\u001b[39m\"\u001b[39m\u001b[39mAGREGATS_PATH\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[1;32m 546\u001b[0m )\n\u001b[0;32m--> 547\u001b[0m aggregate_manager\u001b[39m.\u001b[39;49mload_aggregate(\n\u001b[1;32m 548\u001b[0m \u001b[39m\"\u001b[39;49m\u001b[39mPOTE\u001b[39;49m\u001b[39m\"\u001b[39;49m,\n\u001b[1;32m 549\u001b[0m variable_pote,\n\u001b[1;32m 550\u001b[0m year\u001b[39m=\u001b[39;49m\u001b[39mstr\u001b[39;49m(period),\n\u001b[1;32m 551\u001b[0m data_structure\u001b[39m=\u001b[39;49m\u001b[39m\"\u001b[39;49m\u001b[39mdistribution_100\u001b[39;49m\u001b[39m\"\u001b[39;49m,\n\u001b[1;32m 552\u001b[0m )\n\u001b[1;32m 554\u001b[0m \u001b[39mfor\u001b[39;00m d \u001b[39min\u001b[39;00m aggregate_manager\u001b[39m.\u001b[39maggregate\u001b[39m.\u001b[39mdata:\n\u001b[1;32m 555\u001b[0m \u001b[39mif\u001b[39;00m (\n\u001b[1;32m 556\u001b[0m d\u001b[39m.\u001b[39mdata_structure \u001b[39m==\u001b[39m DataStructure\u001b[39m.\u001b[39mDISTRIBUTION_100\n\u001b[1;32m 557\u001b[0m \u001b[39mand\u001b[39;00m d\u001b[39m.\u001b[39mdate \u001b[39m==\u001b[39m \u001b[39mstr\u001b[39m(period)\n\u001b[1;32m 558\u001b[0m ):\n", + "File \u001b[0;32m~/leximpact/leximpact-prepare-data/.venv/lib/python3.10/site-packages/leximpact_aggregates/aggregate.py:324\u001b[0m, in \u001b[0;36mAggregateManager.load_aggregate\u001b[0;34m(self, dataset, variable, year, data_structure, copules_var)\u001b[0m\n\u001b[1;32m 314\u001b[0m filename \u001b[39m=\u001b[39m AggregateManager\u001b[39m.\u001b[39mget_path(\n\u001b[1;32m 315\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39maggregates_path,\n\u001b[1;32m 316\u001b[0m dataset,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 321\u001b[0m copules_var,\n\u001b[1;32m 322\u001b[0m )\n\u001b[1;32m 323\u001b[0m \u001b[39m# Path(self.aggregates_path) / dataset / year / (variable + \".yaml\")\u001b[39;00m\n\u001b[0;32m--> 324\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mload_from_yaml(filename)\n\u001b[1;32m 325\u001b[0m list_data \u001b[39m=\u001b[39m []\n\u001b[1;32m 326\u001b[0m \u001b[39mfor\u001b[39;00m d \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39maggregate\u001b[39m.\u001b[39mdata:\n", + "File \u001b[0;32m~/leximpact/leximpact-prepare-data/.venv/lib/python3.10/site-packages/leximpact_aggregates/aggregate.py:237\u001b[0m, in \u001b[0;36mAggregateManager.load_from_yaml\u001b[0;34m(self, filename)\u001b[0m\n\u001b[1;32m 231\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mload_from_yaml\u001b[39m(\u001b[39mself\u001b[39m, filename: \u001b[39mstr\u001b[39m):\n\u001b[1;32m 232\u001b[0m \u001b[39m \u001b[39m\u001b[39m\"\"\"\u001b[39;00m\n\u001b[1;32m 233\u001b[0m \u001b[39m Read a YAML file to an Aggregate\u001b[39;00m\n\u001b[1;32m 234\u001b[0m \u001b[39m Args:\u001b[39;00m\n\u001b[1;32m 235\u001b[0m \u001b[39m filename (str): The path and filename to read\u001b[39;00m\n\u001b[1;32m 236\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 237\u001b[0m \u001b[39mwith\u001b[39;00m \u001b[39mopen\u001b[39;49m(filename) \u001b[39mas\u001b[39;00m file:\n\u001b[1;32m 238\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39maggregate \u001b[39m=\u001b[39m ruamel\u001b[39m.\u001b[39myaml\u001b[39m.\u001b[39mYAML()\u001b[39m.\u001b[39mload(file)\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/home/cgl/leximpact/leximpact-aggregates/aggregates/POTE/distribution_100/2023/assiette_csg_plus_values.yaml'" ] } ], @@ -187,6 +208,13 @@ " summary=False,\n", ")" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": {