Esercizio 1

Si consideri in input il dataset delle precipitazioni piovose mensili (mm) in periodo di N anni, nel seguente formato:

2009 2010 2011 2012 2013 2014 2015 Gennaio 75 63 65 50 77 66 69 Febbraio 64 65 65 67 50 54 58 Marzo 81 77 73 80 83 89 100 Aprile 89 90 85 90 90 84 90 Maggio 120 129 113 120 135 117 130 Giugno 113 99 116 114 111 119 100 Luglio 111 105 98 112 113 102 100 Agosto 129 131 120 111 141 130 126 Settembre 90 85 101 88 89 94 91 Ottobre 109 122 103 119 98 101 107 Novembre 111 121 101 104 121 115 104 Dicembre 56 67 44 58 61 64 58

La specifica del formato di input è la seguente: 13 record di campi separati da tabulazione di cui il primo è il record di intestazione degli anni (composto da N campi) e gli altri 12 sono i record delle piogge mensili (uno per ciascun mese) composti da N+1 campi (di cui il primo è il nome del mese) e i rimanenti N sono le piogge del mese lungo gli N anni.

Si richiede di calcolare:

  • per ognuno dei mesi, la precipitazione media lungo gli anni
  • per ognuno degli anni considerati, la precipitazione totale
  • per ognuno degli anni considerati, il numero di mesi con almeno p mm di pioggia

Parametri di input:

  • dataset delle precipitazioni
  • soglia p

Requisiti generali:

  • il calcolo deve essere generico rispetto dataset di input
  • si richiede la definizione della funzione compute_mean() per calcolare la media di una lista di numeri
  • si richiede la definizione della funzione count_elements_greater_than() per contare il numero di valori che sono almeno una certa soglia

Variabili di output:

  • lista means_per_month_tuples di 12 tuple delle precipitazioni medie mensili, in cui ogni tupla contiene le prime tre lettere del nome del mese in maiuscolo come primo elemento e la media lungo gli anni come secondo elemento
  • lista tot_per_year_tuples di N tuple delle precipitazioni totali annue, in cui ogni tupla contiene l'anno come primo elemento e la precipitazione totale come secondo elemento
  • lista count_per_year_tuples di N tuple del numero di mesi con almeno p mm di pioggia (per anno), in cui ogni tupla contiene l'anno come primo elemento e il numero di mesi con almeno p mm di pioggia come secondo elemento

Come leggere le righe di un file in input

Lo statement

with open(input_file_name, ’r’) as input_file:
    file_rows = input_file.readlines()

permette di ottenere l'handle in lettura input_file al file input_file_name e di ottenere la lista file_rows delle sue righe come oggetti di tipo str. Al termine l'handle viene chiuso e lo script può processare la lista file_rows.

Come costruire una matrice

Una matrice è di fatto una lista di liste della stessa dimensione. Ad esempio la seguente è una matrice di 3 righe e 4 colonne


In [1]:
lista = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
lista


Out[1]:
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]

Python permette di "forzarla" ad essere pensata come matrice in modo da usare tutte le funzioni tipiche delle matrici. Basta infatti usare la funzione array() del modulo numpy (che mette a disposizione funzioni scientifiche aggiuntive tra cui quelle di gestione delle matrici)


In [2]:
import numpy as np
matrice = np.array(lista)
matrice


Out[2]:
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

L'accesso degli elementi della matrice avviene seguendo la sintassi di accesso per le liste


In [3]:
lista[0][2]


Out[3]:
3

In [4]:
matrice[0][2]


Out[4]:
3

In [5]:
len(matrice)


Out[5]:
3

La funzione transpose() di numpy


In [6]:
matrice_t = np.transpose(matrice)
matrice_t


Out[6]:
array([[ 1,  5,  9],
       [ 2,  6, 10],
       [ 3,  7, 11],
       [ 4,  8, 12]])

oppure il metodo transpose() degli oggetti di tipo matrice


In [7]:
matrice_t = matrice.transpose()
matrice_t


