Archived release 2026-10-09.4 (2026-10-09): the page as published then (code d932d97). Current release · Change log
Research reconstruction · not an official EMI or ICPAC forecast

Seasonal rainfall outlook

Research reconstruction · not an official forecast

Average local probability

Rainfall amount

Forecast signal

Historical skill

Signal strength describes how far this forecast's probabilities depart from climatology. Historical skill describes how forecasts made the same way scored in past years. A strong signal is not a confidence rating.

All targets in this cycle

Comparison with official outlooks

Cycle status and record

Maps

Open full-size Download PNG

How to read this map

Grey, white and blank areas

Light grey: outside the selected area. Dark grey: inside the area but without values, for example cells where reference-period rainfall is too small for tercile categories, or (percent maps) below 10 mm. White on tercile maps: no category reaches 40%, or two categories tie. Sea cells have no CHIRPS data.

Smoothing and resolution. Maps are drawn on a 12× finer display grid with light Gaussian smoothing (σ = 0.6 grid cells); all numbers on this page use the original 0.25° grid. The model's own resolution is about 1°: each model cell covers 4×4 grid cells, so detail within a 1° box comes from local CHIRPS rainfall statistics used in the amount correction, not from the model.

Verification

Frozen forecasts compared with official CHIRPS v2.0 observations once a target period is complete. Each result is one season or month, so it shows what happened this time, not long-term reliability.

Historical performance

How forecasts made with the same method scored in past years against climatology (the observed frequency of each tercile in the training years, about one-third each). The main number is the cross-validated 1993–2016 score: each year is forecast with parameters fitted without that year. Later years are exploratory: they were seen while the method was chosen.

Historical verification explorer

The evidence behind the scores above, for the selected cycle, target and area. Choose the evaluation period; all diagnostics use the blended probabilities against climatology.

Historical performance by rainfall region

Methods & data

In brief

