La pioggia predice la pioggia? Dati meteo degli Stati Uniti e la correlazione tra la pioggia oggi e domani

Rain predicts rain? US weather data and correlation between today's and tomorrow's rainfall

Presentazione di utili set di dati climatici e convalida di una previsione sul riscaldamento globale

Foto di Wim van ’t Einde su Unsplash

Sommario

Durante un periodo piovoso di giugno e luglio a Boston, sembrava piovere ogni volta che la mia famiglia aveva pianificato qualcosa di divertente. Abbiamo cominciato a chiederci se fossimo bloccati in un periodo piovoso e ci siamo chiesti: “Il fatto che abbia piovuto molto per tre giorni di fila, rende probabile che piova domani?” Mi sono reso conto che questa domanda è facile da rispondere utilizzando i dati meteorologici disponibili.

Questo articolo presenta i set di dati meteorologici degli Stati Uniti che ho utilizzato, il programma Python/pandas che ho scritto per analizzare i dati e i risultati. In breve, sì, un periodo di giorni piovosi predice fortemente ulteriori piogge. E, sorprendentemente, più lungo è il periodo di pioggia, più probabile è che piova il giorno successivo. I risultati confermano anche una previsione dei modelli di riscaldamento globale: ora c’è più pioggia rispetto agli anni precedenti.

Dati

Ci sono due set di dati chiave sulla pioggia provenienti dall’Amministrazione Oceanica e Atmosferica degli Stati Uniti (NOAA). Ho utilizzato i dati sulla precipitazione oraria (HPD). La pagina di descrizione è generalmente utile, ma il link al set di dati è errato e punta a una versione più vecchia. Il nuovo set di dati è qui e copre il periodo dal 1940 al 2022. (I dati del 2023 verranno aggiunti.) HPD ha una granularità fine con quantità di precipitazioni orarie provenienti da oltre 2000 stazioni di rilevamento negli Stati Uniti. I file di dati contengono tutti gli anni per una stazione in ogni file CSV. Ho utilizzato solo i totali giornalieri, ma le informazioni orarie potrebbero essere utili per analisi future.

Cosa succede quando nevica invece di piovere? L’accumulo di neve viene fuso per trovare la quantità equivalente di pioggia. Quindi tutti i dati in HPD includono pioggia liquida, neve fusa e tutto ciò che sta nel mezzo, come neve sporca e grandine.

C’è un altro set di dati prezioso chiamato Dati Climatologici Locali (LCD) che potrebbe essere utilizzato per una analisi simile. LCD contiene molte più informazioni oltre alla precipitazione e include anche temperatura, alba/tramonto, pressione atmosferica, visibilità, velocità del vento, nebbia, fumo, sintesi mensili e altro ancora. LCD viene aggiornato quotidianamente, quindi contiene i dati di ieri. Per utilizzarlo è necessario decodificare i numeri delle stazioni del Dataset Integrato della Superficie (ISD).

Programma di analisi

Il programma di analisi della pioggia è scritto in Python/pandas. Ho scritto il codice in modo leggibile, ma vale la pena esplorare alcune caratteristiche specifiche.

Il programma può leggere l’elenco completo delle stazioni HPD o un elenco specifico di stazioni da un file di testo. Questa funzionalità viene utilizzata per eseguire nuovamente il programma con vari parametri, assicurandosi di utilizzare le stesse stazioni di una precedente esecuzione.

from rain_helpers import ALL_STATION_FILESSTATION_LIST_INPUT = "/Users/chuck/Desktop/Articles/hpd_stations_used_list_1940-1950.txt"ALL_STATIONS = True  # utilizzare tutte le stazioni o un elenco specifico?# Scegliere se utilizzare tutte le stazioni conosciute o un elenco specifico di stazioni (di solito da una precedente esecuzione di questo programma)if (ALL_STATIONS):    station_files = ALL_STATION_FILESelse:    with open(STATION_LIST_INPUT, 'r') as fp:          data = fp.read()        station_files = data.split("\n")        fp.close()

