I dati che i nostri modelli di machine learning andranno ad analizzare verranno salvati in un file *.csv e non all’interno di un database mysql. Questa scelta è legata al fatto che utilizzeremo la libreria Pandas in Python per importare i dati direttamente dal file prima di essere elaborati.
L’obiettivo è quello di utilizzare i dati raccolti dalla nostra stazione meteo costruita seguendo la guida Come realizzare una stazione meteo per effettuare delle previsioni. Sarete comunque liberi di utilizzare altre fonti di dati disponibili anche online per rendere il vostro progetto più affidabile.
Come anticipato nell’introduzione, i dati che andremo ad analizzare saranno i seguenti:
- temperatura massima giornaliera;
- temperatura minima giornaliera;
- umidità massima giornaliera;
- umidità minima giornaliera;
- pressione massima giornaliera;
- pressione minima giornaliera;
- variazione di pressione giornaliera (pressione massima – pressione minima);
- precipitazioni cumulate giornaliere.
Il file denominato dati_machine_learning.csv in cui archiviamo le informazioni utili ad addestrare i modelli di machine learning avrà la struttura rappresentata nell’immagine seguente:

Ogni riga riassume quindi i valori di una giornata rilevati dalla stazione meteo.
Nel capitolo della guida Come realizzare una stazione meteo – PARTE 5/6: inviare i dati al database mysql abbiamo visto come la stazione meteo invia i dati al database mysql tramite una pagina web denominata aggiungi.php. Possiamo sfruttare questa pagina aggiungendo una piccola parte di codice che andrà a popolare anche il file *.csv contenente i dati per l’addestramento del machine learning.
Analizziamo ora il codice che abbiamo integrato rispetto a quanto già visto, ma tranquilli che al termine di questo articolo sarà possibile scaricare liberamente il file completo della pagina web.
Innanzitutto il programma si occupa di aprire il file dati_machine_learning.csv che si deve trovare nella stessa directory della pagina web aggiungi.php. Tutte le righe vengono quindi salvate nell’array $righe[] ed il file viene chiuso.
$handle = fopen("dati_machine_learning.csv", "r"); //apre in sola lettura il file e posiziona il puntatore all'inizio del file
//file csv deve essere nella stessa directory del file php
while($dati = fgetcsv($handle)) { //salva tutte le righe del file csv nell'array $righe
$righe[] = implode('', $dati);
}
fclose($handle); //chiude il file csv
Prima di procedere con il caricamento dei dati dobbiamo recuperare l’ultima data inserita nel file dati_machine_learning.csv e la prossima data da inserire per effettuare l’operazione solo se necessario:
//recupero dell'ultima data inserita nel file csv e della prossima data da aggiungere
$ultimarigacsv = $righe[count($righe)-1];
$ultimadatainserita = substr($ultimarigacsv, 0, 8);
$ultimadatainseritaformattata = date ("d-m-Y", strtotime(substr($ultimadatainserita, 0, 4).'-'.substr($ultimadatainserita, 4, 2).'-'.substr($ultimadatainserita, 6, 2)));
$prossimadatadainserireformattata = date ("d-m-Y", strtotime(date("Y-m-d", time())." -1 day"));
Tutto il codice mostrato d’ora in avanti in questo capitolo verrà quindi eseguito solo se la seguente condizione sarà vera:
if ($ultimadatainseritaformattata <> $prossimadatadainserireformattata) {
}
Procediamo con il recuperare dal database mysql, in cui la stazione meteo salva tutti i dati raccolti, tutte le informazioni che vogliamo caricare nel file dati_machine_learning.csv:
//data da inserire
$datadainserire= date ("Ymd", strtotime(date("Y-m-d", time())." -1 day"));
//temperatura massima giorno corrente
$query = mysqli_query($con, "SELECT max(temperatura) FROM `stazione_meteo` WHERE DATE(time_stamp) = DATE_FORMAT(NOW() - INTERVAL 1 DAY,'%Y-%m-%d')");
$temperaturamaxoggiarray = mysqli_fetch_array($query);
$temperaturamaxoggi=round(floatval($temperaturamaxoggiarray['0']), 2);
//temperatura minima giorno corrente
$query = mysqli_query($con, "SELECT min(temperatura) FROM `stazione_meteo` WHERE DATE(time_stamp) = DATE_FORMAT(NOW() - INTERVAL 1 DAY,'%Y-%m-%d')");
$temperaturaminoggiarray = mysqli_fetch_array($query);
$temperaturaminoggi=round(floatval($temperaturaminoggiarray['0']), 2);
//umidità massima giorno corrente
$query = mysqli_query($con, "SELECT max(umidita) FROM `stazione_meteo` WHERE DATE(time_stamp) = DATE_FORMAT(NOW() - INTERVAL 1 DAY,'%Y-%m-%d')");
$umiditamaxoggiarray = mysqli_fetch_array($query);
$umiditamaxoggi=round(floatval($umiditamaxoggiarray['0']), 2);
//umidità minima giorno corrente
$query = mysqli_query($con, "SELECT min(umidita) FROM `stazione_meteo` WHERE DATE(time_stamp) = DATE_FORMAT(NOW() - INTERVAL 1 DAY,'%Y-%m-%d')");
$umiditaminoggiarray = mysqli_fetch_array($query);
$umiditaminoggi=round(floatval($umiditaminoggiarray['0']), 2);
//pressione massima giorno corrente
$query = mysqli_query($con, "SELECT max(pressione) FROM `stazione_meteo` WHERE DATE(time_stamp) = DATE_FORMAT(NOW() - INTERVAL 1 DAY,'%Y-%m-%d')");
$pressionemaxoggiarray = mysqli_fetch_array($query);
$pressionemaxoggi=round(floatval($pressionemaxoggiarray['0']), 2);
//pressione minima giorno corrente
$query = mysqli_query($con, "SELECT min(pressione) FROM `stazione_meteo` WHERE DATE(time_stamp) = DATE_FORMAT(NOW() - INTERVAL 1 DAY,'%Y-%m-%d')");
$pressioneminoggiarray = mysqli_fetch_array($query);
$pressioneminoggi=round(floatval($pressioneminoggiarray['0']), 2);
//delta pressione giorno corrente
$delta_pressione = round(floatval($pressionemaxoggi - $pressioneminoggi), 2);;
//precipitazioni cumulate giorno corrente
$query = mysqli_query($con, "SELECT SUM(precipitazioni) from stazione_meteo WHERE DATE(time_stamp) = DATE_FORMAT(NOW() - INTERVAL 1 DAY,'%Y-%m-%d')");
$precipitazionicumulateoggiarray = mysqli_fetch_array($query);
$precipitazionicumulateoggi=round(floatval($precipitazionicumulateoggiarray['0']), 2);
A questo punto non ci rimane altro che aprire il file dati_machine_learning.csv, posizionarci col puntatore alla fine del file, aggiungere la nuova riga e chiudere il file:
$handle = fopen("dati_machine_learning.csv", "a"); //apre in sola scrittura il file csv e posiziona il puntatore alla fine del file
//file csv deve essere nella stessa directory del file php
$dati = [$datadainserire, $temperaturamaxoggi, $temperaturaminoggi, $umiditamaxoggi, $umiditaminoggi, $pressionemaxoggi, $pressioneminoggi, $delta_pressione, $precipitazionicumulateoggi]; // array di dati da aggiungere
fputcsv($handle, $dati, ';'); //aggiunge la riga nel file csv
fclose($handle); //chiude il file csv
Le righe di codice da aggiungere al file aggiungi.php sono state molto semplici e basilari: abbiamo verificato se le informazioni nel file dati_machine_learning.csv sono già state aggiornate ed in caso contrario abbiamo recuperato i valori dal database mysql ed aggiunto la nuova riga alla fine del file.
Ricordiamo che il file aggiungi.php viene eseguito dalla stazione meteo ogni 10 minuti per salvare i nuovi valori rilevati, ma la nuova parte di codice verrà eseguita dalla pagina web solo una volta al giorno per aggiungere i dati relativi alla nuova giornata.
Il file contenente il codice completo è disponibile cliccando qui ma ricordate di modificare i valori relativi alla vostra rete wifi ed al vostro sito web che ospita la pagina aggiungi.php.
