SUMÁRIO
  1. A pergunta e a referência
  2. Fontes de dados
  3. Por que esta série
  4. O quirk da API: 12 CSVs para uma série mensal
  5. Código: download e consolidação
  6. Código: gráfico mensal em estilo vintage
  7. Como reproduzir
  8. Limitações e ressalvas
  9. Pontos frágeis desta demonstração

1. A pergunta e a referência

O ar mais quente tem a capacidade de carregar mais vapor d'água (≈ 7% por °C, pela equação de Clausius–Clapeyron)? A expectativa dos aquecimentistas é a intensificação progressiva do ciclo hidrológico — chuvas mais fortes, secas mais agudas, e, em média, mais milímetros caindo no agregado global.

Esta demonstração não testa cada uma dessas predições. Olha apenas para a curva mais simples e direta: quanta chuva, em média, cai sobre o planeta em cada mês, desde que existem satélites para medir? A resposta, na série do próprio NOAA, é desconfortavelmente plana — e essa planura é o que o gráfico do Climate4you exibe há anos. Aqui reproduzimos a mesma série a partir da fonte original.

2. Fontes de dados

Uma única série pública, hospedada pelo NOAA NCEI (National Centers for Environmental Information — antigo NCDC, renomeado em 2015). É o conjunto que o próprio Climate4you cita ao pé do gráfico.

Precipitação global (terra + oceano): NOAA NCEI — Climate at a Glance: Global Time Series. Produto interno do NCEI que combina estações terrestres (base GHCN-M v4) com estimativas oceânicas. Valor em milímetros absolutos por mês, série iniciada em janeiro de 1979.
Página interativa: ncei.noaa.gov/access/monitoring/climate-at-a-glance/global/time-series

O arquivo consolidado é salvo em Data/precipitation/ncei_global_precip_monthly_1979-2026.csv dentro do projeto Plotter.

3. Por que esta série

A escolha não é arbitrária. Antes de 1979, não havia cobertura satelital sistemática sobre os oceanos — e mais de 70% da superfície do planeta é água. Toda série de precipitação global mais antiga depende fortemente de extrapolação a partir das estações terrestres, com hipóteses pesadas sobre o que acontece longe da costa. A partir de 1979, satélites de infravermelho geoestacionários e de micro-ondas em órbita polar (SSM/I, SSMIS) passaram a fornecer estimativas diretas sobre o oceano aberto.

Em outras palavras: 1979 é o ponto em que uma série de precipitação global passa a ser uma medida observacional, não um modelo estatístico. É exatamente o intervalo em que a chamada "intensificação do ciclo hidrológico" deveria aparecer com mais nitidez, porque é o intervalo de aquecimento mais rápido segundo as séries de temperatura. O quase nada que se vê é, portanto, especialmente informativo.

4. O quirk da API: 12 CSVs para uma série mensal

A API do NCEI Climate at a Glance segue o padrão de URL:

https://www.ncei.noaa.gov/access/monitoring/climate-at-a-glance/global/time-series/
    {region}/{surface}/{parameter}/{time_scale}/{end_month}/{year_range}.csv

Para o gráfico que queremos: region=globe, surface=land_ocean, parameter=pcp, time_scale=1 (um mês), year_range=1979-2026. O parâmetro end_month aceita valores de 1 a 12 — e aqui está o detalhe não-óbvio: cada CSV retorna apenas um mês do ano, repetido ao longo de toda a janela temporal. Ou seja, end_month=1 devolve "todos os janeiros de 1979 a 2026", end_month=2 devolve "todos os fevereiros", e assim por diante.

Para montar a série mensal completa precisamos baixar os 12 CSVs (um para cada mês de fim) e reorganizar em formato longo: uma coluna date, uma coluna precip_mm. É o que o script da próxima seção faz.

5. Código: download e consolidação

Script em scripts/precipitation/download_ncei_precip.py. Faz cache local em Data/precipitation/raw/ e gera o consolidado em Data/precipitation/ncei_global_precip_monthly_1979-2026.csv.

"""Download NOAA NCEI Climate at a Glance global precipitation series."""

from pathlib import Path
import time
import urllib.request
import pandas as pd

ROOT = Path(__file__).resolve().parents[2]
RAW_DIR = ROOT / "Data" / "precipitation" / "raw"
OUT_FILE = ROOT / "Data" / "precipitation" / "ncei_global_precip_monthly_1979-2026.csv"

