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

Soluzione

Importare il modulo numpy come np per costruire e gestire matrici.


In [1]:
import numpy as np

Definizione delle funzioni

  • compute_mean(), calcolo della media di una lista di valori numerici

In [1]:
def compute_mean(list_of_numbers):
    return float(sum(list_of_numbers))/len(list_of_numbers)
  • count_elements_greater_than(), conteggio del numero di valori di una lista sono che almeno uguali a una certa soglia

In [3]:
def count_elements_greater_than(list_of_numbers, threshold):
    b_list = [number >= threshold for number in list_of_numbers]
    return b_list.count(True)

Dataset e parametri in input


In [4]:
input_file_name = './input-precipitazioni.txt'
p = 100

Lettura delle righe del dataset in input nella lista file_rows


In [5]:
with open(input_file_name, 'r') as input_file:
    file_rows = input_file.readlines()

In [6]:
file_rows


Out[6]:
['\t\t\t2009\t2010\t2011\t2012\t2013\t2014\t2015\n',
 'Gennaio\t\t75\t\t63\t\t65\t\t50\t\t77\t\t66\t\t69\n',
 'Febbraio\t64\t\t65\t\t65\t\t67\t\t50\t\t54\t\t58\n',
 'Marzo\t\t81\t\t77\t\t73\t\t80\t\t83\t\t89\t\t100\n',
 'Aprile\t\t89\t\t90\t\t85\t\t90\t\t90\t\t84\t\t90\n',
 'Maggio\t\t120\t\t129\t\t113\t\t120\t\t135\t\t117\t\t130\n',
 'Giugno\t\t113\t\t99\t\t116\t\t114\t\t111\t\t119\t\t100\n',
 'Luglio\t\t111\t\t105\t\t98\t\t112\t\t113\t\t102\t\t100\n',
 'Agosto\t\t129\t\t131\t\t120\t\t111\t\t141\t\t130\t\t126\n',
 'Settembre\t90\t\t85\t\t101\t\t88\t\t89\t\t94\t\t91\n',
 'Ottobre\t\t109\t\t122\t\t103\t\t119\t\t98\t\t101\t\t107\n',
 'Novembre\t111\t\t121\t\t101\t\t104\t\t121\t\t115\t\t104\n',
 'Dicembre\t56\t\t67\t\t44\t\t58\t\t61\t\t64\t\t58']

Estrazione della lista years degli anni rilevati


In [7]:
years = file_rows.pop(0).rstrip().split()

In [8]:
years


Out[8]:
['2009', '2010', '2011', '2012', '2013', '2014', '2015']

NOTA BENE: a questo punto la riga di intestazione del dataset in input non deve più essere presente nella lista file_rows.


In [9]:
file_rows


Out[9]:
['Gennaio\t\t75\t\t63\t\t65\t\t50\t\t77\t\t66\t\t69\n',
 'Febbraio\t64\t\t65\t\t65\t\t67\t\t50\t\t54\t\t58\n',
 'Marzo\t\t81\t\t77\t\t73\t\t80\t\t83\t\t89\t\t100\n',
 'Aprile\t\t89\t\t90\t\t85\t\t90\t\t90\t\t84\t\t90\n',
 'Maggio\t\t120\t\t129\t\t113\t\t120\t\t135\t\t117\t\t130\n',
 'Giugno\t\t113\t\t99\t\t116\t\t114\t\t111\t\t119\t\t100\n',
 'Luglio\t\t111\t\t105\t\t98\t\t112\t\t113\t\t102\t\t100\n',
 'Agosto\t\t129\t\t131\t\t120\t\t111\t\t141\t\t130\t\t126\n',
 'Settembre\t90\t\t85\t\t101\t\t88\t\t89\t\t94\t\t91\n',
 'Ottobre\t\t109\t\t122\t\t103\t\t119\t\t98\t\t101\t\t107\n',
 'Novembre\t111\t\t121\t\t101\t\t104\t\t121\t\t115\t\t104\n',
 'Dicembre\t56\t\t67\t\t44\t\t58\t\t61\t\t64\t\t58']

Estrazione della lista months dei nomi dei mesi


