Despeses farmacèutiques

Cada any es publiquen en accés obert les dades de despeses en farmàcia a Catalunya. Hem descarregat un fitxer d’exemple corresponent a l’any 2017: r2017.csv. Utilitzant les dades d’aquest fitxer, creeu un DataFrame de pandas. Estudieu el fitxer i examineu el nom de les seves columnes i algunes de les seves files. Hi ha una classificació de les persones assegurades per la seva residència, sexe i edat i una classificació de la tipologia de medicaments receptats.

>>> df = pd.read_csv('r2017.csv')
>>> df.columns
Index(['Any', 'Codi RS', 'Regió Sanitària Residència', 'Sexe',
       '6 trams d'edat', 'Codi grup ATC', 'Grup ATC', 'Codi subgrup ATC 3',
       'Subgrup 3 (ATC)', 'Codi subgrup ATC 4', 'Subgrup 4 (ATC)',
       'Codi subgrup ATC 5', 'Subgrup 5 (ATC)', 'Nombre de receptes'],
      dtype='object')

Les funcions que es demanen tot seguit cal desar-les al mòdul farma (fitxer farma.py).

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

  1. Dissenyeu la funció nombre_receptes() que, donat un DataFrame de despeses farmacèutiques, df, en retorni el nombre total de receptes. Exemple:

    >>> nombre_receptes(df)
    136729918
    >>> nombre_receptes(df[100:200])
    75103
    
  2. Dissenyeu la funció dades_barcelona() que, donat un DataFrame de despeses farmacèutiques, df, retorni un altre DataFrame que contingui només les columnes "6 trams d'edat" i "Nombre de receptes", i només les files corresponents a despeses de persones assegurades amb residència a la regió sanitària de Barcelona. El DataFrame retornat ha d’estar ordenat i indexat com el DataFrame original. Exemple:

    >>> df2 = dades_barcelona(df)
    >>> len(df2)
    4031
    >>> df2[0:3]
          6 trams d'edat  Nombre de receptes
    20451    0 - 14 anys                3766
    20452    0 - 14 anys                 139
    20453    0 - 14 anys                4488
    
  3. Dissenyeu la funció tipologia_sexe() que, donat un DataFrame de despeses farmacèutiques, df, retorni una llista ordenada de petit a gran amb els diferents valors que hi ha a la columna 'Sexe'. Exemple:

    >>> tipologia_sexe(df)
    ['Altres', 'Dona', 'Home', 'Sense especificar']
    
  4. Dissenyeu la funció percentatge_receptes_sexe() que, donat un DataFrame de despeses farmacèutiques, df, i un string indicant un tipus de sexe, retorni el percentatge del nombre de receptes d’aquest tipus de sexe respecte del nombre de receptes total. Aquesta funció ha de cridar la funció nombre_receptes(). Exemple:

    >>> ph = percentatge_receptes_sexe(df, 'Home')
    >>> round(ph, 4)
    43.2028
    >>> pd = percentatge_receptes_sexe(df, 'Dona')
    >>> round(pd, 4)
    56.4954
    
  5. Dissenyeu la funció mitjana_per_edat() que, donat un DataFrame de despeses farmacèutiques, df, retorni una Series indicant la mitjana del nombre de receptes per tram d’edat. Els valors de les mitjanes han d’estar arrodonits a 2 decimals. Exemple:

    >>> mitjana_per_edat(df)
    6 trams d'edat
    0 - 14 anys          1387.96
    15 - 44 anys         3190.19
    45 - 64 anys         7813.49
    65 - 74 anys         7375.79
    75 - 84 anys         7316.35
    85 anys o més        4681.66
    Altres                  3.09
    Sense especificar    1205.98
    Name: Nombre de receptes, dtype: float64
    
  6. Dissenyeu la funció atc() que, donat un DataFrame de despeses farmacèutiques, df, i un codi de grup ATC, retorni el nombre de receptes total i el nombre de receptes per homes i per dones corresponents a aquest grup ATC. Aquesta funció ha de cridar la funció nombre_receptes(). Exemple:

    >>> atc(df, 'C')
    (34391339, 17132700, 17189688)
    >>> atc(df, 'D')
    (2362044, 1074762, 1275317)
    
  7. Dissenyeu la funció atc_max() que, donat un DataFrame de despeses farmacèutiques, df, retorni un string corresponent al codi de grup ATC amb més receptes. Exemple:

    >>> atc_max(df)
    'N'
    
  8. Dissenyeu la funció classifica_edat() que, donat un enter que representa una edat, retorni l’string que indica el tram que comprèn aquesta edat. Els 6 possibles strings són els següents: '0 - 14 anys', '15 - 44 anys', '45 - 64 anys', '65 - 74 anys', '75 - 84 any s' i '85 anys o més'. Exemple:

    >>> classifica_edat(3)
    '0 - 14 anys'
    >>> classifica_edat(44)
    '15 - 44 anys'
    
  9. Dissenyeu la funció atc_max_grup() que, donat un DataFrame de despeses farmacèutiques, df, un string indicant el sexe de la persona assegurada ('Home' o 'Dona') i un enter indicant una edat, retorni un altre string corresponent al codi de grup ATC amb més receptes per les persones d’aquell sexe i del tram d’edat que comprèn l’edat donada. Aquesta funció ha de cridar les funcions classifica_edat() i atc_max(). Exemple:

    >>> atc_max_grup(df,'Home', 63)
    'C'
    >>> atc_max_grup(df,'Dona', 35)
    'N'
    

Solució

Disposeu d’una solució al fitxer farma.py