.. py:module:: municipals Eleccions municipals -------------------- Els partits polítics estan començant a dissenyar la seva estratègia electoral de cara a les pròximes eleccions municipals. Volen saber en quins municipis van ser el partit més votat a les eleccions del 2015, per tal d'intentar fidelitzar els seus votants multiplicant els actes electorals en aquests municipis. Exclouen Barcelona d'aquesta cerca perquè els actes electorals a la capital s'organitzen a part. L'objectiu de l'exercici és crear una funció que donades les sigles d'un partit polític, retorni la llista dels municipis on aquest partit va ser el més votat i el percentatge de vots que aquest partit ha obtingut respecte del total. Per a resoldre aquest problema, cal que que utilitzeu la llibreria `pandas `__. Utilitzarem el fitxer :download:`FilesVots_M20151_MU_ca_ES.csv` que conté els resultats de les eleccions del 2015. Aquests resultats són públics i es poden obtenir de la `url següent `__. Resoldrem el problema a través de diverses funcions que desarem al fitxer :file:`municipals.py` (mòdul :py:mod:`municipals`). També farem altres funcions no directament relacionades amb el nostre objectiu, però que ens ajudaran a explorar les dades. Abans de començar, descarregueu el fitxer de dades en el directori de treball. 1. Dissenyeu la funció :py:func:`~municipals.creaDataFrame` que donat el nom d'un fitxer amb el resultat de les eleccions municipals, com l'indicat en el paràgraf anterior, el llegeix i retorna un :py:class:`~pandas.DataFrame`. Les dades estan en format `CSV `__ separades per un punt i coma. Consulteu la documentació de la funció `read_csv `__ per saber com fer-ho. .. literalinclude:: test-municipals.txt :language: python3 :lines: 5-23 2. Com que ens interessen els resultats a nivell dels municipis i volem excloure Barcelona, filtrarem el :py:class:`~pandas.DataFrame` i guardarem només les files que tenen un valor vàlid a la columna de ``'Nom Municipi'`` i que no sigui Barcelona. Per això, dissenyeu la funció :py:func:`~municipals.filtraFiles` que rep com a paràmetre el :py:class:`~pandas.DataFrame` llegit a la pregunta anterior i el filtra. Utilizeu el mètode :py:meth:`~pandas.DataFrame.notna`, per determinar si un valor existeix o no. Investigueu com filtrar amb una doble condició llegint l'apartat de la documentació: :ref:`Boolean indexing `. .. literalinclude:: test-municipals.txt :language: python3 :lines: 24-26 3. Ara voldrem reduir el nombre de columnes i quedar-nos només amb les corresponents al nom del municipi, les sigles de partit i els vots de partits. Dissenyeu la funció :py:func:`~municipals.filtraColumnes` que rep com a paràmetre un :py:class:`~pandas.DataFrame` com l'obtingut a la pregunta 2 i n'obté un altre que només té les columnes indicades. .. literalinclude:: test-municipals.txt :language: python3 :lines: 27-34 4. Ens volem centrar en el cas particular d'un municipi del que no recordem exactament el nom. Creiem recordar que era quelcom de l'estil *no_sé_què de Llobregat*. En el shell de python, intenteu filtrar les dades de tots municipis que contenen 'de Llobregat' en el seu nom. Investigueu les :doc:`eines de treball amb strings `. Dissenyeu la funció :py:func:`~municipals.filtraPerMunicipi` que donat un dataframe com l'obtingut a la pregunta 3 (on totes les files tenen un valor vàlid a la columna 'Nom Municipi'), i donat un substring, retorni un nou :py:class:`~pandas.DataFrame` format només per les files corresponents a municipis que contenen el substring en el seu nom. Com a suggeriment podeu usar el mètode :py:meth:`~pandas.Series.str.contains`. .. literalinclude:: test-municipals.txt :language: python3 :lines: 35-47 5. Ara, dissenyeu la funció :py:func:`~municipals.ordenaDades` que, a partir d'un :py:class:`~pandas.DataFrame` com l'obtingut a la pregunta 3, en crea un de nou que té per files el nom dels municipis i per columna les sigles del partit més votat. Per això, primer crearem un dataframe per cada municipi utilitzant el mètode :py:meth:`~pandas.DataFrame.groupby`. Per cada :py:class:`~pandas.DataFrame` municipal, calcularem l'índex del partit més votat utilitzant el mètode :py:meth:`~pandas.DataFrame.idxmax` i finalment reduirem les dades a només el nom del municipi (que ha de ser l'índex) i les sigles del partit més votat. .. literalinclude:: test-municipals.txt :language: python3 :lines: 49-65 6. Dissenyeu finalment la funció :py:func:`~municipals.llistaMunicipis`, que a partir d'un :py:class:`~pandas.DataFrame` com l'obtingut a la pregunta 1 i de les sigles d'un partit, retorna la llista de municipis on el partit donat ha estat el més votat ordenada alfabèticament. Aquesta funció simplement crida seqüencialment algunes de les funcions anteriors, passant els paràmetres adients. Noteu, però, que les sigles d'un partit poden aparèixer soles o bé formant part d'una candidatura. Per exemple, ``'ERC'`` pot aparèixer així o bé com ``'ERC-AM'`` o ``'ERC-SxA'``, entre altres possibles combinacions. .. literalinclude:: test-municipals.txt :language: python3 :lines: 67-83 Disposeu de jocs de proves al fitxer :download:`test-municipals.txt`. .. rubric:: Solució Disposeu d'una solució al fitxer :download:`municipals.py `.