In [10]:
months = [row.rstrip().split()[0] for row in file_rows]

In [11]:
months


Out[11]:
['Gennaio',
 'Febbraio',
 'Marzo',
 'Aprile',
 'Maggio',
 'Giugno',
 'Luglio',
 'Agosto',
 'Settembre',
 'Ottobre',
 'Novembre',
 'Dicembre']

Costruzione della matrice rains_per_months delle piogge mensili

NOTA BENE: ogni riga della matrice rains_per_month deve contenere le piogge di un dato mese (lungo gli anni) come valori di tipo int.

Costruire la lista list_rains_per_months_str in cui il singolo elemento è la lista delle piogge in un dato mese, come valori di tipo str


In [12]:
list_rains_per_months_str = [row.rstrip().split()[1:] for row in file_rows]

In [13]:
list_rains_per_months_str


Out[13]:
[['75', '63', '65', '50', '77', '66', '69'],
 ['64', '65', '65', '67', '50', '54', '58'],
 ['81', '77', '73', '80', '83', '89', '100'],
 ['89', '90', '85', '90', '90', '84', '90'],
 ['120', '129', '113', '120', '135', '117', '130'],
 ['113', '99', '116', '114', '111', '119', '100'],
 ['111', '105', '98', '112', '113', '102', '100'],
 ['129', '131', '120', '111', '141', '130', '126'],
 ['90', '85', '101', '88', '89', '94', '91'],
 ['109', '122', '103', '119', '98', '101', '107'],
 ['111', '121', '101', '104', '121', '115', '104'],
 ['56', '67', '44', '58', '61', '64', '58']]

Convertire la lista list_rains_per_months_str in una lista list_rains_per_months_int di oggetti di tipo int.


In [14]:
list_rains_per_months_int = [[int(rain) for rain in rains] for rains in list_rains_per_months_str]

In [15]:
list_rains_per_months_int


Out[15]:
[[75, 63, 65, 50, 77, 66, 69],
 [64, 65, 65, 67, 50, 54, 58],
 [81, 77, 73, 80, 83, 89, 100],
 [89, 90, 85, 90, 90, 84, 90],
 [120, 129, 113, 120, 135, 117, 130],
 [113, 99, 116, 114, 111, 119, 100],
 [111, 105, 98, 112, 113, 102, 100],
 [129, 131, 120, 111, 141, 130, 126],
 [90, 85, 101, 88, 89, 94, 91],
 [109, 122, 103, 119, 98, 101, 107],
 [111, 121, 101, 104, 121, 115, 104],
 [56, 67, 44, 58, 61, 64, 58]]

Ottenere dalla lista list_rains_per_months_int la matrice rains_per_month.


In [16]:
rains_per_month = np.array(list_rains_per_months_int)

In [17]:
rains_per_month


Out[17]:
array([[ 75,  63,  65,  50,  77,  66,  69],
       [ 64,  65,  65,  67,  50,  54,  58],
       [ 81,  77,  73,  80,  83,  89, 100],
       [ 89,  90,  85,  90,  90,  84,  90],
       [120, 129, 113, 120, 135, 117, 130],
       [113,  99, 116, 114, 111, 119, 100],
       [111, 105,  98, 112, 113, 102, 100],
       [129, 131, 120, 111, 141, 130, 126],
       [ 90,  85, 101,  88,  89,  94,  91],
       [109, 122, 103, 119,  98, 101, 107],
       [111, 121, 101, 104, 121, 115, 104],
       [ 56,  67,  44,  58,  61,  64,  58]])

Costruzione della matrice rains_per_year delle piogge annue

NOTA BENE: ogni riga della matrice rains_per_year deve contenere le piogge di un dato anno (lungo i mesi) come valori di tipo int


In [18]:
rains_per_year = rains_per_month.transpose()

In [19]:
rains_per_year