URL = (
    "https://www.ncei.noaa.gov/access/monitoring/climate-at-a-glance/global/"
    "time-series/globe/land_ocean/pcp/1/{end_month}/1979-2026.csv"
)

def fetch_month(end_month: int) -> Path:
    out = RAW_DIR / f"ncei_cag_global_pcp_1979-2026_month{end_month:02d}.csv"
    if out.exists() and out.stat().st_size > 200:
        return out
    urllib.request.urlretrieve(URL.format(end_month=end_month), out)
    time.sleep(0.3)
    return out

def parse_month_csv(path: Path) -> pd.DataFrame:
    df = pd.read_csv(path, skiprows=2)
    df.columns = [c.strip() for c in df.columns]
    return df.rename(columns={"Value": "precip_mm"})

def main() -> None:
    RAW_DIR.mkdir(parents=True, exist_ok=True)
    frames = []
    for m in range(1, 13):
        df = parse_month_csv(fetch_month(m))
        df["month"] = m
        frames.append(df[["Year", "month", "precip_mm"]])
    full = (
        pd.concat(frames, ignore_index=True)
        .rename(columns={"Year": "year"})
        .sort_values(["year", "month"])
        .reset_index(drop=True)
    )
    full["date"] = pd.to_datetime(
        full["year"].astype(str) + "-" + full["month"].astype(str).str.zfill(2) + "-01"
    )
    full[["date", "year", "month", "precip_mm"]].to_csv(OUT_FILE, index=False)

if __name__ == "__main__":
    main()

O resultado é um CSV de 567 linhas (47 anos × 12 meses + 3 meses já disponíveis de 2026), com média do período de 81,77 mm/mês.

6. Código: gráfico mensal em estilo vintage

Script em scripts/precipitation/plot_global_precip_monthly.py. Detalhe importante: a linha não é um line plot comum, é um step plot (ax.step(..., where="mid")). Isso reproduz a aparência "geométrica" do gráfico do Climate4you — cada valor mensal vira um segmento horizontal com saltos verticais entre meses, em vez dos picos pontiagudos que um line plot tradicional produziria.

"""Plot global (land + ocean) monthly precipitation 1979 → present."""

from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

ROOT = Path(__file__).resolve().parents[2]
DATA_FILE = ROOT / "Data" / "precipitation" / "ncei_global_precip_monthly_1979-2026.csv"
OUT_DIR = ROOT / "plots" / "Eventos extremos" / "Precipitacao"
STYLE = ROOT / "vintage.mplstyle"

plt.style.use(str(STYLE))

df = pd.read_csv(DATA_FILE, parse_dates=["date"]).sort_values("date").reset_index(drop=True)
mean_val = df["precip_mm"].mean()

t_years = df["date"].dt.year + (df["date"].dt.month - 1) / 12
slope, intercept = np.polyfit(t_years, df["precip_mm"], 1)
trend_line = slope * t_years + intercept

fig, ax = plt.subplots(figsize=(11, 5.5))
ax.step(df["date"], df["precip_mm"], where="mid", color="black", linewidth=0.7)
ax.axhline(mean_val, color="black", linestyle=":", linewidth=0.8)
ax.plot(df["date"], trend_line, color="black", linestyle="--", linewidth=0.8)

ax.set_xlim(pd.Timestamp("1979-01-01"), pd.Timestamp("2026-12-31"))
ax.set_ylim(60, 100)

year_ticks = pd.to_datetime([f"{y}-01-01" for y in range(1980, 2030, 5)])
ax.set_xticks(year_ticks)
ax.set_xticklabels([t.year for t in year_ticks])
ax.set_yticks(range(60, 105, 5))

ax_top = ax.secondary_xaxis("top")
ax_top.set_xticks(year_ticks)
ax_top.set_xticklabels([t.year for t in year_ticks])
ax_right = ax.secondary_yaxis("right")
ax_right.set_yticks(range(60, 105, 5))

ax.set_ylabel("Monthly precipitation (mm)")
ax.set_title(
    "Global (land and ocean) monthly precipitation, 1979–2026\n"
    "Source: NOAA NCEI (Climate at a Glance)",
    fontsize=12,
)
ax.text(
    0.5, 0.08,
    f"Period mean = {mean_val:.2f} mm/month   |   "
    f"Linear trend = {slope:+.3f} mm/year",
    transform=ax.transAxes,
    ha="center", va="bottom", fontsize=10,
)

