How the forecast is made
The method in plain words: what a level means, what goes into it, how it was tested, where it fails, and every correction made since September 2026. The live scores are on the Accuracy page; the full technical account is in the project's README.
What a level means
Each day at each spot gets one of four levels: low, moderate, high or very high risk. The level is the worst of these four things:
| Risk level | Exposure index | E. coli estimate | Rating and algae |
|---|---|---|---|
| Low | under 15 | under 10% | |
| Moderate | 15 to 40 | 10% to 25% | Algae seen at intervals at the last check |
| High | 40 to 70 | 25% to 50% | Rated poor; or algae enough to be objectionable at the last check |
| Very high | 70 or more | 50% or more |
- The exposure index is a 0–100 score of how likely sewage from upstream is to reach the spot. It comes from the monitored storm overflows upstream: what they are doing now, how likely each is to spill, and how much of a spill would arrive.
- The E. coli estimate is the chance that a water sample taken that day would have more than 900 E. coli per 100 ml, the limit for an inland bathing water rated "sufficient". It counts on rivers with overflows upstream, from May to September only. From October to April nothing tests it, so it is shown with a dagger (†) and does not set the level.
- The Environment Agency's rating applies at designated bathing waters. A water rated poor is at least high risk on every day.
- The algae check is the Environment Agency sampler's look at the water at a designated bathing water. It counts for 14 days.
A spot with no monitored overflow upstream gets no exposure index. Its level comes from the rating (excellent or good: low; sufficient: moderate; poor: high) and the algae check, where it has them.
How the forecast is made
Which overflows reach the spot
SwimSignal follows the river network upstream from the spot, up to 60 km along the rivers. The network is Ordnance Survey's OS Open Rivers: 193,040 stretches of river, each with a direction of flow, including the lines that run through lakes. A listed spot sits on the nearest stretch that carries its river's name. Each storm overflow is placed on the stretch nearest its outfall, within 1.5 km. An overflow whose water reaches the spot counts; one on another branch does not.
How likely each overflow is to spill
For each overflow and day, a model gives the chance of a discharge. It uses the rain at the overflow that day and the two days before, the totals over 3, 7 and 30 days, how wet the ground already is, the heaviest rain in 1, 3 and 6 hours, the time of year, and how often that overflow spilled the year before (from the Environment Agency's annual returns). More rain can never lower the chance. The model was trained on United Utilities' overflows in 2023 and 2024, because only United Utilities publishes its past spills one by one, with their start and end. For those overflows the forecast is also moved towards each one's own record.
The rain is Open-Meteo's forecast, which for England is the Met Office's. Forecast rain has errors that grow with each day ahead, so each day ahead gets its own correction, fitted on 2025.
How much of a spill arrives
Sewage from an overflow takes time to travel down the river: SwimSignal assumes 0.5 m a second on rivers and 0.05 m a second across a lake. On the way, bacteria die off: 90% in 30 hours. And the river dilutes it: an overflow on a small stream counts for less at a big river than one on the river itself. Dilution is measured by how much river lies upstream of each point, a stand-in for flow. On a lake it is cut further by the lake's area. The result is a weight for each overflow. The exposure index combines them: one minus the chance that no overflow's spill arrives.
Right now
An overflow discharging now, by its water company's live feed, counts in full. One that stopped within the last 48 hours counts for less as time passes.
The E. coli estimate
A statistical model fitted to 1,548 Environment Agency samples at 32 inland bathing waters from 2024 to 2026. It uses the rain at the spot in the 48 and 24 hours before midday, the day's exposure index, whether the spot is a lake or a river, and the time of year. Rain explains most of what it gets right. The exposure index adds a little on rivers, and nothing on lakes.
Test 1: a year the model never saw
The spill model was trained on United Utilities' overflows in 2023 and 2024 and tested on 2025: 826,725 overflow-days, 7.45% of them with a discharge. Rain from reanalysis (ERA5-Land, a reconstruction of the weather as it was), so this leaves out weather-forecast error.
| Forecast | Brier score | AUC | Skill |
|---|---|---|---|
| SwimSignal (the model, with each overflow's own record) | 0.0445 | 0.930 | 0.33 |
| The model alone | 0.0452 | 0.927 | 0.33 |
| Each overflow's long-run spill rate (climatology) | 0.0669 | 0.768 | 0.00 |
| A rule: more than 10 mm of rain in 48 hours | 0.0621 | 0.758 | 0.07 |
The Brier score is the mean squared difference between a probability and what happened (1 or 0): lower is better, 0 is perfect. AUC is how often a spill day is ranked above a dry day: 0.5 is chance, 1 is perfect. Skill is how far below climatology's Brier score a forecast gets: 0 is no better, 1 is perfect. From data/processed/verification_2025.csv.
Test 2: with real weather forecasts
The same year again, with the rain forecast as it was issued, up to four days ahead. Each day ahead's correction was fitted on this same year, which flatters it, so this table scores the odd months with a correction fitted on the even months, and the reverse.
| Rain used | Brier score | AUC | Skill |
|---|---|---|---|
| Reanalysis (the weather as it was) | 0.0447 | 0.929 | 0.33 |
| Forecast, same day | 0.0429 | 0.932 | 0.36 |
| Forecast, 1 day ahead | 0.0468 | 0.910 | 0.30 |
| Forecast, 2 days ahead | 0.0480 | 0.910 | 0.28 |
| Forecast, 3 days ahead | 0.0501 | 0.898 | 0.25 |
| Forecast, 4 days ahead | 0.0528 | 0.889 | 0.21 |
Skill falls with each day ahead, but four days out the forecast still scores better than the 10 mm rain rule does with the rain as it fell (0.0621). The same-day forecast beats reanalysis, probably because the forecast model's grid is finer. From data/processed/verification_leads_2025.csv, the cross-fitted rows.
Test 3: against measured E. coli
The E. coli estimate, tested on Environment Agency samples at 32 inland bathing waters, 2024 to 2026, in three ways: each year predicted by a model fitted on the other years; each site by a model that never saw it; and 2025–26 by a model fitted on 2024 alone. The competitor that matters is rain alone: the question is whether the overflows add anything a rain gauge would not.
| Test | Forecast | Brier score | AUC | AUC, rivers | AUC, lakes |
|---|---|---|---|---|---|
| Leave one year out | Rate for rivers and lakes (climatology) | 0.116 | 0.62 | 0.35 | 0.37 |
| Rain only | 0.093 | 0.80 | 0.71 | 0.35 | |
| The E. coli estimate | 0.091 | 0.82 | 0.75 | 0.47 | |
| Leave one site out | Rain only | 0.092 | 0.79 | 0.72 | 0.06 |
| The E. coli estimate | 0.090 | 0.81 | 0.76 | 0.18 | |
| Forward in time | Rain only | 0.087 | 0.79 | 0.77 | 0.51 |
| The E. coli estimate | 0.083 | 0.81 | 0.81 | 0.53 |
On rivers the estimate scores better than rain alone in every test, by 3% to 7% of the Brier score. That gain is small. When the samples are resampled by calendar week, since one storm hits many sites at once, its 95% interval includes no gain at all. Against rain and the time of year together, which isolates what the overflows add, the gain holds however the samples are resampled. On lakes neither does better than chance, which is why the estimate is not shown for lakes. The exposure index does tell which sites are polluted: averaged over the samples, it ranks the sites' average E. coli with a rank correlation of 0.68, where average rainfall gets −0.25. From data/processed/ecoli_model_eval.json and ecoli_validation_combined.json.
Live scoring
Every forecast the site issues is logged. Once a day has passed, each overflow's forecast for it is scored against what the water company's live feed showed. The forecast scored is the latest one issued by 08:00 on the day it was made: what a swimmer planning the day would have seen. An overflow-day counts as "no spill" only if the feed saw that overflow at least six times that day, with no gap longer than 8 hours, and once the next day; a gap is a missing observation, not a dry day. South West Water's feed carries no times, so its overflows are not scored. Each E. coli estimate is scored against Environment Agency samples taken that day, using the last forecast issued before the sample.
The scores are on the Accuracy page, with every scored overflow-day as a file anyone can download and recompute from. The Accuracy page also sets the E. coli estimate beside the Environment Agency's own daily risk prediction at the inland bathing waters, on the same samples.
Known failures
- Runoff it sees only through the rain. Rain washes in pollution from farms, roads and drains, whatever the overflows do. The exposure index covers monitored storm overflows only, and the E. coli estimate allows for the rest only on average, through the rain. At a given site, neither rain nor the exposure index explains most of the day-to-day change in E. coli: their rank correlations with it, within each site, are 0.35 and 0.36.
- Lakes. At the nine United Utilities bathing waters, eight of them lakes, every real spill is known. Routing those spills to the spot gives a rank correlation with E. coli of only 0.23 within each site (601 samples). There, E. coli spikes are mostly not from overflows.
- Too sure at the top end. In the 2025 test, days forecast at 85% had a spill 79% of the time, and days at 93% had one 85% of the time.
- Too high in a dry spell. Over 17–27 September 2026, a dry spell, live forecasts averaged 2.7% against 1.3% observed, on 49,380 overflow-days, and forecasts between 10% and 70% happened a third to a half as often as they said. Those scores were later withdrawn for another reason (see the corrections of 28 September); the problem they showed is still checked on the Accuracy page.
- Trained on one company. The spill model learned from United Utilities only. Other companies' overflows get the same model without a record of their own. The Accuracy page scores each company separately; that is the check.
- Rough physics. Travel speed is fixed, dilution uses the length of river upstream instead of flow, lake volume is not modelled, and the day is the smallest unit. On 3 October 2026, 334 inland overflows (2%) sat more than 1.5 km from any mapped river and were left out.
- Wales. Dŵr Cymru Welsh Water publishes no live overflow status. Its overflows are forecast from rain and their yearly spill record, with no "right now".
Corrections
Mistakes found in the method or its tests, newest first. Each was fixed in the code, and the figures on this page and the Accuracy page are from the corrected versions.
- 3 October 2026. A water company's feed changed while it was being read, so some overflows were listed twice. Every spot with a repeated overflow upstream failed to get a forecast in one build, among them the Nidd at Knaresborough. The feed is now read again when that happens, and each overflow is kept once.
- 2 October 2026. South West Water's feed carries no event times and no record times. None of its overflows ever counted as spilling, and its feed always looked current. Its 135 scored overflow-days, all read as "no spill", were withdrawn, and its overflows are no longer scored.
- 2 October 2026. Six river spots had been placed on a side stream or a lake and showed no overflows upstream: Crook o' Lune, for one, sat 262 m from Escow Beck and 672 m from the Lune. A listed spot now sits on the nearest stretch of river carrying its own river's name, and every build checks each one.
- 1 October 2026. The live scoring rule allowed no gap over 6 hours between observations, but the scheduled runs were further apart, so nothing could be scored. The limit is now 8 hours, and the scores under 6 hours are shown beside them.
- 1 October 2026. Out of season the E. coli estimate had put 35 of 89 spots on high or very high risk, with nothing to test it. From October to April it no longer counts towards the level.
- 29 September 2026. The live scoring rules written on 16–17 September reached the live site only on 28 September, so the live table was empty until days observed under them had passed.
- 28 September 2026. Live scores from 17–27 September were withdrawn. Under the old rule any polling on a day counted as watching every overflow, which the records could not support. They are kept in
data/processed/verification_live_oldrule_2026-09-28.json. - 28 September 2026. The test of choosing sampling days from the rain forecast read missing rain as no rain. Rerun with the production rule, its river figures moved by one or two points; the conclusions did not.
- 16–17 September 2026. Missing rainfall had been counted as dry, in both the E. coli rain totals and the daily spill model. It is now unknown: a day with too much missing rain gets no figure, and is not scored.
- 15 September 2026. The live scorer had scored nothing: the database returned dates as timestamps, so no forecast ever matched an observed day. Fixed, with a test.
- 14 September 2026. The first E. coli validation shifted part of each overflow's effect onto the following week's sample and used the wrong day-ahead correction. The within-site rank correlation it reported, 0.23, was wrong; the corrected run is the one above.
The full record of each correction, with the numbers before and after, is in the README and the project's history.