Un’altra funzionalità utile è la possibilità di scegliere un sottoinsieme dei file delle stazioni. È possibile eseguire il codice molto velocemente con 1/100 delle stazioni per il debug, o qualcosa come 1/3 per un’approssimazione accurata dei risultati. Secondo la legge dei grandi numeri, i miei test con 1/3 (circa 600 stazioni) hanno prodotto risultati quasi identici all’intero set di dati.

SKIP_COUNT = 3 # 1 = non saltare nessuno.for i in range (0, len(station_files), SKIP_COUNT):        station_url = HPD_LOCAL_DIR + station_files[i]     stationDF = pd.read_csv(station_url, sep=',', header='infer', dtype=str)

Un altro miglioramento in termini di velocità consiste nel scaricare tutti i file delle stazioni sul proprio computer locale, in modo da non doverli recuperare da NOAA ogni volta. L’intero set di dati è di circa 20 GB. Se non si dispone di questo spazio extra, il codice funziona bene anche durante la lettura dal cloud.

HPD_CLOUD_DIR = "https://www.ncei.noaa.gov/data/coop-hourly-precipitation/v2/access/"  # Dati di precipitazione oraria (HPD)
HPD_LOCAL_DIR = "/Users/chuck/Desktop/Articles/NOAA/HPD/"station_url = HPD_LOCAL_DIR + station_files[i]  # passa da locale a cloud

La parte più complicata del codice è il controllo retroattivo su ogni data per verificare se è piovuto per un periodo di giorni precedenti. Il problema è che i dati da cercare sono nello stesso DataFrame, un self-join. È tentante utilizzare un ciclo sul DataFrame e, per ogni riga, cercare le date precedenti man mano. Ma i cicli su strutture dati di grandi dimensioni sono considerati uno stile di programmazione inefficiente in qualsiasi linguaggio di programmazione, soprattutto con pandas. Il mio codice risolve questo problema facendo uno snapshot del DataFrame, creando campi su ogni riga che contengono le nove date precedenti (e una per domani) e utilizzando questi campi per unirsi allo snapshot.

    # Prendi uno snapshot per un self-join successivo. Modifica i nomi dei campi per evitare confusione dopo la join.    stationCopyDF = stationDF    stationCopyDF = stationCopyDF[["STATION","DATA","DlySumOggi"]]  # mantieni solo ciò di cui abbiamo bisogno    stationCopyDF = stationCopyDF.rename({"DlySumOggi":"DlySumAltro", "DATA":"DATAaltro"}, axis='columns')      # Aggiungi altre date, per le quali estrarrmo la pioggia.    stationDF["DATA_meno9"] = stationDF["DATA"] - pd.offsets.Day(9)    stationDF["DATA_meno8"] = stationDF["DATA"] - pd.offsets.Day(8)    ...    stationDF["DATA_meno1"] = stationDF["DATA"] - pd.offsets.Day(1)    stationDF["DATA_piu1"] = stationDF["DATA"] + pd.offsets.Day(1)    # Unisci altre precipitazioni al record di base. Modifica i nomi delle colonne per rendere chiaro ciò che abbiamo fatto.    stationDF = stationDF.merge(stationCopyDF, how='inner', left_on=["STATION","DATA_meno9"], right_on = ["STATION","DATAaltro"])    stationDF = stationDF.rename({"DlySumAltro":"DlySum9GiorniFa"}, axis='columns')      stationDF = stationDF.drop(columns=["DATAaltro"])    stationDF = stationDF.merge(stationCopyDF, how='inner', left_on=["STATION","DATA_meno8"], right_on = ["STATION","DATAaltro"])    stationDF = stationDF.rename({"DlySumAltro":"DlySum8GiorniFa"}, axis='columns')      stationDF = stationDF.drop(columns=["DATAaltro"])    ....        stationDF = stationDF.merge(stationCopyDF, how='inner', left_on=["STATION","DATA_meno1"], right_on = ["STATION","DATAaltro"])    stationDF = stationDF.rename({"DlySumAltro":"DlySum1GiornoFa"}, axis='columns')      stationDF = stationDF.drop(columns=["DATAaltro"])    stationDF = stationDF.merge(stationCopyDF, how='inner', left_on=["STATION","DATA_piu1"], right_on = ["STATION","DATAaltro"])    stationDF = stationDF.rename({"DlySumAltro":"DlySumDomani"}, axis='columns')      stationDF = stationDF.drop(columns=["DATAaltro"])

