Escoles

Un mecanisme de transparència de les administracions públiques consisteix en «obrir» dades per posar-les a disposició de la ciutadania per a què aquesta les pugui utilitzar lliurament. Al web dades_obertes de la Generalitat de Catalunya s’hi publiquen tot tipus de dades obertes. L’objectiu de l’exercici és accedir a aquestes dades per respondre a preguntes sobre la distribució de centres escolars de primària i secundària a Catalunya. Per això, es treballarà amb les dades del directori de centres docents. Teniu disponibles les dades d’alguns any al fitxer centres_docents.csv.

Deseu totes les funcions al fitxer escoles.py (mòdul escoles).

  1. Dissenyeu la funció llegir_dades(nomf, a) que, donat un nom de fitxer nomf i un any a, retorna un DataFrame amb les dades del fitxer únicament de l’any a.

    >>> df = llegir_dades('centres_docents.csv', 2017)
    >>> df.iloc[0]['Denominació completa']
    'Escola Francesc Platón i Sartí'
    >>> df['Any'].unique()
    array([2017])
    >>> df.head(5)['Telèfon']
    5473    937 700 381
    5474    935 557 803
    5475    938 527 007
    5476    938 432 778
    5477    937 920 241
    
  2. Dissenyeu la funció nombre_centres() que, a partir del DataFrame com el creat a la pregunta 1, retorna el nombre total de centres censats en el DataFrame.

    >>> nombre_centres(df)
    5463
    
  3. Dissenyeu la funció telefon() que, a partir del DataFrame com el creat a la pregunta 1 i el codi d’un centre, retorna una tupla amb el nom, adreça i telèfon de contacte d’aquest centre (columnes 'Denominació completa', 'Adreça' i 'Telèfon').

    >>> telefon(df, 8000013)
    ('Escola Francesc Platón i Sartí', 'C. Salvador Espriu, 3', '937 700 381')
    
  4. Dissenyeu la funció titularitat() que, a partir del DataFrame com el creat a la pregunta 1, retorna el percentatge de centres de titularitat pública (aquells que en el camp 'Nom naturalesa' hi ha el valor 'Públic') que consten en el DataFrame.

    >>> ptp = titularitat(df)
    >>> round(ptp, 3)
    69.541
    
  5. Dissenyeu la funció distribucio_titularitat() que, a partir del DataFrame com el creat a la pregunta 1, retorna una Series indexada pel nom de la comarca ('Nom comarca'), amb el percentatge de centres de titularitat pública que hi ha a cada comarca.

    >>> dt = distribucio_titularitat(df)
    >>> dt.sort_values().head().round(1)
    Nom comarca
    Barcelonès           47.6
    Vallès Occidental    62.0
    Gironès              66.9
    Maresme              67.2
    Baix Llobregat       67.6
    dtype: float64
    
  6. Dissenyeu la funció tipologia_centres() que, a partir del DataFrame com el creat a la pregunta 1, retorna un diccionari que tingui per claus els tipus d’ensenyaments 'EINF1C', 'EINF2C', 'EPRI', 'ESO', 'BATX', 'CFPM' i 'CFPS' i com a valors associats el nombre de centres que ofereixen cada tipus d’ensenyament. Observeu que un mateix centre pot oferir diversos tipus d’ensenyaments.

    Si analitzem el DataFrame veurem que hi ha una columna per cada tipus d’ensenyament. Si el centre imparteix aquest tipus d’ensenyament el valor és el nom d’aquest tipus d’ensenyament i si no l’imparteix el valor és NaN.

    >>> tc = tipologia_centres(df)
    >>> if tc != {'ESO': 1147, 'BATX': 756, 'CFPM': 441, 'EPRI': 2348, 'EINF2C': 2363, 'EINF1C': 1807, 'CFPS': 404}:
    ...   print(tc)
    
  7. Dissenyeu la funció busca_centre_ESO() que, donat el DataFrame com el creat a la pregunta 1 i donat un codi postal, retorna un DataFrame format pels centres d’ESO de titularitat pública que tenen el codi postal donat. El DataFrame ha de tenir per files les centres i per columnes el nom del centre, la seva adreça i el seu telèfon.

    >>> d = busca_centre_ESO(df, 8001)
    >>> d['Denominació completa']
    0           Institut Milà i Fontanals
    1           Institut Miquel Tarradell
    2    Institut Escola Turó de Roquetes
    3           Institut Escola Antaviana
    4          Institut Escola El Til·ler
    5       Institut Escola Trinitat Nova
    Name: Denominació completa, dtype: object
    >>> d['Adreça']
    0    Pl. Josep Ma. Folch i Torres, s/n
    1                C. dels Àngels, 1 bis
    2                     C. Alcàntara, 22
    3                    C. Nou Barris, 12
    4                 Pg. de Mollerussa, 1
    5                       C. Pedrosa, 16
    Name: Adreça, dtype: object
    
  8. Dissenyeu la funció quants_FP() que, donat el DataFrame com el creat a la pregunta 1 i donat un nom de comarca, retorna el nombre de centres de la comarca que imparteixen estudis de formació professional de grau mitjà ('CFPM') o superior ('CFPS').

    >>> quants_FP(df, 'Bages')
    14
    >>> quants_FP(df, 'Maresme')
    20
    
  9. Alguns noms de centres com per exemple «Jaume Balmes» estan repetits. Dissenyeu la funció noms_iguals() que, donat el DataFrame com el creat a la pregunta 1, retorna un diccionari que té per claus els noms dels centres i per valors el nombre de repeticions. En el diccionari només hi han de constar els centres que tenen el seu nom repetit.

    >>> ni = noms_iguals(df)
    >>> sorted(ni.items(), key=lambda t: (t[1], t[0]), reverse=True)[:5]
    [('Esc. de Música Municipal', 30), ("Llar d'infants Municipal", 18), ('Escola Pompeu Fabra', 15), ('Escola Sant Jordi', 14), ('Sagrada Família', 13)]
    

Disposeu de jocs de proves al fitxer test-escoles.txt

Solució

Disposeu d’una solució al fitxer escoles.py.