Out[19]:
array([[ 75,  64,  81,  89, 120, 113, 111, 129,  90, 109, 111,  56],
       [ 63,  65,  77,  90, 129,  99, 105, 131,  85, 122, 121,  67],
       [ 65,  65,  73,  85, 113, 116,  98, 120, 101, 103, 101,  44],
       [ 50,  67,  80,  90, 120, 114, 112, 111,  88, 119, 104,  58],
       [ 77,  50,  83,  90, 135, 111, 113, 141,  89,  98, 121,  61],
       [ 66,  54,  89,  84, 117, 119, 102, 130,  94, 101, 115,  64],
       [ 69,  58, 100,  90, 130, 100, 100, 126,  91, 107, 104,  58]])

Calcolo della precipitazione media mensile (lungo gli anni)

Calcolare la lista means_per_month delle precipitazioni medie di ogni mese.

NOTA BENE: means_per_month[i] è la media relativa al mese months[i].


In [20]:
means_per_month = [compute_mean(rains_of_a_month) for rains_of_a_month in rains_per_month]

In [21]:
means_per_month


Out[21]:
[66.42857142857143,
 60.42857142857143,
 83.28571428571429,
 88.28571428571429,
 123.42857142857143,
 110.28571428571429,
 105.85714285714286,
 126.85714285714286,
 91.14285714285714,
 108.42857142857143,
 111.0,
 58.285714285714285]

Costruire la lista means_per_month_tuples di 12 tuple di dimensione 2 in cui ogni tupla contiene le prime tre lettere del nome del mese in maiuscolo come primo elemento e la relativa media lungo gli anni come secondo elemento.


In [22]:
means_per_month_tuples = [(months[i][0:3].upper(), means_per_month[i]) for i in range(len(months))]

In [23]:
means_per_month_tuples


Out[23]:
[('GEN', 66.42857142857143),
 ('FEB', 60.42857142857143),
 ('MAR', 83.28571428571429),
 ('APR', 88.28571428571429),
 ('MAG', 123.42857142857143),
 ('GIU', 110.28571428571429),
 ('LUG', 105.85714285714286),
 ('AGO', 126.85714285714286),
 ('SET', 91.14285714285714),
 ('OTT', 108.42857142857143),
 ('NOV', 111.0),
 ('DIC', 58.285714285714285)]

Calcolo della precipitazione totale per ognuno degli anni considerati

Calcolare la lista tot_per_year delle piogge totali di ogni anno.

NOTA BENE: tot_per_year[i] è la media relativa al mese years[i].


In [24]:
tot_per_year = [sum(rains_of_a_year) for rains_of_a_year in rains_per_year]

In [25]:
tot_per_year


Out[25]:
[1148, 1154, 1084, 1113, 1169, 1135, 1133]

Costruire la lista tot_per_year_tuples di N tuple di dimensione 2 in cui ogni tupla contiene l'anno come primo elemento e la relativa precipitazione totale come secondo elemento.


In [26]:
tot_per_year_tuples = [(years[i], tot_per_year[i]) for i in range(len(years))]

In [27]:
tot_per_year_tuples


Out[27]:
[('2009', 1148),
 ('2010', 1154),
 ('2011', 1084),
 ('2012', 1113),
 ('2013', 1169),
 ('2014', 1135),
 ('2015', 1133)]

Calcolo del numero di mesi con almeno p mm di pioggia per ognuno degli anni considerati

Calcolare la lista count_per_year del numero di mesi con almeno p mm di pioggia.

NOTA BENE: count_per_year[i] è numero di mesi con pioggia almeno p mm relativo all'anno year[i].


In [28]:
count_per_year = [count_elements_greater_than(rains_per_year[i], p) for i in range(len(rains_per_year))]

In [29]:
count_per_year


Out[29]:
[6, 5, 6, 6, 5, 6, 7]

Costruire la lista count_per_year_tuples di N tuple di dimensione 2 in cui ogni tupla contiene l'anno come primo elemento e il relativo numero di mesi con almeno p mm di pioggia come secondo elemento.


In [30]:
count_per_year_tuples = [(years[i], count_per_year[i]) for i in range(len(years))]

In [31]:
count_per_year_tuples


Out[31]:
[('2009', 6),
 ('2010', 5),
 ('2011', 6),
 ('2012', 6),
 ('2013', 5),
 ('2014', 6),
 ('2015', 7)]