Dopo aver ottenuto le precipitazioni dei giorni precedenti su ogni riga, il codice trova facilmente la durata di ogni periodo di pioggia. Si noti che quando si calcola da quanti giorni piove, anche oggi viene contato come un giorno.

    stationDF["GiorniDiPioggia"] = 0       stationDF.loc[(stationDF["DlySumOggi"] >= PIOGGIA), "GiorniDiPioggia"] = 1    stationDF.loc[(stationDF['DlySumOggi'] >= PIOGGIA) & (stationDF['DlySum1GiornoFa'] >= PIOGGIA), 'GiorniDiPioggia'] = 2    stationDF.loc[(stationDF['DlySumOggi'] >= PIOGGIA) & (stationDF['DlySum1GiornoFa'] >= PIOGGIA) & (stationDF['DlySum2GiorniFa'] >= PIOGGIA), 'GiorniDiPioggia'] = 3    ... ecc

Risultati

Utilizzando gli anni dal 2000 al 2021 inclusi, ci sono 1808 stazioni con dati validi, con 8.967.394 punti dati (una data, una posizione e una quantità di pioggia).

  • La media delle precipitazioni su tutti i dati è stata di 0,0983 pollici, o circa 1/10 di pollice.
  • La percentuale di giorni di pioggia (≥ 0,5 pollici) è stata del 6,2%.
  • La percentuale di giorni secchi (≤ 0,05 pollici) è stata del 78,0%.

La risposta alla domanda originale che ha dato origine a questo progetto è,

Sì, i giorni di pioggia predicono la pioggia di domani. Più a lungo piove (fino a 8 giorni), più probabile è che piova di nuovo.

E un risultato correlato…

I giorni di pioggia predicono quanto sarà intensa la pioggia prevista per domani. Più a lungo piove (fino a 7 giorni), più probabile è che domani ci sia più pioggia.

Due grafici mostrano questo risultato.

Probabilità di pioggia domani vs giorni di pioggia (immagine di Autore)
Quantità di pioggia domani vs giorni di pioggia (immagine di Autore)

Ho sperimentato con diverse impostazioni per “giorno di pioggia”, cambiandola da 0,5 pollici a 0,75 e 1,0. Questi cambiamenti mostrano lo stesso fenomeno generale di giorni di pioggia che predicono più pioggia, ma senza una correlazione perfetta fino a otto giorni. La definizione di “giorni di pioggia” come 0,5 pollici sembra essere il punto di forza per prevedere la pioggia di domani.

Potresti chiederti dove potrebbe piovere per dieci giorni di seguito. In 22 anni in tutti gli Stati Uniti, con quasi nove milioni di dati, ci sono stati solo 118 periodi di tale clima. Alcuni dei luoghi erano: Boca Raton, FL; San Juan, PR; Kahuna Falls, HI; Kaumana, HI; Kihalani, HI; Paakea, HI; Pascagoula, MS; Quinault, WA; e Quilcene, WA.

I giorni consecutivi di siccità (< 0,05 pollici di pioggia) correlano anche bene con la siccità del giorno successivo, ma la previsione non è così forte perché le probabilità di una giornata asciutta domani sono molto simili tra loro. La probabilità di una giornata asciutta domani è sempre vicina alla media complessiva del 78%.

