3. Temperatures agregades (3 punts)

Un fitxer de temperatures conté les temperatures mitjanes mesurades cada mitja hora en una estació meteorològica durant un dia. Cada temperatura és un nombre real i està en una línia del fitxer. Per exemple, el fitxer bcn_of-20230608.txt conté les temperatures mesurades a l’Observatori Fabra de Barcelona el dia 8 de juny de 2023. Les primeres línies del fitxer són les següents:

17.8
17.6
17.5
17.3
17.2
17.4
17.9
18.0
18.2

La primera mesura (\(17.8^\circ\)) correspon a la franja de 0 a 0:30 hores, la segona (\(17.6^\circ\)) a la franja de 0:30 a 1:00 hores i així successivament. Identificarem cada franja amb un nombre natural consecutiu començant per 0. Així la primera franja (0:00 a 0:30) serà la 0, la segona (0:30 a 1:00) serà la 1 i així successivament.

D’aquestes mesures volem estudiar en quina franja es produeix la primera mesura superior a un llindar. Per exemple, amb les dades anteriors, si el llindar és \(17.8^\circ\), la primera franja en què la mesura és superior és la 6 (\(17.9^\circ\)). I si el llindar és \(18.0^\circ\), la primera franja és la 8 (\(18.2^\circ\)).

Dissenya la funció següent i desa-la al mòdul temperatures_agregades (fitxer temperatures_agregades.py).

temperatures_agregades.obte_primera_franja(nom_fitxer, llindar)

Retorna l’identificador de la franja a què correspon la primera temperatura del fitxer de temperatures nom_fitxer que és més gran que llindar. En cas que totes les temperatures siguin més petites o iguals al llindar, retorna -1.

Per exemple,


>>> franja = obte_primera_franja(nom, 17.8)
>>> franja
6

>>> franja = obte_primera_franja(nom, 18.0)
>>> franja
8

>>> franja = obte_primera_franja(nom, 30)
>>> franja
-1

Trobaràs més tests al fitxer test-temperatures_agregades-obte_primera_franja.txt.

L’objectiu és agregar dades de diferents estacions meteorològiques i dies. Les dades d’un dia d’una estació estaran en un fitxer de temperatures. El nom del fitxer està format pel nom de l’estació meteorològica seguit d’un guionet i seguit de la data escrita amb vuit dígits i acabat amb .txt. Dels vuit dígits de la data, els quatre primers corresponen a l’any, els dos següents al mes i els dos darrers al dia. Per exemple, el fitxer mas de barberans-20230423.txt conté les mesures del 23 d’abril de 2023 al Mas de Barberans.

La dada que volem agregar de cada fitxer és la primera franja en què la mesura supera el llindar definit per a la data del fitxer. El llindar que correspon a una data es defineix en un diccionari de llindars en què les claus són dates representades com tuples de tres enters (dia, mes, any) i el valor és un llindar (float). Per exemple:

>>> llindars = {
... (8, 6, 2023): 25,
... (7, 6, 2023): 16.5,
... (31, 5, 2023): 17,
... (23, 4, 2023): 20.5,
... }

Recollirem les dades agregades en un diccionari de franges en què les claus seran els strings 'estació', 'data' i 'franja' i els valors associats seran llistes. La llista corresponent a la clau 'estació' conté noms d’estacions, la de 'data' dates en format tuple de tres enters (dia, mes, any) i la de 'franja' enters. Les dades d’una data i una estació estaran a la posició i-èssima de cada llista. Per exemple:

>>> temp_agr['estació']
['bcnrv', 'gisclareny', 'alcarràs', 'mas de barberans', 'bcn_of']
>>> temp_agr['data']
[(8, 6, 2023), (7, 6, 2023), (31, 5, 2023), (23, 4, 2023), (8, 6, 2023)]
>>> temp_agr['franja']
[-1, 16, 0, 22, 21]

En aquest exemple, la posició 0 de cada llista indica que a l’estació del Raval de Barcelona del dia 8 de juny de 2023 cap temperatura ha superat el llindar d’aquest dia; la posició 1 indica que a l’estació de Gisclareny, la franja 16 és la primera que supera el llindar de temperatura del dia 7 de juny de 2023; i així successivament.

Dissenya la funció següent i desa-la al mateix mòdul que l’anterior:

temperatures_agregades.agrega(l_fitxers, d_llindars)

Retorna el diccionari de franges calculat a partir de les mesures de cada un dels fitxers de la llista l_fitxers i dels llindars diaris definits en el diccionari de llindars d_llindars.

Per cada fitxer en l_fitxers, cal calcular la primera franja en què s’ha superat el llindar de temperatura en la data i l’estació extretes del nom del fitxer. Aquestes tres dades (estació, data i franja), s’han d’afegir al diccionari de franges resultant.

Per exemple,


>>> fitxers = [
...   "bcnrv-20230608.txt",
...   "gisclareny-20230607.txt",
...   "alcarràs-20230531.txt",
...   "mas de barberans-20230423.txt",
...   "bcn_of-20230608.txt",
... ]
>>> llindars = {
... (8, 6, 2023): 25,
... (7, 6, 2023): 16.5,
... (31, 5, 2023): 17,
... (23, 4, 2023): 20.5,
... }
>>> temp_agr = agrega(fitxers, llindars)
>>> temp_agr['estació']
['bcnrv', 'gisclareny', 'alcarràs', 'mas de barberans', 'bcn_of']
>>> temp_agr['data']
[(8, 6, 2023), (7, 6, 2023), (31, 5, 2023), (23, 4, 2023), (8, 6, 2023)]
>>> temp_agr['franja']
[-1, 16, 0, 22, 21]

Observa que temp_agr['estació'][i], temp_agr['data'][i] i temp_agr['franja'][i] són l’estació, la data i la franja que corresponen a fitxers[i]. És a dir, que la informació en el diccionari de franges està en el mateix ordre que a la llista de fitxers.

Trobaràs més tests al fitxer test-temperatures_agregades-agrega.txt.