{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# Elections et cartes \u00e9lectorales - \u00e9nonc\u00e9\n", "\n", "D'apr\u00e8s wikip\u00e9dia, le [Gerrymandering](https://fr.wikipedia.org/wiki/Gerrymandering) est un terme politique nord-am\u00e9ricain pour d\u00e9signer le d\u00e9coupage des circonscriptions \u00e9lectorales ayant pour objectif de donner l\u2019avantage \u00e0 un parti, un candidat, ou un groupe donn\u00e9. Et c'est ce que nous allons faire dans cette s\u00e9ance. C'est un probl\u00e8me tout-\u00e0-fait d'actualit\u00e9 : [Primaire de la droite : 10 228 bureaux de vote strat\u00e9giquement r\u00e9partis](http://www.lemonde.fr/election-presidentielle-2017/article/2016/09/30/primaire-de-la-droite-10-228-bureaux-de-vote-strategiquement-repartis_5005831_4854003.html)."]}, {"cell_type": "code", "execution_count": 1, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:50:46.959642", "start_time": "2016-10-30T09:50:46.230655"}}, "outputs": [], "source": ["%matplotlib inline"]}, {"cell_type": "code", "execution_count": 2, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:50:46.977649", "start_time": "2016-10-30T09:50:46.962642"}}, "outputs": [{"data": {"text/html": ["
run previous cell, wait for 2 seconds
\n", ""], "text/plain": [""]}, "execution_count": 3, "metadata": {}, "output_type": "execute_result"}], "source": ["from jyquickhelper import add_notebook_menu\n", "add_notebook_menu()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Donn\u00e9es\n", "\n", "Les donn\u00e9es sont de plusieurs types et sont regroup\u00e9es en trois fichiers :\n", "\n", "* [R\u00e9sultat des \u00e9lections l\u00e9gislatives fran\u00e7aises de 2012 au niveau bureau de vote](https://www.data.gouv.fr/fr/datasets/resultat-des-elections-legislatives-francaises-de-2012-au-niveau-bureau-de-vote-nd/)\n", "* [Countours des circonscriptions des l\u00e9gislatives](https://www.data.gouv.fr/fr/datasets/countours-des-circonscriptions-des-legislatives-nd/)\n", "* [Localisation des buraux de votes](http://www.xavierdupre.fr/enseignement/complements/bureauxvotegeo.zip)\n", "* [Localisation des villes](https://github.com/sdpython/actuariat_python/raw/master/src/actuariat_python/data/data_elections/villes_geo.zip)\n", "* [Localisation des bureaux de vote avec Cartelec](http://www.cartelec.net/?page_id=3609), cette base requiert la conversion des coordonn\u00e9es (lire ce [notebook](http://www.xavierdupre.fr/app/ensae_teaching_cs/helpsphinx/notebooks/td1a_cenonce_session_12.html#cartographie))\n", "\n", "Il est conseill\u00e9 de t\u00e9l\u00e9charger directement ces donn\u00e9es. Les paragraphes suivants expliquent comment ceux-ci ont \u00e9t\u00e9 r\u00e9cup\u00e9r\u00e9s ou construit. Il n'est pas imm\u00e9diat d'obtenir la localisation des bureaux de vote. Celle-ci n'est d'ailleurs pas compl\u00e8te."]}, {"cell_type": "markdown", "metadata": {}, "source": ["### R\u00e9sultats des \u00e9lections l\u00e9gislatives"]}, {"cell_type": "code", "execution_count": 3, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:50:52.596577", "start_time": "2016-10-30T09:50:46.980646"}}, "outputs": [], "source": ["from actuariat_python.data import elections_legislatives_bureau_vote\n", "tour = elections_legislatives_bureau_vote(source='xd')"]}, {"cell_type": "code", "execution_count": 4, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:50:52.771571", "start_time": "2016-10-30T09:50:52.602572"}}, "outputs": [{"data": {"text/html": ["
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
N\u00b0 tourCode d\u00e9partementCode de la communeNom de la communeN\u00b0 de circonscription LgN\u00b0 de cantonN\u00b0 de bureau de voteInscritsVotantsExprim\u00e9sN\u00b0 de d\u00e9p\u00f4t du candidatNom du candidatPr\u00e9nom du candidatCode nuance du candidatNombre de voix du candidat
385820116Arbigny126000130914614432BRETONXavierUMP87
385920116Arbigny126000130914614433DEBATJean-Fran\u00e7oisSOC57
387120124Attignat121000174642541132BRETONXavierUMP233
387220124Attignat121000174642541133DEBATJean-Fran\u00e7oisSOC178
387320124Attignat1210002131180179232BRETONXavierUMP446
\n", "
"], "text/plain": [" N\u00b0 tour Code d\u00e9partement Code de la commune Nom de la commune \\\n", "3858 2 01 16 Arbigny \n", "3859 2 01 16 Arbigny \n", "3871 2 01 24 Attignat \n", "3872 2 01 24 Attignat \n", "3873 2 01 24 Attignat \n", "\n", " N\u00b0 de circonscription Lg N\u00b0 de canton N\u00b0 de bureau de vote Inscrits \\\n", "3858 1 26 0001 309 \n", "3859 1 26 0001 309 \n", "3871 1 21 0001 746 \n", "3872 1 21 0001 746 \n", "3873 1 21 0002 1311 \n", "\n", " Votants Exprim\u00e9s N\u00b0 de d\u00e9p\u00f4t du candidat Nom du candidat \\\n", "3858 146 144 32 BRETON \n", "3859 146 144 33 DEBAT \n", "3871 425 411 32 BRETON \n", "3872 425 411 33 DEBAT \n", "3873 801 792 32 BRETON \n", "\n", " Pr\u00e9nom du candidat Code nuance du candidat Nombre de voix du candidat \n", "3858 Xavier UMP 87 \n", "3859 Jean-Fran\u00e7ois SOC 57 \n", "3871 Xavier UMP 233 \n", "3872 Jean-Fran\u00e7ois SOC 178 \n", "3873 Xavier UMP 446 "]}, "execution_count": 5, "metadata": {}, "output_type": "execute_result"}], "source": ["tour[\"T2\"].sort_values([\"Code d\u00e9partement\", \"N\u00b0 de circonscription Lg\"]).head()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### G\u00e9olocalisation des circonscription"]}, {"cell_type": "code", "execution_count": 5, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:50:52.993566", "start_time": "2016-10-30T09:50:52.778575"}}, "outputs": [], "source": ["from actuariat_python.data import elections_legislatives_circonscription_geo\n", "geo = elections_legislatives_circonscription_geo()"]}, {"cell_type": "code", "execution_count": 6, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:50:53.095565", "start_time": "2016-10-30T09:50:52.999565"}}, "outputs": [{"data": {"text/html": ["
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
code_circonscriptiondepartmentnumerocommuneskml_shapesimple_form
110100101101053-01072-01106-01150-01177-01184-01195-0124...<Polygon><outerBoundaryIs><LinearRing><coordin...False
120100201201008-01047-01099-01202-01213-01224-01366-0138...<Polygon><outerBoundaryIs><LinearRing><coordin...True
130100301301033-01044-01081-01091-01174-01189-01215-0125...<Polygon><outerBoundaryIs><LinearRing><coordin...True
140100401401023-01025-01026-01144-01159-01231-01320-0133...<Polygon><outerBoundaryIs><LinearRing><coordin...False
150100501501002-01004-01007-01041-01089-01149-01345-0137...<Polygon><outerBoundaryIs><LinearRing><coordin...True
\n", "
"], "text/plain": [" code_circonscription department numero \\\n", "11 01001 01 1 \n", "12 01002 01 2 \n", "13 01003 01 3 \n", "14 01004 01 4 \n", "15 01005 01 5 \n", "\n", " communes \\\n", "11 01053-01072-01106-01150-01177-01184-01195-0124... \n", "12 01008-01047-01099-01202-01213-01224-01366-0138... \n", "13 01033-01044-01081-01091-01174-01189-01215-0125... \n", "14 01023-01025-01026-01144-01159-01231-01320-0133... \n", "15 01002-01004-01007-01041-01089-01149-01345-0137... \n", "\n", " kml_shape simple_form \n", "11 5.294455999999968,46.193934 5.279780999999957,46.201967 5.2820520000000215,46.211633 5.258239693115229,46.21151582325097 5.2581992646485105,46.2083773977195 5.246123010742167,46.20489445115752 5.245254158935495,46.20280868033653 5.240432576904368,46.199348983660926 5.23716710070812,46.19529946757567 5.229953412841837,46.195408656674 5.226543291137659,46.20120799400516 5.214944595275824,46.20383315680887 5.210212354492228,46.20764618417071 5.205343111083948,46.20376238484074 5.206997000000001,46.191323 5.19510600000001,46.18786 5.187468999999965,46.190827 5.170859999999948,46.203126 5.162395999999944,46.199387 5.15610700000002,46.189904 5.142047000000048,46.192223 5.123888999999963,46.207671 5.111119000000031,46.203891 5.097426000000041,46.206108 5.089811999999938,46.195268 5.068122000000017,46.208969 5.058287999999948,46.22074 5.05758000000003,46.224014 5.065923999999995,46.231556 5.093984999999975,46.232529 5.095609999999965,46.235634 5.0915129999999635,46.250725 5.067033000000038,46.253046 5.047692999999981,46.250829 5.034760000000006,46.25606 5.027125000000069,46.264835 5.022599000000014,46.270653 5.025237999999945,46.27702 5.0366390000000365,46.286329 5.03779499999996,46.296424 5.011349999999993,46.304235 5.008049000000028,46.313805 5.025981999999999,46.319235 5.0349670000000515,46.332568 5.018135000000029,46.347235 5.004950000000008,46.356205 4.98293000000001,46.359589 4.976036000000022,46.352773 4.958721999999966,46.358602 4.947116999999935,46.369538 4.932804000000033,46.367719 4.930385999999999,46.372948 4.8962810000000445,46.384617 4.897916000000009,46.398713 4.888207999999963,46.402982 4.888682000000017,46.417448 4.891531999999984,46.427525 4.891796999999997,46.438555 4.892886999999973,46.442572 4.894444000000021,46.445374 4.914447999999993,46.462163 4.914530000000013,46.480113 4.914522000000034,46.481374 4.91528500000004,46.488234 4.926993000000039,46.499251 4.92961600000001,46.50408 4.933591999999976,46.512453 4.935599000000025,46.514229 4.947349000000031,46.513723 4.946786999999972,46.507113 4.953710999999998,46.504112 4.962766999999985,46.506749 4.97047299999997,46.51421 4.980216000000041,46.515203 5.00636899999995,46.509703 5.010593999999969,46.51107 5.01423299999999,46.50045 5.05475100000001,46.484281 5.07144900000003,46.485817 5.09522800000002,46.497508 5.112967000000026,46.493137 5.134029999999939,46.501447 5.136367000000064,46.507808 5.14104199999997,46.508585 5.164164000000028,46.504745 5.165839000000005,46.517675 5.177177000000029,46.511434 5.201221000000032,46.507821 5.203565000000026,46.504803 5.200342999999975,46.502568 5.2094809999999825,46.492105 5.206684999999993,46.486177 5.213031000000001,46.481541 5.215063999999984,46.468359 5.224697999999989,46.468352 5.236259000000018,46.457785 5.248004000000037,46.459374 5.25627099999997,46.451879 5.273677000000021,46.448588 5.310561000000007,46.446775 5.32172700000001,46.428955 5.309671999999978,46.423615 5.307822999999985,46.417157 5.312332999999967,46.416021 5.298806000000013,46.415528 5.299958999999944,46.412289 5.309146000000055,46.410257 5.334092000000055,46.399723 5.3481160000000045,46.399417 5.367105000000038,46.388692 5.377881000000002,46.382324 5.365074999999933,46.373077 5.363472000000002,46.37002 5.375389000000041,46.364844 5.375761000000011,46.358431 5.373462000000018,46.352236 5.383367000000021,46.344877 5.400995999999964,46.3393 5.401686000000041,46.332799 5.4040410000000065,46.315668 5.404053999999974,46.314767 5.410239999999931,46.309105 5.416931999999974,46.342873 5.423534000000018,46.347732 5.437145999999984,46.315127 5.454476,46.317998 5.465180000000032,46.323542 5.475304999999935,46.315385 5.466531000000032,46.293242 5.459000999999944,46.290531 5.457672000000002,46.276848 5.471308000000022,46.26721 5.475362000000018,46.265221 5.499594999999999,46.268205 5.502609000000007,46.270211 5.511369999999943,46.26436 5.51186400000006,46.257853 5.50287800000001,46.245411 5.494106999999985,46.242144 5.46908099999996,46.212365 5.464535999999953,46.210869 5.460665000000063,46.213097 5.454173999999966,46.216805 5.450403000000051,46.215184 5.451294999999959,46.208723 5.46410000000003,46.204347 5.466176000000019,46.191076 5.46054300000003,46.18609 5.454643000000033,46.181506 5.461671000000024,46.177417 5.446460000000002,46.152159 5.430090999999948,46.139357 5.43449899999996,46.125677 5.431788999999981,46.122699 5.421692000000007,46.1226 5.4127750000000106,46.124015 5.4093820000000505,46.118726 5.405267999999978,46.118273 5.39823899999999,46.098224 5.401965000000018,46.08837 5.399834999999939,46.085253 5.386187000000064,46.081649 5.383172000000059,46.075109 5.376326000000063,46.059 5.378545000000031,46.053161 5.374886999999944,46.048147 5.367076999999995,46.044365 5.352794000000017,46.04495 5.351631999999995,46.035335 5.339034999999967,46.039632 5.334828000000016,46.038052 5.324753999999984,46.04179 5.3118409999999585,46.025424 5.310352999999964,46.011554 5.305977999999982,46.001878 5.299062000000049,45.99691 5.29071399999998,45.993548 5.286965000000009,45.987002 5.275816999999961,45.998064 5.27370099999996,46.015052 5.25696199999993,46.021486 5.263284999999996,46.034044 5.261357999999973,46.03719 5.2586579999999685,46.043559 5.254462999999987,46.048534 5.2451469999999745,46.041863 5.2245040000000245,46.034586 5.210403000000042,46.035808 5.2019599999999855,46.050404 5.187967999999955,46.052846 5.176518999999985,46.064011 5.178200000000061,46.081266 5.1829139999999825,46.080995 5.1864799999999605,46.087331 5.194266999999968,46.09137 5.235487000000035,46.100474 5.239908000000014,46.112963 5.235547999999994,46.129318 5.238933999999972,46.135783 5.2344419999999445,46.145429 5.246138999999971,46.14909 5.248986999999943,46.154682 5.2586180000000695,46.156266 5.277324000000021,46.151893 5.29046500000004,46.154917 5.307536000000027,46.153346 5.312217000000032,46.16107 5.3077429999999595,46.166278 5.310639000000037,46.168562 5.304237000000057,46.172322 5.300876000000017,46.18093 5.294455999999968,46.193934']"]}, "execution_count": 9, "metadata": {}, "output_type": "execute_result"}], "source": ["list(geo.sort_values([\"department\", \"code_circonscription\"])[\"kml_shape\"])[:1]"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### G\u00e9olocation des bureaux de vote\n", "\n", "Ces donn\u00e9es sont importantes afin de pouvoir associer chaque bureau \u00e0 une circonscription. C'est la donn\u00e9e la plus compliqu\u00e9e \u00e0 obtenir car elle n\u00e9cessite de combiner plusieurs techniques et sources de donn\u00e9es pour obtenir une table propre. Le fichier final peut \u00eatre obtenu comme suit :"]}, {"cell_type": "code", "execution_count": 9, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:50:53.604602", "start_time": "2016-10-30T09:50:53.317563"}}, "outputs": [], "source": ["from actuariat_python.data import elections_vote_places_geo\n", "bureau_geo = elections_vote_places_geo()"]}, {"cell_type": "code", "execution_count": 10, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:50:53.656598", "start_time": "2016-10-30T09:50:53.607556"}}, "outputs": [{"data": {"text/html": ["
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
addresscitynplacezipfull_addresslatitudelongitudegeo_address
0cours verdunbourg1salle des f\u00eates1000cours verdun 01000 bourg46.2066055.228364Cours de Verdun, Le Peloux, Les Vennes, Bourg-...
1cours verdunbourg2salle des f\u00eates1000cours verdun 01000 bourg46.2066055.228364Cours de Verdun, Le Peloux, Les Vennes, Bourg-...
2rue antoine de saint exup\u00e9rybourg-en-bresse3groupe scolaire saint-exup\u00e9ry - salle de jeux,...1000rue antoine de saint exup\u00e9ry 01000 bourg-en-br...46.2100305.233330Rue Antoine de Saint-Exup\u00e9ry, Bourg-en-Bresse,...
311 avenue de l\u2019\u00e9galit\u00e9bourg-en-bresse4charles perrault - \u00e9cole primaire100011 avenue de l\u2019\u00e9galit\u00e9 01000 bourg-en-bresse46.2148485.23194111, Avenue de l'\u00c9galit\u00e9, Saint-Georges, La Gla...
411 avenue de l\u2019\u00e9galit\u00e9bourg-en-bresse5charles perrault - \u00e9cole primaire100011 avenue de l\u2019\u00e9galit\u00e9 01000 bourg-en-bresse46.2148485.23194111, Avenue de l'\u00c9galit\u00e9, Saint-Georges, La Gla...
\n", "
"], "text/plain": [" address city n \\\n", "0 cours verdun bourg 1 \n", "1 cours verdun bourg 2 \n", "2 rue antoine de saint exup\u00e9ry bourg-en-bresse 3 \n", "3 11 avenue de l\u2019\u00e9galit\u00e9 bourg-en-bresse 4 \n", "4 11 avenue de l\u2019\u00e9galit\u00e9 bourg-en-bresse 5 \n", "\n", " place zip \\\n", "0 salle des f\u00eates 1000 \n", "1 salle des f\u00eates 1000 \n", "2 groupe scolaire saint-exup\u00e9ry - salle de jeux,... 1000 \n", "3 charles perrault - \u00e9cole primaire 1000 \n", "4 charles perrault - \u00e9cole primaire 1000 \n", "\n", " full_address latitude longitude \\\n", "0 cours verdun 01000 bourg 46.206605 5.228364 \n", "1 cours verdun 01000 bourg 46.206605 5.228364 \n", "2 rue antoine de saint exup\u00e9ry 01000 bourg-en-br... 46.210030 5.233330 \n", "3 11 avenue de l\u2019\u00e9galit\u00e9 01000 bourg-en-bresse 46.214848 5.231941 \n", "4 11 avenue de l\u2019\u00e9galit\u00e9 01000 bourg-en-bresse 46.214848 5.231941 \n", "\n", " geo_address \n", "0 Cours de Verdun, Le Peloux, Les Vennes, Bourg-... \n", "1 Cours de Verdun, Le Peloux, Les Vennes, Bourg-... \n", "2 Rue Antoine de Saint-Exup\u00e9ry, Bourg-en-Bresse,... \n", "3 11, Avenue de l'\u00c9galit\u00e9, Saint-Georges, La Gla... \n", "4 11, Avenue de l'\u00c9galit\u00e9, Saint-Georges, La Gla... "]}, "execution_count": 11, "metadata": {}, "output_type": "execute_result"}], "source": ["bureau_geo.head()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["**Ce qui suit explique la fa\u00e7on dont j'ai constuit cette table.**\n", "\n", "Les bureaux sont assez stables d'une \u00e9lection \u00e0 l'autre et cela ne devrait pas trop poser de probl\u00e8mes si on m\u00e9lange les donn\u00e9es. En revanche, ces donn\u00e9es sont assez difficiles \u00e0 obtenir. [open.data.fr](https://www.data.gouv.fr/fr/datasets/?q=bureaux+de+vote&page=1) propose ces donn\u00e9es mais il faut r\u00e9cup\u00e9rer chaque ville ou chaque r\u00e9gion s\u00e9par\u00e9ment sans garantie de r\u00e9ussir \u00e0 couvrir tout le territoire. Le site [NosDonnes.fr](http://www.nosdonnees.fr/dataset/golocalisation-des-bureaux-de-votes) recense bien toutes ces informations mais il n'est pas possible - au moment o\u00f9 j'\u00e9cris ces lignes - de r\u00e9cup\u00e9rer ces donn\u00e9es sous la forme d'un fichier plat. De plus, certaines r\u00e9gions ne sont disponibles que sous forme de scan d'impressions papier. C'est en lisant l'article [Comment red\u00e9coupe-t-on la carte \u00e9lectorale?](http://www.slate.fr/story/3945/comment-redecouper-t-la-carte-electorale) que je suis tomb\u00e9 finalement sur la base constitu\u00e9e pour r\u00e9diger l'article [Etude sur le red\u00e9coupage \u00e9lectoral : \u00e9valuer le poids politique de la r\u00e9forme](https://www.regardscitoyens.org/etude-sur-le-redecoupage-electoral-poids-politique-reforme/). Les donn\u00e9es sont accessibles sur [RegardsCitoyens.fr](https://www.regardscitoyens.org/publication/#donnees) et en cherchant bien, on trouve le r\u00e9pertoire [red\u00e9coupage](https://www.regardscitoyens.org/telechargement/redecoupage/) et le fichier [2014041401_resultats.csv.zip](https://www.regardscitoyens.org/telechargement/redecoupage/2014041401_resultats.csv.zip). Cependant, la g\u00e9olocalisation des bureaux n'est pas souvent renseign\u00e9e. On peut se contenter des fichiers obtenus pour quelques zones seulement : [Paris](https://www.data.gouv.fr/fr/datasets/liste-des-bureaux-de-vote-prs/), [Gironde](https://www.data.gouv.fr/fr/datasets/geo-localisation-des-bureaux-de-vote-du-departement-de-la-gironde-rdl/), [Montpellier](https://www.data.gouv.fr/fr/datasets/bureaux-de-vote-mtn/), [Marseille](https://www.data.gouv.fr/fr/datasets/bureaux-de-vote-de-marseille-op/), [Saint-Malo](https://www.data.gouv.fr/fr/datasets/emplacement-des-bureaux-de-vote/), [Nogent-Sur-Marne](https://www.data.gouv.fr/fr/datasets/bureaux-de-vote-de-la-ville-de-nogent-sur-marne/), [Haut-de-Seine](https://www.data.gouv.fr/fr/datasets/bureaux-de-vote-7/), [Toulouse](https://www.data.gouv.fr/fr/datasets/bureaux-de-vote-2012/), [Grand-Poitiers](https://www.data.gouv.fr/fr/datasets/citoyennete-bureaux-de-vote-grand-poitiers-donnees-de-reference/), [Calvados](https://www.data.gouv.fr/fr/datasets/bureaux-centralisateurs-des-circonscriptions-cantonales-dans-le-calvados/). Cette approche risque d'\u00eatre fastidieuse dans la mesure o\u00f9 les formats pour chaque ville ont de grande chance d'\u00eatre diff\u00e9rent. \n", "\n", "La meilleure option est peut-\u00eatre de scrapper le site [bureaudevote.fr](http://bureaudevote.fr/bureaudevote00.htm) - qui fonctionne bien quand il n'est pas en maintenance - en esp\u00e9rant que les num\u00e9ros des bureaux de votes correspondent. Le site propose seulement les adresses. Il faudra utiliser une API de geocoding. Quelque soit la source, on supposera alors que tous les bureaux de vote associ\u00e9s au m\u00eame emplacement feront n\u00e9cessairement partie de la m\u00eame circonscription. Bref, **l'open data passe aussi par une certaine standardisation !**\n", "\n", "Certains d\u00e9partements ne sont pas renseign\u00e9s, la Dr\u00f4me par exemple. Il faut aller sur d'autres sites comme [linternaute.com](http://www.linternaute.com/ville/valence/ville-26362/bureaux-vote#ville-26362-1), acc\u00e9der \u00e0 la [carte](http://www.linternaute.com/ville/p-bureau-vote#trouver-bureau-vote), mais il faudra un peu plus de temps pour r\u00e9cup\u00e9rer toutes ces informations. Le code propos\u00e9 ci-dessus r\u00e9cup\u00e8re les coordonn\u00e9es des bureaux de vote. Cela prend plusieurs heures et il faut relancer le processus quand il s'arr\u00eate pour une erreur de r\u00e9seau. Il est conseill\u00e9 de t\u00e9l\u00e9charger le r\u00e9sultat. Le g\u00e9ocodeur d'[OpenStreetMap](http://openstreetmap.fr/) n'est pas de tr\u00e8s bonne qualit\u00e9 sur la France. Il ne retourne rien dans plus d'un tiers des cas. On peut compl\u00e9ter avec l'[API de Bing Maps](https://www.microsoft.com/maps/choose-your-bing-maps-API.aspx)."]}, {"cell_type": "code", "execution_count": 11, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:51:03.872343", "start_time": "2016-10-30T09:50:53.661561"}}, "outputs": [], "source": ["from actuariat_python.data import elections_vote_place_address\n", "bureau = elections_vote_place_address(hide_warning=True)"]}, {"cell_type": "code", "execution_count": 12, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:51:03.923346", "start_time": "2016-10-30T09:51:03.875344"}}, "outputs": [{"data": {"text/html": ["
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
addresscitynplacezip
0cours verdunbourg1salle des f\u00eates01000
1cours verdunbourg2salle des f\u00eates01000
2rue antoine de saint exup\u00e9rybourg-en-bresse3groupe scolaire saint-exup\u00e9ry - salle de jeux,...01000
311 avenue de l\u2019\u00e9galit\u00e9bourg-en-bresse4charles perrault - \u00e9cole primaire01000
411 avenue de l\u2019\u00e9galit\u00e9bourg-en-bresse5charles perrault - \u00e9cole primaire01000
\n", "
"], "text/plain": [" address city n \\\n", "0 cours verdun bourg 1 \n", "1 cours verdun bourg 2 \n", "2 rue antoine de saint exup\u00e9ry bourg-en-bresse 3 \n", "3 11 avenue de l\u2019\u00e9galit\u00e9 bourg-en-bresse 4 \n", "4 11 avenue de l\u2019\u00e9galit\u00e9 bourg-en-bresse 5 \n", "\n", " place zip \n", "0 salle des f\u00eates 01000 \n", "1 salle des f\u00eates 01000 \n", "2 groupe scolaire saint-exup\u00e9ry - salle de jeux,... 01000 \n", "3 charles perrault - \u00e9cole primaire 01000 \n", "4 charles perrault - \u00e9cole primaire 01000 "]}, "execution_count": 13, "metadata": {}, "output_type": "execute_result"}], "source": ["bureau.head()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On r\u00e9cup\u00e8re une cl\u00e9 pour utiliser l'[API de Bing Maps](https://www.microsoft.com/maps/choose-your-bing-maps-API.aspx) avec le module [keyring](http://pythonhosted.org/keyring/). Pour stocker son mot de passe sur la machine, il suffit d'\u00e9crire :\n", "\n", "```\n", "import keyring\n", "keyring.get_password(\"bing\", \"actuariat_python,key\")\n", "```"]}, {"cell_type": "code", "execution_count": 13, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:51:04.253339", "start_time": "2016-10-30T09:51:03.929345"}}, "outputs": [{"data": {"text/plain": ["1"]}, "execution_count": 14, "metadata": {}, "output_type": "execute_result"}], "source": ["import keyring, os\n", "bing_key = keyring.get_password(\"bing\", \"actuariat_python,key\")\n", "coders = [\"Nominatim\"]\n", "if bing_key:\n", " # si la cl\u00e9 a \u00e9t\u00e9 trouv\u00e9e\n", " coders.append((\"bing\", bing_key))\n", "len(coders)"]}, {"cell_type": "code", "execution_count": 14, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:51:04.328340", "start_time": "2016-10-30T09:51:04.256341"}}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["Les donn\u00e9es ont d\u00e9j\u00e0 \u00e9t\u00e9 geocod\u00e9es.\n"]}], "source": ["import os\n", "if not os.path.exists(\"bureauxvotegeo.zip\"):\n", " from actuariat_python.data import geocode\n", " from pyquickhelper.loghelper import fLOG\n", " fLOG(OutputPrint=True)\n", " bureau_geo = geocode(bureau, fLOG=fLOG, index=False, encoding=\"utf-8\",\n", " exc=False, save_every=\"bureau.dump.txt\", sep=\"\\t\", every=100,\n", " coders=coders)\n", "else:\n", " print(\"Les donn\u00e9es ont d\u00e9j\u00e0 \u00e9t\u00e9 geocod\u00e9es.\")"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On regarde les valeurs manquantes."]}, {"cell_type": "code", "execution_count": 15, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:51:17.653166", "start_time": "2016-10-30T09:51:04.333340"}}, "outputs": [{"data": {"image/png": "iVBORw0KGgoAAAANSUhEUgAAAvsAAAG6CAYAAACWbYkaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJzs3XmYHFXVx/HvyR6yAyHs+86LBEFAXxBkCcgSIyCyhE1BEAwEQUUBQQFlcYkRQVZZZEdAZHllMQFkE8QBBcKiBENCQiAJISHbzJz3j3M7U+nMTAjTNTXd8/s8Tz8zU9VdfbumuvvUrXPPNXdHRERERERqT5eiGyAiIiIiIvlQsC8iIiIiUqMU7IuIiIiI1CgF+yIiIiIiNUrBvoiIiIhIjVKwLyIiIiJSoxTsi4iIiIjUKAX7IiIiIiI1SsG+iIiIiEiNUrAvIiIiIrIMZmaZ37sV2ZbloWBfRERERKQVZmbu7un3vYBvm9nGBTfrY1GwLyIiIiLSikygfyRwHfAZYEChjfqYLLVdREREOplsb6WItM7MDgBuAH4A/MHdJxXcpI9Fwb6IiEgnVJaWsB7wgbvPKLhZIh1OytXvB9wGvO7uozLrvgasCMwGbnD3ecW0smVVM7hAREREKqMs0D+I6Km80cyuVsAvsiR3dzNbAKwEvGJmvYFNgTHAZkRavANDzOx8d28srrVLU86+iIhIJ5MJ9I8CrgHuB/5WHuhnq4+IdBZlVXf6pl+7AhOB3YGngVuAHunvjYHXgR07WqAP6tkXERHplMxsB+B84IfA5e4+Ny0fAtQDM1KPpvL6pdMou+r1JeBoM7vA3Z82sxOA04le/Inufknmca8DbmbdgfqO9J5RsC8iItI5bQ58ROQZz02pCb8AdiB6LP9oZmd2xJ5KkbyUXfX6OXAvsFpaN93MvuvuDaX7m9kgYG9gP+Akd1/U7o1eBgX7IiIiNa6F3vmeRDrvl1LawklEKcHrgO2BkcAfgWfas60iRTOzfYh8/B8B17r7zLS8S1mg/0VgW+DbwMXu/vsi2rssqsYjIiJSw8rSErYhqu68YWZrATcBmwDvAXXAce7+oZltBzwC7OXuTxTVdpEimNmVwBDgQHdfmJadRrxXpgJ3Av8kxroMBK5y9yvS/bp0tKth6tkXERGpUWWB/qHAeUQ1ka+5+yQz2x9YC1jg7i+l+/UmeivfAmYV1HSRQqSc+w2AGcBgM9sIuIAYhPsa8HVgLXc/ysy+Aqzm7hPSYztcoA8K9kVERGpWJtAfCVwFnAU87u7T0onAdGB66f6pt38fIrj5UekEQKQWNZfe5u6LzOwW4LfE+JV64D/Atu7+HzP7EXCsmQ1x92nAB5ltdbhAHxTsi4iI1DQz2wL4MVF1Z6y7L0irtjSzRcBUd59pZiOIvP31gHPd/efp8arGIzWn7KrXYKAvMB94192vMLP3gLWBSe7+h3S/XkTazvPA3Oz2OvJ7RMG+iIhIbRtE1Ah/xN0XpMBmLLAdEczcamYnEzn7LwC/cvc/QsdNSxBpq0ygfxhwCk2pOxNSmtud2funqjv7EQPXT3f3Oe3c5E9MA3RFRERqmJntAvyFqCzSGxgOdCfKCvYBLgYOdvfbzKx7qXSgAn2pdWZ2MFF96jfEie6awNFAf2AHd/9Put8I4IvACOJk+CdpeVVc9VLPvoiISA1oKfBw9/Fmdi7wXSKgeQz4ZpowaxAwiuj5J1sjXIG+1DIzW4UomTkGON/dZ6flI4j4uHvm7usC6wPfdffr0v2q5mRYwb6IiEiVK8s//jywFbAK8DoxadbZZnYNMMvdSwMKVyB6KrsAEwtpuEg7aeZkuDewEfCzTKB/L/G+2c/dX02zTP/d3ceY2c1pQG5VBfqgYF9ERKTqZQL9o4l8/NeJkpoGnGRm+7v7W6X7m9nmwE7Az4Afu/tT7d9qkfZRdjK8hrtPJnruBwClOvr3AVsSgf6LZrY+8D3geuCuTKDfYavutKRL0Q0QERGRtjOzLxB5+D8E9nX3wcDxwKeBs1P9cMzs08DvgdOAs9394rRcMYHUpEygfxzwbzPbDJgJPAd8w8zGA58i3jcvmFk3YjDu2sA7zW2rmqhnX0REpDbsREz6c4e7T0nLvk708l+aycd/kRiU+567PwTVl5Ygy9bS/7RaBpVWQlmP/obAkcD5wDvuPsvMriLq6c8Hjk49+oOBvYFzgTPc/emCml8xqsYjIiJSZcoDttQT+Segr7vvlJbdT6Ql7JOCmN2A7UuVRFrallQ/M+vm7vVm1oMYXDoYeLN0EtgZTu5K+yD9vhOwCVE28yiidn5DWncyMbP0ROBVolTt5sCvq63qTkt0yU5ERKTKZHorjzSzz6Wg5llgLTPb0MzuYcn840HAMGDd9PtS25LaYGZdU6Dfjyi5ej/wODDezH4LUWnJzKzIdubFzA7P7INuZjaQOBG+Aujv7hPdvaGU1ubuvyJOAu4mAv1HgW9kAv0u1f4eUbAvIiJShcxsL+B3wBdS4PY8MeBwPLA1sIu716Ve/y8BhwLj3H1mQU2WdpAC2d5EgL+AKLn6OeAOIj/9znS/qg5gm2NmexJ18+8oBfzuPgvYDXgFGGpmI1Ov/6L03sDd/+juZwF7uPuP3f1PaXs1cQVEwb6IiEgHV94La2YrAnsSufeXeLgb+CWwOpGXv6KZbUPUEv8N8Bt3v7l9Wy7tpewYOYQoLXkqcG/KO38TaCCuALX0uGr3DHABsAMp4Adw978DhwFvEwPT/zel5tRnB6aXB/a1EOiDgn0REZEOL02A1RXAzL4M3EsENC+7+weZHsofAz8A1iN6+B8Evgp8390vSI/Xd3+NMLON0gld6RgpBe5bpkV17r7QzA4FLgfOdPefmtkAMzug9LhiWl9Zqbd+FjFT9BXANsCtpePd3euIeSVWIU6KP18qo1ljJzxL0RteRESkgzKzs83sjxDpGWnxLCKY2x7YIK2rz+QgX0BUE9kl3b7s7mPT9moiLaGzszCAuIIz1sy2hSUC91lA33TfA4lSq2e4+4XppPFQYG8zG9L+ra+8Ui99+nMj4D2itOb+wPWZHv7ngX2BVYmrYrtU++Dbj0PBvrSbWj9zFhGppDTD7ZrATmb2u9Jydx8H7AFMBQ42sx3T8mwO8kR3f9bd/+nu/03bq7rJgKR5KW3rA+AI4DPAeWa2XeYu/wZWNrNbgJuB0939p2ndJkRKy4fAu+3Y7NxkB6wDTxBjFJ4FXgYOBm4rC/j3AdYHriTS3mqaSm9Ku0gDZUplrlYCZupLR0SkdWa2MnA6US3kYXcfmVm3E/BH4CXgO6V64J2hp1LAzHqkFJ39iOPgHuBid38irb+BCOrvA77m7tPNbAcihcWAHdMVoao9XrJXqixmhX6cmEH65+4+J1WeOouor/8IcHDm/p8BPuXuVxfT+vajSbUkd2WB/s+BlYBLzOzv1foBIyKSp5RnbO7+npldCvQBDjGzy939OAB3f9zMRhAlA39mZqe6+zP6XK19KT99oZn1JarM3A0MB9zMSAH/UenuBwKPpIvrXYj0ll1ToL/4+7mamNnW7v6PlG9fCviHEIOSH06Bfld3n2lmPybmGTgMuNbMjnb3Bnd/ljRYuZpPeD4OpfFIrtKbsBTo305MP/06MDVz2U3pPSIiGe7emEooHkEMONyN6I091syuydzvMaKs5kbAr0spPbWmpUHFnfH7I1NFph/wNJGK0giMI46FM81s+xTQHg4cS6Ty3AOcQ5RkXZROGKox0D8NeMDMDoclKubMAXoRHYqlEqSlQbvfJfL4vwI8WH7c1HKgD+rZl5xlLpddDGxLlAN7wd3nmVlPd18A9CSmqhYRkcTM9icCuTOBG4DJwE+A/VMQcwQs7uE/iAj2ViuqvXkpuzo8BFiRyElvSAFdpxp0nKrudAOuJ+roH+/ur6YB2gcRx4qZ2bnu/oS7/758G2mf1pcvrxLjgW8Ap6WrGDek5dOIlLYTzOx1d38l8xpXI04G7gfG13pwX049+5I7i9nrdgSucfenU6C/AXCVmT0I/MbMNi62lSIixSv1YKfA7VDgr8AV7v6gu79E9NLeRAzMvbz0OHd/FFjT3W8voNm5KQv0ryBOaF4C6oCLzWxAZyid2Iz+wObAo+7+alrW6O43EoN2hwGnmtn/NvfgauzRh3hfuPtzRGpSdyLgPwogDUS/HNgV+E6pJGlKddqSqFx0hrtfm5Z3mmNGwb5UXDOXW7sReXQrmtlnzewk4k23flq/NzGrX7fO9OYTEQEws5PN7DCIq6Hpc7AbkZozK1VdKeVpvwucC0wkUnpuLG3H3aek+9XMd3sm0P89EcD+liidOJ4Iau81s1613lPbzHdjFyJ1Z4XMssZUceZ24FGi4sxFaeBq1Uv7oNRT/wbwU2AN4ORMSs8lwHlEyvDdZnYbcAtx3Dzl7pNL26v1YyarZj4QpGNIvTCl1J0tANz9PeKD+UDgT8C3gAvc/X/dfRgwAdjIY1rrTvPmExExs3WA84keyv1hcVnFeUQJwe1Kn6VAQ/qMfQd4gEhl+bKZ7ZndZi2ktGSDWzPblbg6PAq40t3vBy4FBhDfH80+rlakNCVPHWKluRTeA/4F7Gdmm6Rlnk6O6ok6+/elTUxobrvVJr0+Tz35rxD59+8AWwA/tii7WZpY7kRijMKn0sNHu/uFUJvHyLIo2JeKKbvceglR1/YgAHcfDZxEXJY+zN3PtbAyka//hpl17YxvQhHpvNz9LWAvoB8xsPIrmdVPEldFTzCz9UrBnJn1JgYhXkdUVflzuzc8B2bWKxu4Zr4PNiR6sJ9MaaCbER1IdwInu/t8M9s9pXjUXIdRutrTkzj5+2b6/0MMOl1ATBq1WeYhmxHVZ05PnWqNtXK1x8x2Bi4DfgMcD3yaGLzeHfhBpof/Nnc/Ma0/wN0vT4/vUovHyLJogK5URKoOkK26M5S4xFZXuo+731X2sI2A7xBvxpOrNYdQROSTSCkX7u5/NbORRMWUk9Pn6W3u/nszG0p0lAw2s18RFUW+AHwRuNqbautX9SDVFIw+DKxgZl9z97pMUFYP9ADqzWw9Iuh9EDjG3T+ymCF2HyK1Y2L7t75d9CEmUfsJ8JGZXe/ub6a02F8BfzGzB4C5RM76POLKD1D9V3vSe8KB/yX2w03uPiUtf9zM9iVq7J+dHbTr7h+VbaOq98MnpWBfKqL0oWxmPySC90OB5z3Ke61ADCaa4+5z0v0uImbxGwoMc/fXimm5iEj7K+sgOQBYhbjavi1wlpk1uvsd7n6amc0CvkYEM/PSJs73mEkXqP5gLvU+X0BUmLnIzL7n7v9IqycSVz5+TNRKf5iYJOqjdHX4y8QVkJnt3/L24e4zzOxY4CLgEuIQusrd7zWzfwIXEDPpGjEm7vB0Fagq6+iXy5z4OTCQptx9S6+xzsxOIU58TknjOK5sYRudjoJ9qbTNgSfc/RmA1Ct1EbAWMN3MLkj5lj2IHqrd3f31wlorIlKATAfJYcDVRJByGRGs/Rj4Yeqtv83dzzOzO4G1iY6Tyd40S2pV9+iXpMHH95rZV4kBpueb2Tnu/jd3/4uZjQVOBl4AvpsC/Y2I2YV3J2rHf1DcK6icUoBeSr0p/X/d/V0z+x5xjFyS7nt9SgU7xGK22EZgdinH36u3vOZimV59gDeJ98BwM7vO3ReYWWldI3FlYy2aToqFmJ2v6DZIDUi5ld2Ax4APiQ+ibYg0nafS8uOAl9199/SYFbKX2EREOhMzWwP4PyIt5VR3n5uWfx64g+gQOcvd/9DC42sp0K9Pv28BHAycAfwBuNDdn0uB7DnEIN1HiO+b7sA6wH7uXtfctqtVuiJ+PXAV8GD2/2wx18AviQm0TgD+ULpqnrlP1R4bZcF9c+vvJeKLY4jSo3PSmIZRREfib919Rvu0tjqoZ18+kfJLg+mNucjMTiWqRGwLTALOdPdfpMcY8CUzG+jusxToi0gn14PohXzV3eemz8iu7v6Yxcy59xO10nu4+83lD67WYC4rBXalQP9mYnDpJKKW/gigf0rpqSPGMzwPbE1MkvQY8IC7/6eY1ldWWU/8EGJcxobAAjN7NPP/fhcYS5QivRjoZ2a/zfbiV+uxkQ30LWaD3o4Y3/dH4PF0Qnw8UU7zJuBWM3uRuOp1IvCdUqBfzSc8laaefVlutmTVnV2ANYHpwGtpwNDqxAyH89z93+l+KwPXEDPYHe0xc66ISKeVPisfJXqqR6eqMl2IvGSA54CNgSnAPu7+RjEtzZ+Z/QT4OjHL+tPEgNQ9iEmSniYqy/y9uBbmw8xWBAZlviv7E9VjfmdmmxLlM+cRg7QfzXz39iOuCq1EzBy7Sy3lpFuU0TyPOLGZSQw6/jHwO3d/y8x6ERkEuwCrErNLX+HuPy+mxR2bgn1ZLtkzZTO7hRgZPwhYSHwgfdPd7yl7zGZEOs++wM7u/kr7tlpEpHjNpSdYTIq1F3AQ8Ji7L0rLVwGuJWaMfdfdr2vn5rabVJXoYWAGcGB2H5nZCKIX9wHgJ+7+bDGtrLz0uvcngtgTiFKrbwGvA19M6SmbEld4PiJOCB9Oj/0cUXrzNODfKUe/1fSXapH+59cC57n7z8zsU0Rlv3rgCuBn7j4x3XdtIp2rIbNMPfplFOzLJ2JmlxIz334L+Acxi91Y4pLb1u7+Qrrfj9P9+gNfKS0XqVXNfdHUypewLL+ytIQViUGE5u4z07J+RO/+QOAHxMSD3YgKM2cRPbaTyrdVzcr2SRegJ1E3f7K7758ZoGpEff2biBlRxxMB74vFtLzyUiB7AbAzMJsIao/xzEyvKeC/lzgurgP+S+SrzyDGKzTWSoBrZqsCVwIvufvpFrP/PgP8nii5eTYxXuGy5q501cp7pNKUsy/LzczWJD6YLgYe8ZjkpBdxuflmIFtG8ymicsDvaiWvUqQlpZxbi1ku1yOCmGnu/m7BTZMClAW1BxCdI+sDPczsLOA+d3/HzA4mKvLcQAQ0s4jP0x+VAn2ojdKB5UFp+n2emT0JHGNmm7r7BIsJshYBc83sHSI/fwOg6ivumNmngdXd/V53fzF1ij1J9FDfkg30AdL++BwxYHkUcSX9BWBELQX6yTxiDoUnUprb/xHVmb5LjHHZncjZ72JmY939zeyDa+E9kgf17MsylQ/GNbPtiSD+c+7+dErTeQJ4iMjH/8jMTgbucvf/1kr5L5HWZHoj+wF3EcH+ykQpuDOIgYRTi2yjFMNiVs/fEqU1/wKMJHqqxwC/KR0XZvYtIqCFmC329rS8loI5AMzsGuAVd784/b0ecA9xgry7u/83LV+V2HfXA38qpTlVo3SlYhAxRuM2d/9pWj4COJK4urMd8FV3vzfzuC4pqO9GzE/Thej5bqzF71czG+zu0y3q5h9C7I8307oriYHbKwG7eWauCWmZevalVelDpjQgaH93v5OolPAhsEXqcSkF+qXZDHcgclDfAP5bax9EIs1Jgf4KxInwDOBMImXjs0Sv7Y/M7OdeViJPaluqKHI28EN3/7mZ/Q+R2vgWcRLYLVVSecvdL2nm8bUY6K9MTJJ1oZnNcffLiNSUHxEzxD6XUkUbiMo7nwVOq+ZAHxb3Os8wsyPc/Z9m1hvYyt3vtpj9dnPgfKLCzMHu/qf0uEYzG+Axj8BLpe2lY6Pmvl/dfXr6dV1isrlSylt/4mTweOBF1xw9H1uXohsgHVtmMO6twI1mtgkwn8grPI3I13+ImDF3TspJ/SaRo19zlRNEmpN67CCO/YXAce5+s7vfCvwtrZvqTTNIWzObkRqT8tHXJ04Af51yrx8n0hI+S9RQPwU4wszWaW4btRboA7j7e0RaxpXAb8zsW6lT6W7gq8Rg3eOJUoprAns0l59dbUrv+xTodyHy7+82s33dfYHHjMFnEmM4bjGzL1pYDXjIzEZmt1eLx0aZt4mTwqNTRsH+RIWmeaVAP+1HWQal8UizbMmqOzsQvS3nE3VuF5rZZ4kP5HrgJHe/LuUUHkMMLNvJ3f9VUPNFCmFmVwFbEoMq56Vc7JuA77v7helkeMVaCFzk4zGzjYmA5UUiF3kacKK7v29mexIDcrsSZQS/7zU2/0h5GmjZuvWIQclfJ75HLsmsW58o1bzQ3We1S2NzVn6VJn0+lGbE/aGnSnZmtjVRdnIPYnK1zYkOtE2q/erG8jKz+4EvELFGPXCxu/+k2FZVH6XxyGKlwWS2ZB39i4HexIfREynQ7+ruT5nZMCI94QIz+wUx2+M8ItBRoC81rYX0ioFEJ8o8MzuQCPR/kAL9LsBoYBMz+7rSeToHd38NFge2GwHXufv7afVs4K9EqcX/1FqgD5HeBmBmFwL3u/ujmXVvWtTX7wqMNbP57n5VWv1mLQ22TN+vjWbWA+jr7jPc/RYzm0+U3jzXzHD3e9z9HxYTVJ4I7Ai8AhyeBv/XXI5+c0pxiLvvbWaHEZko09z9wbS+5tLb8qRgXwBIuYPXm9k57v6SRf3fnkTPwqeI/PseRAqPpzfaE2b2RWIGyK2ItJ3/aBCi1DprqrrTE9gCmJKO+9uBqy3moPgKcDpRtQqix39H4DkF+p3SAJpmzC2lH2xPdJCc7O7zC2xbxWWq6ZQmDzsa2N/MDnf3p0v3SwH/pcA+wGVmtoK7j62xQL80wLYLkcb1mpl9193fSfn6sHTAPwEYlcY3vJ864jpFoA+Lx0CVAv4bs+sU6C8/pfEIsLgawNXEIKmD3f3VtHxFYhKL/Ync0qs9Jvoo5R7W5AHU2qVn6dxsyao7fyJSDa5297vMbF3gN8BuRFnafTInBKUBhzunEwXVg+5EUqB3D1Ft5VHiSujhROrOr4tsW6WkTqI1PFXSScu+6u63WtSTv5ZIRznc3Z8qe+x9wGbESdGGnuYhqHaZjoFewLZETv4w4BfE5FClSkwjiIC/ETjTM9V40np9XsgnpmBfFjOzo4n8wUXEBFgT0vIVgVuBbYgpu++sxcvN5Swqq2zm7n9XT4LAEqlufYBniSnaxxCB/fx0n62J8S2fA54namf3Ja6Kfd7dF+lksvotz2eCLVk68ffEldD5xEniJek+VR/MmdkuxJWsn7r7nSmA3x1Yy93fNbOtiEGpfYEj3P3J9LgNgZ8TJ8TPZdKcqlrm/96PKLn6IXElZxNi4PblwDnuPi3d/0vAOcCqwAGl/VPNsse1mQ0C+hDliOendMdlfhbWwnujaAr2BTPr6e4L0u/HEnnF9cSHzRtp+SBiQo+t0vo/1HrAb2Z3Ahu4+1ZFt0U6jnRV6wKivOwh7v5yWp4d67Iu0YM7ghiQ+RIxsVxDZ7oUX6vM7LvABCIH/WP9LzM9vEYEuz09qtLUTFqCNc0GuxfwHFEL/WAigC8FfEOBa4DBxCDUaUQKzw5E3fSamoDOYoK9B4ixb8e5+7/MbAPgIKIn/ypi8rRSD//BRGnWo6u9Q6As0D8Y+DZxojMfeBo43d1fWcYg7uw2vgo865qgc7kp2O/kygKU7xGzNg4D1iBm6Mum9JQC/s2JS5E31XLAb2bHEb0sh7n7XwpujnQgZvYIMMvdDyhb3movlXr0q1/6HHyV6KX9JvCX5Qj4lwrqq73XMl3l2snd/y/9vTmRlz6IGJx+QVqerfC2HtGrvSuRBvce0bn0QgEvIVcWk4I9R0ye9tPM8r7AycC5wC+JlJ53yh5bE58XZnYIcUXnGqJc91DihKY/UdDjhWW9NywmnBsLfNnd/9iuL6AGqD5pJ5cJ9G8GjgP+RdQ3voII+G+3qK1PyqE8gEhd+D61P8D7L6TZHItuiHQMFgYQPZbz0rLF74PUc9/HzA4ws1Wyjyutb+82S2Wlz8HtgY+I8Rm7Z4+BZTx2qd77Kg/0uxDlRA9MY1MAhhDVY54CfmJmB6XlnnL6cfc33X0YcQVgbyK9rRYDfSMC2kHESQ2l/eQxSP82YpLKU4DvZB7XJd2n6j8vzGwIUajgUuAUd7/c3b8JjCJe+11mts4yAv1RRLrkMQr0PxkF+52UZSaiMLPPEx+4PwDGuvt97n48MevjQGI2vw1g8RfdbsCu7j67/VteeaUvoMzfXdIHzevAr4FjUm+VdGKlLx+PWSyfB/Y2s7VSaka30n2I3sojibxboLoDunKlE5fOxsyON7PBEMEqsB8xgdolLEfAn91/aVxQ1UoB2glEELfAzP7H3ccRVdxOAe4nJof6anrvlDqXeqfHP+zuT7r7lKJeQyWV/W9LnxevEbPMj7KoULQgE/C/TpwY/QEYbWbHpOVVn9KV0RfYgEjlmpfSmvCYU+CXwGrAntkHtBDoH+/u17Rry2uIgv1OxMxWMLPjzKyPN5UBAyhNXf631DPZA8BjCvPfE6U3b7WY5h13n+XubxXxGvKQ6Y0938x2cvfGTHD2JDHA8nOw9ImB1K5m/tfZYO5Sokb6A6lXqpTGsSUxM2h34ipZ1SvfD5kv4U4T9KcOkV8Cd1oULMDdJxK55gv4mAF/WRBzOnBvKfCtRin14gV3/9DMLgL+bGb7u/s8d/8bkZN+H3CzmX0lPWYF4HIzO7PAplecxZgMz7xfeqXlXYjjYyDxedHDm8bIDSW+e68E/g84ysz619h7az4Ra5YyBBZlAv7fAe+Tvl9LylJ3xhBjHa5CPjEF+53LhcBlwCkWtYxLvQevEgNy9wbwmDirR1p3MXGpbUPgCjPrUe0fRKX2lz5w0t+HA8cCj5rZ7WZ2AoC7/5kol3dq+qKu+suqsmzpi7t0EniGmd0IXGlRbQRiNtQzicoSL5jZbWZ2D3FZvi+wX9kJdVUq2w/fN7NLzOx0M9u2lq5WfAxPElc61yTSDlaC5Qv4m+mtPBe4y93n5d/8ykuvJ9sD/QBxpeN0iwnlSAH/uUTAf6uZXUbkbn+VSP+pCRa59fUWefjXmtljxInhF9I+eogotfkp4GUzO83MzgZ+ByzymChqJjEPw4fV+N5qJS6YRwzG/YqZ7QaLA/6u6UrZLODfzWzvNCJH/1gF+m1X1V9Esty+B9xLXHb9TuYS8ixiANFIM/sCLA74uwKfBqYQgc2h7r6wGj+ISiwG1400s9XTB85A4oP4T0Sv7CHAKsD5ZvaSmZ0FvEb01B6StlHVJzvSutQhvgIJAAAgAElEQVRbWW9RLu8ZIl1jBaJ6yCNmdqi7LyQC+xHp57rEMfIH4DPeNNNlVV+Oz+yH54jPjX2BU4GnzOyETKdAzSodD0SwdimwHhHIfeyAv5W0hKqqr2+R4rifmQ3NvJ7rzGy/lL5zOPE+KQ/4zyYG5O4FrA1sm5bXhHRC3JsYp7AJ8AFxYviImX0tndD9CvgaMVvyD4FjiHlt9kzfxesQKT1V16FWdnyvZ2bbpFsfd58B/Ij4jPyRmZWKGgwkioGsTXSeZLfXnzgx+pZSdyrE3XXrBDegV/rZE/gj8B/iDdgnLd+VqH37ODHhCcQEJ5cTgfAKRb+GNr7+UuWpTYj66M8SlYdeA+qAwZn7rkhUHLol3a8x3a4s+nXo1m7HSy9gPPAIsFpadl86DhqIgWLZ+/cr+7tr0a+hja+/a+b3HwHjgE+lv7clrhA2AN9My6zoNue0H6zs7+7EQMr/EhNjrZRZty5RYnUCcZW0e/k2iEGJSx0/1XJLn423pe+PLYG7iXS2oZnP2J2AN4kTxAMzj+1NDN5dsejXUcH9kX2ffIUYo7B++nsL4Ib0//5G2eM2APpn9unviJ79TYt+TW3cH4cTmQKziPSc14nxfRDjOKalOOOldHzMJiYQa25b/dqr3Z3hVngDdGuHf/KSH0h7A2cQeXRTgbOAvmndMCLPeD7RMzElvWGHFv0aKrAPSl+8fYjepXeI0nmPAyu38rj1iSpFTxPVFHYp+rXoVvFjY2WgR+ZvS1/cDwD/k5bdQaSzfQm4M32BH5J9THO/V/MtvVfOIk74TypbtwrwWyJt49NFt7Ud9sWGpMCeGLvRUsC/Tgpw3gPWKdvGSWl/VWWgn15DFyLI/xcwIwVv22bXp5/ZgH//otud8z5ZAbiRqGA3tpnj5rr0efH1ZvbTXsQJ09vAVkW/ljbuhwOIlJ0fpdc1nEjVqgf2SPfZCjiN6HC8kCVPBrsU/Rpq+VZ4A3Rrx3929Mi8QVSYGZu+lD4iasmXAv5N05v0IqIG8AZFt7sCr3v79NoHpr8HpA/XRuDvwKppeTZg61K2ja2Jk6NTi349ulX02FiX6IU6iSUD/p1KX87AT1Lgsk36+0vp2FkAnFj0a6jQftiO6Ajokll2egpSFgBHpmU9yx7zPvDt9HdNnOQ0s2+2T//v0aReaVrv4V8fGFm2jX3SNqo20C97PQ+n1/MmsENmeReWDPhfJ/Kx9y26zTnui80z3yfXNrN+Q+Da9D4aVbZuG+BbwIZFv442vP7SJHEPEqVoB2TWjQMmkjpNso8p+1uBft7/p6IboFs7/aNj8Oks4lJa6cO4d/rQ/oDowetTdDtzeu3nAeel342ofnBC2idTiDzL1Vt4bPaqyANE7f0eebdZt3Y7NgYTJ4JziCs4vTLrehC9dn9P749SmkI/YsK5vxNXhqo6yE2v83ngx2XL1yY6BT4CHsos75l+Wgpyfl70a6jgvljqf0nTWIzZwIktBPyPZAP+zGNLn7WbArsX/foqtI96E6VlR9KUtvTZzPvDMr9/Ib1X1iu63XkdJ8QJzrbE1d93gZ2bCWY3IAo9LPV5QZWn/KXXMJDoDDsls+ze9N4opf/tTupw062A/1HRDdCtnf7R0VM/kabc/R7pZ0/ikuwsYtBQTQb86bWukPZDKQe7D3HpcamAn6iRvkn6vTQxytPArWR6N3Wr/lsK+K8het6OA3pn1m2UgrzvZZbtlYK7bJ5ytQf8patevYke2d7p79WIK4GNwHVlj9mGSIeriatdNJMjnAnWuxOpGvOaCfhPTYHOP2rxs4EWel1TkLtNNuDPrOtD05WwXnm3sR33Rdeyv0vHR7cU8L+c9sUOzQT1a2TuX9WfF5nXVPrcGEikdZ2e/r4vBfpbpb9XT8H/t2rltVfbrfAG6NZO/+i4JP8umQFANPXQHUb03r2XDWpq4QZ0y/x+XApabgPWSMv6AgemgP+vxCXZzYneqIfSfYy4IvIRVZ5XqdsSx0a2d24IMUiuFPBnU3oeIQZyH0bk8j9O9PSWAv2qvgRd9h65jsgr34emjoFswP8I8I0U4D5JXBHoVkS7K7wPbiQmPip9JmZP/FsK+FfKLP8h8LWiX0cO+yV7ZfMzROfIDiw5fmFbIuB/mejVXoeoG/8mNdSTWzrOiU6jk4jqOr9gyTEL2xAVdZoN+LPHU7XfiE6Pp4Ht0983EoNz/wa8BWyZOUa+CfyTNFhXtwL+X0U3QLcK/0NbyDsnZqhrJAbP9C97zCii/OTtwMZFv4YK7ovSh3NPmnqZziB6HP5AU8Dfhwj4/0sE9P9NQUz3zLYGAkOKfk26VezYWOrSOZGeUwp2j6OpUtWG6QuskaiY8QTNVFqpxlvmPdI7vQfWI8qNvkmU2SwP+D8CFqVA53SargBUbSpC+kx4nzT4Pu2Hf5IZWEpTwF+qZjYrHSOrlB8H1X5MZF5HNtC/ljjh/SgFsg+QBiCnYO4zRAdJYwp23ydK0Bb+Oiq0L0r//37ElfAJxJXyqcQA1LNJFd2Ik59/ESdAny+67RXcB9ljvD8xB880ogNgHaJM9ztEh8kp6X5rAV8n0iRHF/0aOvOt8AboVsF/5tKXGMvLAV6Qvqi/C6ydlq0OXE/0TNXEl1R2X6QP53FEb+xBadlPicoq2YC/F/A/RH7/GZkgqHt7t70d9s0+RA/d9kW3paDXn+2hOxH4PtFb3Q8YRFTVWAgcT1O6mxEnzJ/LHFtV3aOd2Q+lMQgfEJVW1iTqXpcH/KsTA/AmA1dkttO7vdtewX3Qj0gvuD79vR+Rqrco7YP9Mvct/d93JsoHvk9c4ajF1J1soH8dUWpzv/Q+uIem4galMpNdiapWFxAD2mup06h0Ba8HMQj1UaIGfA9iLMaYtD/OyuyLbYgr5TcX3f4c9sdR6Tv1WaLgR2PaJ6sDOxJXeN4jrvzVEb383y/fn7q18/+t6AboVqF/5JIfzmcROXOvEWff66blvYkeucb05f4g0WM5g7LR8rVwI3rsXyIG1e5M5uQnfSEtEfC3tk9r5QbcTPRGNRKDKy8ruk0F7Yd+6Uvp7RTkzk3vl72JCj2lgP84mpljotqPDZoC/f4pkHuVGJuwT1q+VvqMKA/41yAmjpoFXF7066jQvrgrvSfOTu+LPYirOe8SvdT7sWSv5ufSZ8pDlFVXqeYbkdI4vGzZkUT5zJ3T36cQPdlXESd9z5I6jjKPqer3RnoNnyHNN5NZtlH6zjgms8yIsQu/Ik4QP51Zvmkt7IuyfbA3qeeeKKPZnZgheRpNAf/axAnBtUT6zq6Zx9dEClM13gpvgG4V+Ccu+UV0O1Hu7NdE6czGFOBtk7nPYcRkH+OJXv3Ni34NOe2Xi1LAslFmWTYX+6dEys5twFpFt7cd9sf307HxZaKc4LXEZddbi25bO73+bG76DUTv1DbEYOzd0pfVdCIXdWDaPx8B36aGrvCwZI/+m8Rl+O2IFKWDM/dbM71//sOSOfyr0tSb+auiX08b9kO2utJk4uTulzSlJm1ABPwvAweUHkNcDbqeKr+y08z+uDj9T4/MvNbjgJ+mv48lTopL+6J0DDxJFZeObGY/dCPyzxfvi7R857TsK+nv7FW/zdOxcgE1WG0nvY7SSc1zxFWcbNzx7fT+ebSleAIF+sX+/4pugG4V/GfGJBWvkuoeE2ffjcQkWY+QyaEkLkEaNVxGkrhycUczy7O5+GekfXR+0e3NeV98msidPJGm/NMViROed4Hbim5jO+2HvkRP7UVkJsVK61ZJX1avpvv1I3p9x5d/gVf7Lb226ek9UqpO9W9SZR2aUlbWJNI1FhA92qUAefW0Dzcp+rVUYF/sS/TKTiWu7mxP05iMDYje3LeIyY9+Q5wAjso8viaODWJcxi3p8/BraVk3oqd2IDGO4Yc0nQytTVwZm5XeN91qdF8cnZYNIk4Kb83crxTwr5COkwuLbnvO++Vm4NXy159+v4amQfyfKrqtui1564LUBDNbh7j0/DN3f9rMTiWC/wOICiL/C5xhZtsDuPtCDwsLa3SOzKwHEbx1ySwzAHdfZGaDzOwQdz+f6LH6YTEtzZ+ZnUj0xvwKmOXujWbWzd1nED1RVwO7mNlNRbYzb+n/fzYxwPIUoqoKZtYVwN3fBc4nUlgOdPcPiROkXd3dS8dPjdiXSOE7yt3fScsaiBNA3L0hLZtGfIZcCzxT2g/uPoXIw321fZudi1eArxKTpS0grvpsa2bd3f3fxGfnY8RkWZ8GTnP3X0McU54inWqXjoOTidTGq8zsGHevd/f/Eq99PaDO3eel98J2RIB7BhEQ19fovrg67YuZxGzSXzGzn6T7lb4/NyU61d4sor3t6HlgFTPbG+L1m1n3tO414oR5HeAkM+tXUBulOUWfbehWmRvRUz+CuLy2G9Fr9zVisFAfogevkfjSqvnykel130ikqezczPovkAZaZR9TdLtz2herE4PsFpDpeaIpnWMAMTC5Afhd0e3NeV+sQfRALSIzGRRNVzvWJCpHnFr2uJq6BE30wi5RSYeoMvTLzH3WIQarHpRZVpPvkczrK1VSeY0onVjq4e9FjHlauVaPiczrGkKkg2Z7tVcnxrZcljk2fkukM9Xy1eHsvvhqet/cQFMJ568SqU7PEB0qtf7+2IAYfPswsF1meXeio+Rk4mrxbGDNoturW9OtG1ITPM6w73X3ejMbRqQi/MGjh26umU0G/kz0QMwqsq3twd0bzOxCIj/9TDPD3R8FMLPNieD2A+KLffFjCmlsztx9ipl9jygb+B0ze93dr0rHSjd3/8DMfk7kXN5SbGvz5e6TzewHxGX3U8zsDXe/zN0b013WBD4kvqwW99xm1tcEd68nBloClHpj3yFOhjCzdYljYRAxxqf0uJp8j2T8HTiamHPheuBwM3vO3ecDmFnpp9XaMVHi7tPM7Fvpz6vNrIu7X21mFwDnmdmBxPtjEFGutCavDsMS+8KIFJYDieNjAlGtq1Sy+UViLEODmXWt1feJu//bzL5CVLC6NF0N/hsxEd9oIovgL8D3gI2JNC/pAEr5l1JDzOwKYjDRzu4+1czWIKqLXEJMFFXf6gZqiJl9kbgU+yFROaIB2ITIu93eI6WnS61+cWeZ2RDiGDgA+Ia7X5WWd0/7oWZSEpalbF+MJQYZ9iKqR/QkxrfU5Bd2S8zsauK9cRhwE3HFZ+t0bNRsAFMupahsS0wMNRAY6e5/LbZV7a/sPXKou99iZvsA+xMnhte7+2tFtrG9pH1xKdF5VNoX/YEtiH3xlrt76jyp+e9XM9uauEK6AZE5MAO4yN0vNrPjidSuPd395QKbKRkK9muQmQ0lZra7nRhU9SlgF2And6/1nMKlmNmWRLWA/yFykF8Efpjp2a75D+eSsi/wY9z9moKbVJi0L35F9M4ZMcZlFeBEd1/QWQLc0kleuvpzJJHu1YtIcVvU2d4jsDjg/wzRUXCGu19fcJMKkd4jvyEC/CPc/fdpeafoIMkq2xfHuvvVZes71T4xsxWJz8vVgTfc/b9m9hngTqJT8WuFNlCWoGC/RpnZzsRlxx5EBYEj3P2FYltVHDPrQuTY1meWdYpgrlz60hpD5Jse6e43FNykwpjZqsQg5SOIwarXp+U9ajk9oTnp8vytRAfBtp010C9JAf9gj4HbnVbmpPggMgF/Z5T2xVgiXWVfd7+/4CZ1CGY2mEjdGQ78y933T8s7zdXijk45+zXK3R9NPdr9gQ/d/b2i21Sk1OPSWLas0wX6sDgP9dtED+7fi25PkVKa2+lEqc1rU0rT1Z0t0E/+j8hDvqYzXvUql4KUd6FzBy3p8+IUotrM80W3p0hpX4wm5it5sOj2dBTuPt3M5hDjBL8Pne9KR0ennn2RTqqzXtlojq52LKmzB/qyNH1eLE3vk+Yp0O941LMv0knpi7uJrnYsSQGMlNPnxdL0PllaLVeqqmbq2RcRSdR7KSIitaZTzqBrZgea2a/N7HEzm21mbmaddtCRiAQF+iIiUms6axrPmcBWxEyZbxMTTYmIiIiI1JRO2bMPnELM7tafmERHRERERKTmdMqefXcfV/o9SimLiIiIiNSeztqzLyIiIiJS8xTsi4iIiIjUqE6ZxlMJu+yyi2qWAmPGjAFg9OjRBbekeNoXTbQvmmhfNNG+aKJ9sSTtjybaF0saP358e+RbLzOme/nllznxxBMr/sTDhw/nlFNO+Th3/cT7QcG+iORi6NChjB8/vuhmdAh1dXVFN0FERNpg0KBBuWx39uzZuWw3S8G+iOSirq5OPVM09dKJiEj1Wm211Rg3btwSy+bNm8fw4cOpr//kkyk/+eSTbW3aMilnX0RERERkOTU0NLQp0AfYeOONK9SalqlnX0RERERkOfXt23ep3v7m1NfXM2rUKCZMmLDUuh133DGPpi1Bwb6IiIiISE66devGZZddtsSyyZMnM3LkyNzGAizx/Lk/QwdkZiOAEenPVdPPz5rZten399z9tHZvmIiIiIhIBXXKYB8YChxZtmz9dAN4C1CwLyIiIiJVrVMO0HX3c9zdWrmtW3QbRURERETaqlMG+yIiIiIinYGCfRERERGRGqVgX0RERESkRinYFxERERGpUZ21Go+I5Gzo0KGMHz++6GZ0CHV1dUU3QURECnTllVdy0003YWaYGY2NjQCLf+ZJwb6I5KKuro7Ro0cX3YzCjRkzpugmiIhIgSZNmsRNN90EgLvj7ovXXXjhhey11165Pr+CfRERERGRVixatIiLLrqIJ554YvGyBQsWtLln/rOf/Wxbm7ZMCvZFRERERFoxa9YsHn744Ypvd968eRXfZjkF+yIiIiIirRg8eDB//vOfqa+vX2J5KS3H3ZfIw88unzlzJt/4xjea3W63bvmH4gr2RURERESWoUePHvTo0WO5H7fiiiu2uG6HHXZoS5M+FgX7IpILVeNpomo8IiKd1/Tp01tcd/PNN3PAAQfk+vwK9kUkF6rGE1SNR0Sk+i1YsIDvfOc7/POf/6zodmfOnFnR7TVHk2qJiIiIiLRi5syZFQ/0oX3q7CvYFxERERFpxbRp03LZ7rrrrpvLdrOUxiMiIiIi0oqtttqKs846i1deeWXxsvJKPM39LP3+0EMPNbvd/fffP/e2K9gXEREREVmGXXfdlV133XW5H/fRRx+1GOz/5z//aWuzlklpPCIiIiIiOenatWuL6wYOHJj78yvYFxERERHJyfz581tcN2nSpNyfX2k8IiIiIiI5GTBgAOPGjaOxsZH6+nrq6+uZNGkSxx9/PNttt13uz69gX0REREQkJ/X19Zx66qm8+OKLS62bNWtW7s+vNB4RERERkZzU19c3G+hD+wT76tkXEREREclJr169GDdu3BLLJk+ezMiRI9ulzr569kVEREREapR69kVEREREPoHHHnuMl156CYhJtrI/s8rXzZgxA4DGxsbc26hgX0RERERkOU2fPp2zzz67Tdu48sor2WuvvSrUouYp2BcRERERacX06dM56KCDKr7dUg9/npSzLyIiIiLSinnz5uWy3UMPPTSX7WapZ19EREREpBVrr732UhV1WuLuNDY2Lv6Z/d3daWhoYMqUKZxwwgmss846Obdcwb6IiIiISMWYGV27dm31PnPmzGmn1iiNR0RERESkZqlnX0RERESkDdx98e3j/D1//vx2a5uCfRHJxdChQxk/fnzRzegQ6urqim6CiIhU2KxZs/jyl7/cpm289tprDBs2rEItap6CfRHJRV1dHaNHjy66GYUbM2ZM0U0QEZEc9OnTh5133plHH330E29jww03rGCLmqdgX0RERERkOXXv3p1zzjlnmfdraGjgyiuvZMaMGdTX11NfX8+cOXP4xz/+QZcu+Q+fVbAvIiIiIpKTrl27cvzxxy+xbPLkyYwcObJdnl/BvoiISAE0rmVp2h9NtC86voaGBm6//XZef/31xcvMDGDxQFyARYsW8fjjjze7jSlTpuTbSBTsi4iIFELjWpqUxrZof2hflOvIJz2PP/44l19+eZu2ceONN3LUUUdVpkEtUJ19EREREZHlVInBtdtss00FWtI69eyLiIiIiCynNddckwceeIAFCxYALFFTP/szq7TsnXfeYdSoUey66665t1PBvoiIiIjIJ9CrVy969eq13I9rz0m1lMYjIiIiIlKjFOyLiIiIiNQoBfsiIiIiIu2koaGBhQsXttvzKWdfRERERKQVc+bMYfjw4c0Oum2LN954g2HDhlV0m+XUsy8iIiIi0oqGhoaKB/oAffr0qfg2y6lnX0RERESkFQMGDGDcuHFLLW9oaFh8ItDY2Pixf06dOpVTTjmF1VZbLfe2K9gXEREREfkEunbtSteuXZf7cQ0NDTm0pnlK4xERERERqVEK9kVEREREapSCfRERERGRGqWcfRERERGRnCxcuJA999yz2XWTJ0/O/fkV7IuIiIiIfAKlSjxmBrC4PGf256JFi+jTpw9z585d6vE9evTIvY0K9kVEREREltOkSZM44ogj2rSNv/3tbxx22GEValHzlLMvIiIiIrKcBg0a1OZtrLLKKhVoSevUsy8iIiIispz69u3b7ERb5ebNm8fee+/d4jbypp59EREREZGc9OzZk0MPPZQhQ4aw2mqrsfrqqy8O8tdff/3cn189+yIiIiIiOenSpQvHHnssxx577OJlkydPZuTIkfTs2TP/58/9GUREREREpBAK9kVEREREapSCfRERERGRGqWcfRERERGRHDU0NLBo0SLq6+upr69n5syZ7fbcCvZFREQKMHToUMaPH190MzoU7Y8m2hcd34IFCxg+fDgLFy78xNt4/fXXGTZsWAVbtTQF+yIiIgWoq6tj9OjRRTejQxgzZgyA9gfaF+U68knPn//85zYF+gB33HEHJ554YoVa1DwF+yKSC/VaNqmrqyu6CSIi0gYTJ07k6KOPrvh2N99884pvs5wG6IqIiIiItKJr1665bLehoSGX7WapZ19EcqEUhVC6JC8iItVrrbXWYty4cZ/osVOnTuWQQw5pdt2sWbPa0qyPRcG+iIiIiEgr5s+fz+jRo3n11Vcrut2BAwdWdHvNUbAvIiJSAI1rWZr2RxPti47lo48+qnigD3DAAQdUfJvlFOyLiIiIiLRixRVXXCqN55lnnuH0009v03Z79OjRpsd/HBqgKyIiIiKynN566602b2Py5MkVaEnr1LMvIiJSAA1ib6La8k20L5bUkdOZNtpoozZvY7PNNqtAS1qnnn0RERERkeW06aabtnkbkyZNqkBLWqdgX0RERERkOc2fP7/N23j++ecr0JLWKY1HRERERGQ5DRo0iAcffJD6+vollrv7EreFCxdy4IEHNruNDTbYIPd2KtgXEREREfkEunfvTvfu3Zd5v/JKPpMnT2bkyJEMGTIkr6YtpjQeEREREZEapWBfRERERKRGKdgXEREREalRCvZFRERERGqUBuiKiIiIiCynBQsWsNdee7VpGxMmTGDYsGEValHz1LMvIiIiIrIMM2fOZOLEiYtvN9xwQ5u3edddd1WgZa1Tz76IiIiISCumTZvGwQcfXPHtbrvtthXfZjn17IuIiIiItGLQoEG5bHezzTbLZbtZCvZFRERERFoxadKkXLZ733335bLdLAX7IiIiIiKtWHnllXPZrrvnst0s5eyLiIiIiLRiwIABjBs37hM9tr6+nj322KPZdUcddVQbWvXxKNgXEREREVlO06dP56CDDmrTNj744IMKtaZlCvZFJBdDhw5l/PjxRTejQ6irqyu6CSIiUmFvvPFGm7fx0ksvVaAlrVOwLyK5qKurY/To0UU3o3BjxowpugkiIpKDHXbYgTPPPJOJEyc2u97dcXfefPNNnnrqqWbvU4kThmVRsC8iIiIispzMjN12222Z92toaGD33Xdvdt2hhx5a6WYtRcG+iIiIiMgyTJ8+nZkzZwJNVXQaGxsX9+CXfm/u5/nnn0+/fv1YtGgR9fX1TJs2jV/84hf07ds393Yr2BcRERERacWjjz7KOeecU/Htzp8/v+LbLKc6+yIiIiIirdh8881z2e60adNy2W6WevZFRERERFoxePDgNtXZHzVqFBMmTFhqXf/+/dvatGVSz76IiIiISE7MjClTpjS7rkePHrk/v4J9EREREZGczJo1i9mzZze77pFHHsn9+ZXGIyIiIiKSk5VWWonf/va3vPrqq4sr9EybNo1bb72V4cOH5/78CvZFRERERHK0ySabsMkmmyz+e/Lkydx6663t8txK4xERERERqVHq2RcRERERacXChQvZc889K77dt956q+LbLKdgX0RyMXToUMaPH190MzqEurq6opsgIiJt8Nhjj+Wy3Ztuuoljjz02l22XKNgXEREpgE6Il6b90UT7omOZOnVqLtvt2bNnLtvNUrAvIiJSgLq6OkaPHl10MzqEMWPGAGh/oH1RrqOc9AwZMiSX7a600kq5bDdLwb6IiIiISCv22GMP5s6dy7PPPou7L17e0u9Zb7/9NpMnT2523W677VbZhjZDwb6I5EK9lqHUSyciItVtxIgRjBgxYrkfN2PGDA444IBm173wwgttbdYyqfSmiIiIiEhOunRpOdzu0aNH/s+f+zOIiIiIiHRS3bt3b3HdyiuvnPvzK9gXEREREclJaxV3Ntxww9yfX8G+iIiIiEhOpkyZ0uK6P/3pT7k/v4J9EREREZGctJaXP3v27NyfX8G+iIiIiEhOBg8e3OK6gw8+OPfnV7AvIiIiIpKTmTNntrju4Ycfzv35VWdfRHIxdOjQDjPzYdHq6uqKboJ0QHqPLE37o4n2RcdSX1/Pr3/9a5555pnFy8ys2Z9ZZsb8+fNb3O4WW2xR4ZYuTcG+iORCk2oFTaolLdF7pEnpfaL9oX1RrqOc9Lz//vvcc889Fd/u3Xffzcknn1zx7WYp2BcRERERaaMfTaUAABuPSURBVMWQIUO45557mDt3LgDuzttvv813v/vdNm13p512qkTzWqVgX0RERERkGfr160e/fv0W/73aaqtx5ZVX8vbbby+VwrOsFJ/p06czduxYdtxxx5xbrWBfRHKifOQmytkXEalNG2644TInxpo3bx577713s+teeuklhg0blkfTFlOwLyK5UD5yUM6+iEjn1tDQ0OK6efPm5f78CvZFRERERHLSt29f7r//fubOnYu74+688847jB49mm233Tb351ewLyIiIiKSk4ULF7aYxvP222/n/vyaVEtEREREJCfN1d8v6dWrV+7Pr559EcmFBug20QBdEZHOa8GCBS2umz59eu7Pr2BfRHKhAbpBA3RFRDq31lJ1nn76aU2qJSIiUot09Wtp2h9NtC86voaGBs4991weffTRT7yNo446qnINaoGCfRHJhQKZJkrjkebo6leT0hUw7Q/ti3Id+XvkhRdeaFOgD/DQQw+x5557VqhFzVOwLyK5UCATlMYjIlKbtt56a/bZZx/GjRvX4n3cvdVa+iuvvHIeTVuCgn0REZEC6OrX0rQ/mmhfdHwNDQ00NjZiZrg7wFI/ISruzJ8/v9ltbLHFFrm3U8G+iIhIAXT1q4lSV5poXyypI5/0zJ49mwceeKBN27j66qvZb7/9KtSi5qnOvoiIiIjIcurZs2ebt/HBBx9UoCWtU7AvIiIiIlKA7bffPvfnUBqPiIiIiMhy6tOnT6uDc1szefJkRo4cya677lrhVi1NPfsiIiIiIjVKwb6IiIiISI1SsC8iIiIiUqOUsy8iIiIispw+/PBDhg8f3qZtvPvuuxVqTcvUsy8iIiIispzee++9Nm/jtddeq0BLWqeefRERERGR5bTeeutxxx13MHPmTMwMYKmfJeXLp02bxve+9z123HHH3NupYF9ERERE5BNYaaWVWGmllZb7cd26tV8IrjQeEREREZEapWBfRERERKRGKdgXEREREalRCvZFRERERGqUgn0RERERkRqlajwiIiIiIjmaM2cOc+bMwczo0qULM2bMaLfnVrAvIiIiIpKTjz76iP3226/ZdRMmTGDYsGG5Pr/SeEREREREctKrVy8OO+wwhgwZwuDBg1l55ZXp3r07AOuuu27uz6+efRERERGRZfjHP/7BxIkTF/9tZotv5ctKv5d+rrHGGhx55JGLl82cOZMrrriCXr165d5uBfsiIiIiIq2YMGEC3/72tyu+3b/+9a9K4xERERERKdKaa66Zy3bffPPNXLabpZ59EREREZFW9O3bl3Hjxi2xbOHChZx55pk8++yzn3i7I0aMaGvTlknBvoiIiIjIcurRowcXXXTRMu83d+5c9t1332bXTZkypdLNWorSeEREREREcrJo0aIW1ynYFxERERGpYiussEKL67bYYovcn1/BvoiIiIhIThYuXNjiugULFuT+/Ar2RURERERy4u4trlMaj4iIiIhIFevTpw8bb7xxs+u23HLL3J9fwb6IiIiISE4WLFjAa6+91uy6t99+O/fnV+lNEREREZGc9O7dm4ceeoiGhgYg0nqmTJnC17/+9RZ7/CtJwb6IiIiISI7MDHdffGtsbGy351awLyIiIiKSk3nz5rH33ns3u27ChAkMGzYs1+dXzr6IiIiISE569OjBl770JXr27EmvXr3o3bv34nXrrLNO7s+vnn0RERERkZx07dqV3XffndVWW42Ghgbq6+t59913ue++++jVq1fuz69gX0REREQkJ1OnTmXUqFHNrrv00kvZc889c31+pfGIiIiIiORk4MCBLa7ba6+9cn9+9eyLiIiIiOSkV69ejB07lpdeemlxNZ733nuPu+66i/XXXz/351ewLyIiIiKSkxkzZnDSSSc1u+7uu+9WGo+IiIiISLXq379/i+t23XXX3J9fwb6IiIiISE7mzp3b4rr3338/9+dXGo+IiIiISE769+/PGWecwVNPPUV9fT319fXMmDGDCRMmsN566+X+/Ar2RSQXQ4cOZfz48UU3o0Ooq6srugkiIlKQ2bNnM3bsWD788MOl1nXv3j3351ewLyK5qKurY/To0UU3o3BjxowpugkiIlKg9957r9lAH2DAgAG5P79y9kVEREREctKvX78W11133XW5P7969kVEREREcrLKKqtw8803M3XqVMyMLl268O6773Leeeex77775v78CvZFRERERHK06qqrsuqqqy7+e/Lkye323ErjERERERGpUQr2RURERERqlIJ9ERGR/2/v/mOjvu87jr8+Bp8pNqbYQIGQUEYokB/gpGm1rAuElBAFlvIrhLaxNNKsEwlrSqY1QlEjkjWTBps6oq1jqdKONGqirCNatEmkIcGe0oZiusQEAiZATH6cMZhgY8A25s6f/fE9c+fz3dc+3/fjs6/Ph4TO9/18v+/P21/J4n2f+3w+XwDIUxT7AAAAQJ6i2AcAAADyFMU+AAAAkKfYehMAAABwpLW1VcuWLUvZduLECef9M7IPAAAAONLe3p62bd++fc77p9gHAAAAHJkwYULatuXLlzvvn2IfAAAAcKSuri5t28svv+y8f4p9AAAAwJHZs2dr9uzZKdtWr17tvH8W6AIAAACOFBQUaNu2bT2OhcNhVVZWqqioyH3/znsAAAAAkBOM7ANwoqKiQtXV1blOY0iora3NdQoAgBzp7OzUXXfdlbKttbXVef+M7AMAAAADZK1VV1eXotGootGoIpGILl++rM7OTnV2duq1115Le+1PfvIT5/kxsg/AidraWm3YsCHXaeTc1q1bc50CACBLZ86cGZTFtC4wsg8AAAD4KC0t1Ve+8pXA437jG98IPGYyRvYBAAAAH6FQSFu2bOl1PBwOq7GxMeN4TU1N2rx5s66//vog0vNFsQ8AAAAMwFVXXaWrrroq4+vC4bCDbFJjGg8AAACQpxjZBwAAAAbg0KFDOn78uKy1V3blSXxNdayrq0tnzpwZtBwp9gEAAIAMHTt2TOvXr88qxu7du7V48eKAMkqNaTwAAABAhsrKyrKOMXny5AAy8UexDwAAAGSopKREc+fOzSpGV1dXQNmkxzQeAAAAIEOhUEjPPPNMn+dFIhE99NBDOnbsWK+2gezkkylG9gEAAABHCgoKNG/e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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["import missingno\n", "missingno.matrix(bureau_geo, figsize=(12, 6));"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On pourra finalement r\u00e9cup\u00e9rer la base des g\u00e9ocodes comme ceci :"]}, {"cell_type": "code", "execution_count": 16, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:51:17.832166", "start_time": "2016-10-30T09:51:17.657246"}}, "outputs": [{"data": {"text/html": ["
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
addresscitynplacezipfull_addresslatitudelongitudegeo_address
0cours verdunbourg1salle des f\u00eates1000cours verdun 01000 bourg46.2066055.228364Cours de Verdun, Le Peloux, Les Vennes, Bourg-...
1cours verdunbourg2salle des f\u00eates1000cours verdun 01000 bourg46.2066055.228364Cours de Verdun, Le Peloux, Les Vennes, Bourg-...
2rue antoine de saint exup\u00e9rybourg-en-bresse3groupe scolaire saint-exup\u00e9ry - salle de jeux,...1000rue antoine de saint exup\u00e9ry 01000 bourg-en-br...46.2100305.233330Rue Antoine de Saint-Exup\u00e9ry, Bourg-en-Bresse,...
311 avenue de l\u2019\u00e9galit\u00e9bourg-en-bresse4charles perrault - \u00e9cole primaire100011 avenue de l\u2019\u00e9galit\u00e9 01000 bourg-en-bresse46.2148485.23194111, Avenue de l'\u00c9galit\u00e9, Saint-Georges, La Gla...
411 avenue de l\u2019\u00e9galit\u00e9bourg-en-bresse5charles perrault - \u00e9cole primaire100011 avenue de l\u2019\u00e9galit\u00e9 01000 bourg-en-bresse46.2148485.23194111, Avenue de l'\u00c9galit\u00e9, Saint-Georges, La Gla...
\n", "
"], "text/plain": [" address city n \\\n", "0 cours verdun bourg 1 \n", "1 cours verdun bourg 2 \n", "2 rue antoine de saint exup\u00e9ry bourg-en-bresse 3 \n", "3 11 avenue de l\u2019\u00e9galit\u00e9 bourg-en-bresse 4 \n", "4 11 avenue de l\u2019\u00e9galit\u00e9 bourg-en-bresse 5 \n", "\n", " place zip \\\n", "0 salle des f\u00eates 1000 \n", "1 salle des f\u00eates 1000 \n", "2 groupe scolaire saint-exup\u00e9ry - salle de jeux,... 1000 \n", "3 charles perrault - \u00e9cole primaire 1000 \n", "4 charles perrault - \u00e9cole primaire 1000 \n", "\n", " full_address latitude longitude \\\n", "0 cours verdun 01000 bourg 46.206605 5.228364 \n", "1 cours verdun 01000 bourg 46.206605 5.228364 \n", "2 rue antoine de saint exup\u00e9ry 01000 bourg-en-br... 46.210030 5.233330 \n", "3 11 avenue de l\u2019\u00e9galit\u00e9 01000 bourg-en-bresse 46.214848 5.231941 \n", "4 11 avenue de l\u2019\u00e9galit\u00e9 01000 bourg-en-bresse 46.214848 5.231941 \n", "\n", " geo_address \n", "0 Cours de Verdun, Le Peloux, Les Vennes, Bourg-... \n", "1 Cours de Verdun, Le Peloux, Les Vennes, Bourg-... \n", "2 Rue Antoine de Saint-Exup\u00e9ry, Bourg-en-Bresse,... \n", "3 11, Avenue de l'\u00c9galit\u00e9, Saint-Georges, La Gla... \n", "4 11, Avenue de l'\u00c9galit\u00e9, Saint-Georges, La Gla... "]}, "execution_count": 17, "metadata": {}, "output_type": "execute_result"}], "source": ["from actuariat_python.data import elections_vote_places_geo\n", "places = elections_vote_places_geo()\n", "places.head()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### G\u00e9olocalisation des villes"]}, {"cell_type": "code", "execution_count": 17, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:51:18.057162", "start_time": "2016-10-30T09:51:17.837164"}}, "outputs": [{"data": {"text/html": ["
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
cityzipn
0abbeville8010017
1ableiges954502
2ablis786602
3ablon944804
4ach\u00e8res7826012
\n", "
"], "text/plain": [" city zip n\n", "0 abbeville 80100 17\n", "1 ableiges 95450 2\n", "2 ablis 78660 2\n", "3 ablon 94480 4\n", "4 ach\u00e8res 78260 12"]}, "execution_count": 18, "metadata": {}, "output_type": "execute_result"}], "source": ["from actuariat_python.data import elections_vote_places_geo\n", "bureau_geo = elections_vote_places_geo()\n", "villes_geo = bureau_geo[[\"city\", \"zip\", \"n\"]].groupby([\"city\", \"zip\"], as_index=False).count()\n", "villes_geo.head()"]}, {"cell_type": "code", "execution_count": 18, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:51:18.110595", "start_time": "2016-10-30T09:51:18.061163"}}, "outputs": [{"data": {"text/html": ["
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
cityzipnfull_addresslatitudelongitudegeo_address
0abbeville801001780100 abbeville France30.206659-92.008957Nan Dr, Lafayette, LA 70503, United States
1ableiges95450295450 ableiges France49.0901651.981233Ableiges, Pontoise, Val-d'Oise, \u00cele-de-France,...
2ablis78660278660 ablis France48.5171531.836876Ablis, Rambouillet, Yvelines, \u00cele-de-France, 7...
3ablon94480494480 ablon France48.7236402.414800Rue d'Ablon, Ablon-sur-Seine, IdF 94480, France
4ach\u00e8res782601278260 ach\u00e8res France48.9602662.070165Ach\u00e8res, Saint-Germain-en-Laye, Yvelines, \u00cele-...
\n", "
"], "text/plain": [" city zip n full_address latitude longitude \\\n", "0 abbeville 80100 17 80100 abbeville France 30.206659 -92.008957 \n", "1 ableiges 95450 2 95450 ableiges France 49.090165 1.981233 \n", "2 ablis 78660 2 78660 ablis France 48.517153 1.836876 \n", "3 ablon 94480 4 94480 ablon France 48.723640 2.414800 \n", "4 ach\u00e8res 78260 12 78260 ach\u00e8res France 48.960266 2.070165 \n", "\n", " geo_address \n", "0 Nan Dr, Lafayette, LA 70503, United States \n", "1 Ableiges, Pontoise, Val-d'Oise, \u00cele-de-France,... \n", "2 Ablis, Rambouillet, Yvelines, \u00cele-de-France, 7... \n", "3 Rue d'Ablon, Ablon-sur-Seine, IdF 94480, France \n", "4 Ach\u00e8res, Saint-Germain-en-Laye, Yvelines, \u00cele-... "]}, "execution_count": 19, "metadata": {}, "output_type": "execute_result"}], "source": ["from actuariat_python.data import villes_geo\n", "villes_geo = villes_geo(as_df=True)\n", "villes_geo.head()"]}, {"cell_type": "code", "execution_count": 19, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:51:18.234493", "start_time": "2016-10-30T09:51:18.117160"}}, "outputs": [{"data": {"text/plain": ["0"]}, "execution_count": 20, "metadata": {}, "output_type": "execute_result"}], "source": ["import keyring, os\n", "bing_key = keyring.get_password(\"bing\", \"actuariat_python,key\")\n", "coders = []\n", "if bing_key:\n", " # si la cl\u00e9 a \u00e9t\u00e9 trouv\u00e9e\n", " coders.append((\"bing\", bing_key))\n", "len(coders)"]}, {"cell_type": "code", "execution_count": 20, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:51:18.894794", "start_time": "2016-10-30T09:51:18.238159"}}, "outputs": [], "source": ["import os\n", "geocode = True\n", "if geocode:\n", " if os.path.exists(\"villes_geo.txt\"):\n", " import pandas\n", " villes_geo = pandas.read_csv(\"villes_geo.txt\", sep=\"\\t\", encoding=\"utf-8\")\n", " else:\n", " from actuariat_python.data import geocode\n", " from pyquickhelper.loghelper import fLOG\n", " fLOG(OutputPrint=True)\n", " villes_geo = geocode(villes_geo, fLOG=fLOG, index=False, encoding=\"utf-8\",\n", " exc=False, save_every=\"villes.dump.txt\", sep=\"\\t\", every=100,\n", " coders=coders, country=\"France\")"]}, {"cell_type": "code", "execution_count": 21, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:51:18.905151", "start_time": "2016-10-30T09:50:46.351Z"}}, "outputs": [{"data": {"text/html": ["
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
cityzipnfull_addresslatitudelongitudegeo_address
0abbeville801001780100 abbeville France50.1091881.833270Abbeville, Nord-Pas-de-Calais-Picardie 80100, ...
1ableiges95450295450 ableiges France49.0921211.982560Ableiges, IdF, France
2ablis78660278660 ablis France48.5048291.860777Ablis, IdF 78660, France
3ablon94480494480 ablon France48.7238692.419967Ablon-sur-Seine, IdF 94480, France
4ach\u00e8res782601278260 ach\u00e8res France48.9677052.065866Ach\u00e8res, IdF 78260, France
\n", "
"], "text/plain": [" city zip n full_address latitude longitude \\\n", "0 abbeville 80100 17 80100 abbeville France 50.109188 1.833270 \n", "1 ableiges 95450 2 95450 ableiges France 49.092121 1.982560 \n", "2 ablis 78660 2 78660 ablis France 48.504829 1.860777 \n", "3 ablon 94480 4 94480 ablon France 48.723869 2.419967 \n", "4 ach\u00e8res 78260 12 78260 ach\u00e8res France 48.967705 2.065866 \n", "\n", " geo_address \n", "0 Abbeville, Nord-Pas-de-Calais-Picardie 80100, ... \n", "1 Ableiges, IdF, France \n", "2 Ablis, IdF 78660, France \n", "3 Ablon-sur-Seine, IdF 94480, France \n", "4 Ach\u00e8res, IdF 78260, France "]}, "execution_count": 22, "metadata": {}, "output_type": "execute_result"}], "source": ["villes_geo.head()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On conserve les donn\u00e9es pour \u00e9viter de les reconstuire et faire appel \u00e0 l'API Bing \u00e0 nouveau."]}, {"cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": ["villes_geo.to_csv(\"villes_geo.txt\", sep=\"\\t\", index=False, encoding=\"utf-8\")"]}, {"cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [{"data": {"text/plain": ["(584, 7)"]}, "execution_count": 24, "metadata": {}, "output_type": "execute_result"}], "source": ["villes_geo.shape"]}, {"cell_type": "markdown", "metadata": {"collapsed": true}, "source": ["## G\u00e9olocation des bureaux de vote avec Cart\u00e9lec\n", "\n", "Le site [cartelec](http://www.cartelec.net/?page_id=3609) recense beaucoup plus de bureaux de vote mais pour les \u00e9lections 2007. Ils ne devraient pas avoir chang\u00e9 beaucoup."]}, {"cell_type": "code", "execution_count": 24, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:51:18.905151", "start_time": "2016-10-30T09:50:46.353Z"}}, "outputs": [{"data": {"text/plain": ["['fond0710.dbf', 'fond0710.shp', 'fond0710.shx']"]}, "execution_count": 25, "metadata": {}, "output_type": "execute_result"}], "source": ["from pyensae.datasource import download_data\n", "shp_vote = download_data(\"base_cartelec_2007_2010.zip\")\n", "shp_vote"]}, {"cell_type": "code", "execution_count": 25, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:51:18.906152", "start_time": "2016-10-30T09:50:46.360Z"}}, "outputs": [{"data": {"text/plain": ["(50578, 50578)"]}, "execution_count": 26, "metadata": {}, "output_type": "execute_result"}], "source": ["# La version 2.0.0.dev de pyshp est bugg\u00e9e. Il vaut mieux ne pas l'utiliser.\n", "import shapefile\n", "if \"dev\" in shapefile.__version__:\n", " raise ImportError(\"Use a different version of pyshp not '{0}'\".format(shapefile.__version__))\n", "r = shapefile.Reader(\"fond0710.shp\", encoding=\"utf8\", encodingErrors=\"ignore\")\n", "shapes = r.shapes()\n", "records = r.records()\n", "len(shapes), len(records)"]}, {"cell_type": "code", "execution_count": 26, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:51:18.906152", "start_time": "2016-10-30T09:50:46.364Z"}}, "outputs": [{"data": {"text/plain": ["{'DeletionFlag': '01001',\n", " 'BUREAU': '01001',\n", " 'CODE': \"L'Abergement-Clmenciat\",\n", " 'NOM': '012',\n", " 'CODEARRT': '01',\n", " 'CODEDEP': '82',\n", " 'CODEREG': '10',\n", " 'CODECANT': 'CHATILLON-SUR-CHALARONNE',\n", " 'CANTON': '04'}"]}, "execution_count": 27, "metadata": {}, "output_type": "execute_result"}], "source": ["{k[0]: v for k, v in zip(r.fields, records[0])}"]}, {"cell_type": "code", "execution_count": 27, "metadata": {"ExecuteTime": {"end_time": "2016-10-30T09:51:18.907152", "start_time": "2016-10-30T09:50:46.369Z"}}, "outputs": [{"data": {"text/plain": ["[(846774.7025280485, 6563840.655779875),\n", " (847430.4726776106, 6566444.631470905),\n", " (848975.0615885032, 6566530.102978201),\n", " (849532.5253064571, 6565971.4588501565),\n", " (848969.0813380895, 6564398.911644492),\n", " (850941.7401535356, 6563209.5425065085),\n", " (849896.4212796891, 6562719.844144765),\n", " (849632.2745031306, 6561522.415193593),\n", " (849891.0276243397, 6560738.406460746),\n", " (848732.0257644501, 6559575.068823495),\n", " (848585.9032087281, 6560169.582690463),\n", " (847664.0345600601, 6560616.395794825),\n", " (847793.2580021, 6562243.125831007),\n", " (846774.7025280485, 6563840.655779875)]"]}, "execution_count": 28, "metadata": {}, "output_type": "execute_result"}], "source": ["shapes[0].points"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Exercice 1\n", "\n", "* Etablir un plan d'action\n", "* D\u00e9tailler la mise en oeuvre de ce plan \u00e0 partir des donn\u00e9es\n", "* R\u00e9partir les t\u00e2ches sur plusieurs \u00e9quipes"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Exercice 2\n", "\n", "Mettre en oeuvre le plan d'action."]}, {"cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": []}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "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.7.0"}}, "nbformat": 4, "nbformat_minor": 2}