I giorni consecutivi di siccità sono leggermente migliori nel prevedere la quantità di pioggia prevista per il giorno successivo.

Quantità di pioggia domani vs giorni di siccità (immagine di Autore)

Cambiamento climatico

Una domanda ovvia correlata è se i risultati descritti qui siano cambiati con l’aumento della temperatura della Terra a causa del cambiamento climatico. Ho eseguito la stessa analisi sui dati degli Stati Uniti dal 1940 al 1960, dal 1960 al 1980 e dal 1980 al 2000.

Il risultato centrale è lo stesso: i giorni di pioggia predicono più pioggia. I numeri esatti sono leggermente diversi in ciascun periodo di tempo, ma la forte correlazione non cambia. Ad esempio, dal 1960 al 1980, c’erano 1388 stazioni con dati validi e 6.807.917 punti dati, con questi risultati:

Frazione di giorni di pioggia dopo 1 giorno di pioggia = 17,3%Frazione di giorni di pioggia dopo 2 giorni di pioggia = 19,6%Frazione di giorni di pioggia dopo 3 giorni di pioggia = 27,4%Frazione di giorni di pioggia dopo 4 giorni di pioggia = 37,1%Frazione di giorni di pioggia dopo 5 giorni di pioggia = 43,8%Frazione di giorni di pioggia dopo 6 giorni di pioggia = 51,5%Frazione di giorni di pioggia dopo 7 giorni di pioggia = 52,4%

Un corollario più importante, previsto dai modelli di cambiamento climatico, è che man mano che la Terra si riscalda, pioverà di più. Il dataset HPD può verificarlo, almeno negli ultimi 80 anni.

L’approccio semplice sarebbe prendere tutte le stazioni meteorologiche attuali (circa 2000) e guardare i dati sulle precipitazioni durante ogni decennio. Ma c’è un potenziale pregiudizio nel farlo. Ci sono più stazioni meteorologiche ora rispetto al 1940, dato che le stazioni sono state gradualmente aggiunte negli ultimi 80 anni. È possibile che le stazioni più recenti siano state costruite in luoghi piovosi. In tal caso, i dati più recenti mostrerebbero più pioggia, ma solo perché l’insieme complessivo delle stazioni è più umido rispetto all’insieme del 1940.

Un approccio più accurato consiste nel trovare l’insieme di stazioni che avevano dati sulle precipitazioni negli anni ’40 e utilizzare le stesse stazioni per ogni decennio. Il mio programma può farlo perché emette l’elenco delle stazioni effettivamente utilizzate in ogni esecuzione. Quindi ho trovato dati per gli anni 1940-1950 e poi ho riutilizzato l’elenco di stazioni emesso nuovamente per gli anni 1950-1960, poi 1960-1970, ecc. Si tratta di circa 840 stazioni con tra 400K e 2.5M punti dati nei vari decenni.

La precipitazione media in ogni decennio dovrebbe essere molto vicina – di nuovo secondo la legge dei grandi numeri. Ma il grafico qui sotto mostra una pioggia significativamente aumentata sullo stesso insieme di stazioni. Questo è un risultato notevole a sostegno di una predizione chiave dei modelli di riscaldamento globale.

Pioggia media vs Decennio (immagine di Autore)

Per ulteriori informazioni

https://www.weather.gov/rah/virtualtourlist – Come il servizio meteorologico nazionale degli Stati Uniti fa previsioni.

https://www.ncdc.noaa.gov/cdo-web/datasets – Panoramica dei dataset dell’amministrazione oceanica e atmosferica degli Stati Uniti.

https://www.epa.gov/climate-indicators/climate-change-indicators-us-and-global-precipitation – Rapporto dell’Agenzia per la protezione dell’ambiente degli Stati Uniti sull’aumento delle precipitazioni causato dai cambiamenti climatici.