OUT_DIR.mkdir(parents=True, exist_ok=True)
out = OUT_DIR / "global_land_ocean_monthly_precip_1979-2026.png"
fig.tight_layout()
fig.savefig(out, dpi=300, bbox_inches="tight")
Precipitação global mensal terra+oceano 1979-2026 — resultado esperado
Resultado esperado. Precipitação global mensal sobre terra e oceanos, janeiro de 1979 a março de 2026. Linha pontilhada: média do período (81,77 mm/mês). Linha tracejada: tendência linear (+0,001 mm/ano). Eixo Y em milímetros absolutos. A série mostra a variabilidade sazonal típica do ciclo hidrológico — entre ~72 e ~88 mm/mês — sobre um nível médio que permanece notavelmente estável ao longo dos 47 anos da era satelital.

7. Como reproduzir

# Pré-requisitos
pip install pandas matplotlib numpy

# Estrutura esperada (já existe no repo Plotter)
Plotter/
+-- Data/
|   +-- precipitation/
|       +-- raw/                    # cache dos 12 CSVs brutos
+-- scripts/
|   +-- precipitation/
|       +-- download_ncei_precip.py
|       +-- plot_global_precip_monthly.py
+-- plots/
|   +-- Eventos extremos/
|       +-- Precipitacao/
+-- vintage.mplstyle

# Executar a partir da raiz do projeto
cd Plotter
python scripts/precipitation/download_ncei_precip.py
python scripts/precipitation/plot_global_precip_monthly.py

# Saída gerada:
#   plots/Eventos extremos/Precipitacao/global_land_ocean_monthly_precip_1979-2026.png

8. Limitações e ressalvas

  • Janela de 47 anos é curta para "clima". A definição clássica da OMM trata clima a partir de janelas de 30 anos. Temos pouco mais de uma janela e meia. Tendências em séries curtas dependem fortemente dos pontos terminais — é possível que o "futuro próximo" mostre algo diferente.
  • Precipitação global agregada esconde redistribuição regional. O total planetário pode permanecer constante enquanto algumas regiões secam e outras se inundam. Esta figura não diz nada sobre o que acontece no Sahel, no Cerrado ou na Califórnia — só sobre a soma.
  • Não há comparação com séries alternativas. GPCP v3.2, ERA5, MERRA-2 e CMAP exibem trajetórias ligeiramente diferentes em valores absolutos. As tendências de todas elas são pequenas, mas não idênticas. Esta demonstração documenta apenas o produto do NCEI.

9. Pontos frágeis desta demonstração

Três aspectos da reprodução merecem ser explicitados — não para invalidá-la, mas para que ninguém a leia além do que ela diz.

9.1 O produto "NCEI Global Precipitation" é uma combinação, não uma medida única

Sobre terra, a série é dominada por GHCN-M v4 (estações de superfície interpoladas). Sobre oceano, depende de estimativas satelitais e de produtos derivados. As fronteiras entre essas duas porções do globo carregam descontinuidades metodológicas que a série mensal agregada não revela. O número "81,77 mm/mês" é uma média ponderada de objetos heterogêneos.

9.2 A tendência linear não é o teste estatístico apropriado

Ajustar uma reta a 567 pontos com forte autocorrelação sazonal subestima o erro padrão da tendência. O valor "+0,001 mm/ano" é mais ilustrativo que conclusivo. Um teste sério usaria modelo de séries temporais (ARIMA, decomposição STL) ou comparação com simulações Monte Carlo de séries com a mesma estrutura de autocorrelação.

9.3 "Plano" não é o mesmo que "não há mudança no ciclo hidrológico"

Se o argumento da intensificação envolve, por exemplo, mais eventos extremos com volume médio inalterado — ou intensificação local com compensação em outras regiões — uma série global de média mensal em milímetros simplesmente não testa essa hipótese. A figura responde uma pergunta restrita: o total global, em média, mudou? A resposta é "não detectavelmente". Outras perguntas precisam de outras métricas.

Tem uma sugestão melhor? Se você consegue propor outra forma de visualizar a precipitação global desde 1979 — outro produto (GPCP, CMAP, ERA5), outro recorte temporal, ou um teste estatístico formal sobre a tendência — escreva para statisticsreal1@gmail.com. Críticas técnicas são exatamente o que esta seção espera receber.