Out[7]:
array([[ 1,  5,  9],
       [ 2,  6, 10],
       [ 3,  7, 11],
       [ 4,  8, 12]])

restituiscono la matrice trasposta

Funzioni/Metodi suggeriti

  • la funzione range() dà la possibilità di iterare sugli interi da 0 al valore dell'argomento passato -1

In [8]:
for i in range(10):
    print(i)


0
1
2
3
4
5
6
7
8
9
  • La funzione int() converte in intero il valore passato come argomento.

Esempio con stringa di cifre (letterale intero) come argomento


In [9]:
int('13')


Out[9]:
13

Esempio con decimale come argomento


In [10]:
int(13.6)


Out[10]:
13
  • La funzione float() converte in decimale il valore passato come argomento.

Esempio con stringa di cifre (letterale intero) come argomento


In [11]:
float('13')


Out[11]:
13.0

Esempio con stringa di cifre (letterale decimale) come argomento


In [12]:
float('13.5')


Out[12]:
13.5
Esempio con intero come argomento

In [13]:
float(13)


Out[13]:
13.0
  • La funzione sum() restituisce la somma degli elementi della lista o della tupla passata come argomento

Esempio con lista di interi come argomento


In [14]:
sum([1, 2, 3.0, 4, 5])


Out[14]:
15.0

Esempio con lista di interi e decimali come argomento


In [15]:
sum([1, 2, 3.0, 4.0, 5])


Out[15]:
15.0
  • Il metodo upper() degli oggetti di tipo str restituisce una copia in maiuscolo della stringa invocante

In [16]:
'ciao'.upper()


Out[16]:
'CIAO'
  • Il metodo rstrip() degli oggetti di tipo str restituisce una copia della stringa invocante dopo avere rimosso il più lungo suffisso contenente solo caratteri della stringa passata come argomento. Se l’argomento viene omesso, allora il metodo rimuove tutti i caratteri di tipo spazio (tabulazione, newline, etc.)

In [17]:
'aaaa   '.rstrip(' ')


Out[17]:
'aaaa'

In [18]:
'aaaa   '.rstrip()


Out[18]:
'aaaa'

In [19]:
'aaaa\n'.rstrip()


Out[19]:
'aaaa'

In [20]:
'aaaa\n'.rstrip(' ')


Out[20]:
'aaaa\n'
  • Il metodo split() degli oggetti di tipo str restituisce la lista degli elementi ottenuti separando la stringa invocante tramite il delimitatore (oggetto di tipo str) passato come argomento. Se l’argomento viene omesso la stringa invocante viene separata usando spazi di qualsiasi tipo.

In [21]:
'aa aa aa'.split(' ')


Out[21]:
['aa', 'aa', 'aa']

In [22]:
'aa aa aa'.split()


Out[22]:
['aa', 'aa', 'aa']

In [23]:
'aa   aa      aa'.split()


Out[23]:
['aa', 'aa', 'aa']

In [24]:
'aa   aa      aa'.split(' ')


Out[24]:
['aa', '', '', 'aa', '', '', '', '', '', 'aa']

In [25]:
'aa\taa\taa'.split()


Out[25]:
['aa', 'aa', 'aa']
  • Il metodo pop() degli oggetti di tipo list rimuove e restituisce l’elemento della lista invocante che si trova nella posizione specificata dall'indice passato come argomento.

In [26]:
lista = [1,2,3,4]
lista.pop(1)


Out[26]:
2

In [27]:
lista


Out[27]:
[1, 3, 4]
  • Il metodo append() degli oggetti di tipo list aggiunge in coda alla lista invocante il valore passato come argomento

In [28]:
lista = [1,2,3,4]
lista.append([5, 6])

In [29]:
lista


Out[29]:
[1, 2, 3, 4, [5, 6]]
  • Il metodo count() delle sequenze restituisce il numero di elementi della sequenza invocante che sono uguali al valore passato come argomento

In [30]:
[True,False,True,True].count(True)


Out[30]:
3

In [31]:
'aabbabbbba'.count('a')


Out[31]:
4