Each cycle starts from the ECMWF SEAS5 seasonal ensemble issued on the 1st of the initialization month. For every 0.25° grid cell in Ethiopia the forecast rainfall is corrected toward the CHIRPS observed mean and variability, then turned into tercile probabilities (below, near or above normal relative to the cycle's CHIRPS reference period). The probabilities are finally blended with climatology using one weight per target, chosen to give the best past scores. Climatology assigns approximately one-third probability to each tercile; the calculations use the observed category frequencies of the training reference period.

Probabilities and amounts are produced separately: the probability skill (RPSS) on this site refers to the blended probabilities, and the rainfall amount skill (CRPSS) to the amount-corrected ensemble.

The raw benchmark is the uncorrected model: raw ECMWF members counted against each cell's CHIRPS tercile limits, with no correction, smoothing or blend. For May-initialized JJAS over 2017–2025 it scores RPSS −0.41, far below climatology, which is why calibration is needed.

Data

Data sources
SourceDetails
ECMWF SEAS5Copernicus CDS seasonal-original-single-levels, system 51, total precipitation, 1993 to the forecast year; 25 members to 2016, 51 from 2017; 1° grid
CHIRPS v2.00.25° daily rainfall; archive 1993–2025; verification months from the official monthly files, checked against the archive where they overlap
AreasAll Ethiopia (1,484 cells) and one rainfall domain per season, built from rainfall regimes: FMAM R2 (Belg), JJAS R1+R2, ONDJ R3 (Deyr). The domains are for display and summaries only; calibration uses every cell.
Workflow (eight scripted stages)
  1. 1

    Download

    ECMWF SEAS5 (system 51) daily accumulated precipitation from the Copernicus CDS for the initialization month, 1993 to the forecast year.

    download_seasonal_forecasts_daily_c3s.py
  2. 2

    Inspect

    Inventory every year: initialization, lead times, member counts and accumulation increments (GRIB packing tolerance 0.2 mm).

    inspect_inputs.py
  3. 3

    Prepare

    De-accumulate to daily totals, sum the season and each month; CHIRPS on the same dates.

    prepare_seasonal.py · run_monthly.py
  4. 4

    Regrid

    Each 1° model cell is copied into its 4×4 block of 0.25° CHIRPS cells (no interpolation).

    regrid_seasonal.py
  5. 5

    Calibrate

    Per-cell amount correction, smoothed tercile counts and one climatology-blend weight per target.

    final_shared_blend.py
  6. 6

    Evaluate

    Nested cross-validation 1993–2016; exploratory fixed-fit scores for later years; whole-year significance tests.

    local_blend.py · decision_gates.py
  7. 7

    Deliver

    Maps, summaries and an offline gallery; forecasts frozen with SHA-256 hashes before observations are used.

    run_operational.py · build_season_products.py
  8. 8

    Verify

    Official CHIRPS v2.0 monthly files, checked against the archive where they overlap, scored per month and season.

    prepare_verification_2026.py · verify_frozen_2026.py

Every stage is a script in scripts/; documents in docs/ record each step, issue and decision (runbook: docs/38; per-season guides: docs/40).

Equations
  1. Amount correction per cell, equal weight per year: x̂ = max(0, μobs + r·(x − μmodel)), r = clip(σobs/σmodel, 0.5, 2)
  2. Tercile probabilities from the corrected members against CHIRPS tercile limits, smoothed: (n + 0.5)/(M + 1.5)
  3. Climatology blend: pfinal = (1 − λ)·pmodel + λ·pclimatology, with one λ per target fitted on leave-one-year-out RPS.
    pclimatology is, for each grid cell, the observed frequency of each tercile in the training reference years (about one-third each; it differs slightly because of sample size, category limits and ties).
  4. Skill score: RPSS = 1 − RPSforecast / RPSclimatology; RPSS +0.05 means a 5% lower ranked probability score than climatology. CRPSS is the same for rainfall amounts.
How the method was chosen

A change is adopted only if it improves the cross-validated 1993–2016 scores (Holm-adjusted p < 0.05 over the five JJAS targets) and does not worsen 2017–2025. Also evaluated and not adopted: regularized Dirichlet recalibration and per-cell or regime-specific blend weights.

Method changes tested with whole-year significance gates (May-initialized JJAS targets; negative = better)
Candidate changeScore change 1993–2016Score change 2017–2025Decision
Fit the blend weight on Ethiopia only+0.0003 to +0.0013−0.0038 to −0.0001Not adopted
Square-root amount correction (probabilities)−0.0007 to +0.0003−0.0033 to −0.0006Not adopted
Remove the climatology blend+0.0106 to +0.0316−0.0137 to +0.0211Not adopted
Plain climatology+0.0017 to +0.0210+0.0044 to +0.0303Not adopted
Square-root amount correction (amounts, CRPS in mm)−0.13 to −0.10lower in all targetsPasses for all targets; candidate for the next cycle
Ensemble size and spread
Ensemble-size check, May-initialized JJAS targets, 2017–2025 (lower RPS is better)
TargetRPS, 51 membersRPS, 25-member subsets (mean)Spread / error (hindcast → 2017–2025)
JJAS0.42840.43070.72 → 0.80
Jun0.45900.46000.68 → 0.64
Jul0.45060.45220.74 → 0.74
Aug0.42640.42840.78 → 0.76
Sep0.45480.45570.78 → 0.73

Calibration parameters are fitted mostly on 25-member hindcasts and applied to 51-member forecasts. In 2017–2025 the 51-member forecasts scored about the same as, or slightly better than, 25-member subsets, so the transfer did not degrade scores in the years tested; this does not show it is neutral in every year or region. The corrected ensemble is under-dispersive (spread smaller than error), which the climatology blend partly offsets. Monthly and seasonal outlooks are calibrated separately: for JJAS 2026 over all Ethiopia the corrected monthly means sum to 378 mm against 375 mm for the season (+3.3 mm).

Quality control
  • Every forecast file is inventoried; re-downloaded years were bit-identical, confirming SEAS5 system 51.
  • Small negative daily increments (≤ 0.15 mm) are GRIB packing rounding; tolerated up to 0.2 mm and clipped, and the seasonal sum is checked.
  • CHIRPS sea cells (223) are always missing; no partial season enters any fit.
  • Verification observations are compared with the archive in the overlap year (tolerance 0.0001 mm/day) before use.
Limitations
  • Few evaluation years and single verification seasons give wide uncertainty; regional and monthly results are noisy.
  • The later evaluation years were inspected during method development; the cleanest evidence is the cross-validated 1993–2016 score.
  • The 0.25° maps repeat 1° model information; they add no dynamical detail.
  • All cycles are research reconstructions produced after their initialization dates, not official EMI or ICPAC forecasts.
Reproduce
git clone https://github.com/YonSci/calibrated_seasonal_rainfall.git
python -m venv .venv && .venv\Scripts\activate && pip install -r requirements.txt
set CALIBRATION_CYCLE=config\cycles\sep_2026_ondj.json
python scripts\run_operational.py --config config\cycles\sep_2026_ondj.json --workflow all
python scripts\build_site.py

Raw ECMWF and CHIRPS data are not stored in the repository. Step-by-step guides: docs/40; project status: docs/36.

Downloads

Complete package

One ZIP file with the PDF bulletin, summary CSV, metadata, README, every map (forecast and verification), verification reports and the forecast NetCDF files for the selected cycle.

Release archive and change log: earlier published versions and what changed.

Individual maps: use Download PNG in the map viewer. Code, documentation and notebooks: GitHub repository.