How do I read the chart?
The chart shows the recent observed river height differential (the black line) and a 10-day probabilistic
forecast. Each thin purple line is one possible future driven by a different rainfall forecast; the bold
purple line is their average, and the purple shading is the likely range (rain and model error together).
Horizontal bands shade the flag bands, daily rainfall is shown as bars on the right axis, and the dashed red
line marks "now". For Isis and Godstow, the stacked chart underneath shows the chance that the river will be
in each flag band at each point in the next 10 days.
Flag bands and the official flag
The coloured bands are ranges of the differential that roughly match the OURCs flags. They are not the flag:
OURCs sets the flag by hand (on the Isis by counting the bucks at Iffley weir; at Godstow from the lock
differential, since September 2024), and the official flag is shown above the chart, from
ourcs.co.uk. Comparing the
two since 2019, the flag and the band agree about 80–87% of the time. Going up, the flag usually changes
within an hour or two of the band, in daylight. Coming down it lags: it usually waits until the river is a few
centimetres below the line and has stayed there for a few daylight hours (at Godstow, Red often stays until
the differential is near 0.6). Flag changes almost always happen between 8am and 8pm. When the two disagree,
the official-flag card says so.
Black (Isis) is not a band: in big floods the differential stops rising (around 0.95), so the page watches the
river level at Iffley Lock instead. Since 2019 the official flag has gone Black once Iffley reached about
0.42 m and come back to Red once it fell below about 0.22 m, which matches the flag in 98% of Red/Black
hours. Iffley's level 1–48 hours ahead is forecast from its level and trend now, the Isis and Godstow
differentials now, and the rain that has fallen and is forecast (the differential forecasts do not help: Iffley
is also fed by the Cherwell). A Black card appears only when Black is close: the flag is Black, Iffley is within
a few centimetres of the line, or there is at least a 10% chance of Black by the end of tomorrow.
How do I read the chart?
The chart shows the recent observed river height differential (the black line) and a 10-day probabilistic
forecast (the blue spaghetti). Each thin blue line is one possible future trajectory driven by a different
rainfall ensemble member; the bold purple line is the ensemble mean and is the single most likely outcome.
Horizontal bands shade the flag colours, daily rainfall is shown as bars on the right axis, and the dashed
red line marks "now". For Isis and Godstow, the stacked chart underneath shows the probability that the river
will be in each flag colour at each point in the next 10 days.
What is the shaded band?
The 50 blue lines only show how much the rainfall forecasts disagree. Even with the rain exactly right the
model is sometimes wrong, and in the first day or two that is most of the real uncertainty, because the rain
forecasts barely disagree yet. The purple shading adds that in. The model was re-run every 6 hours over
periods it was never trained on (2023, and November 2024 to January 2026) using the rain that actually fell,
and every one of those forecasts' errors was kept. For today's forecast, each rain line borrows the errors
of past forecasts that started from a similar situation (similar river level, trend, recent and forecast
rain, and time of year). The outer shading holds 80% of the resulting outcomes and the inner shading 50%. The
flag probabilities underneath are worked out from the same outcomes, so they include the model's own
uncertainty too. That is why they can show a small chance of a higher flag even when every rain line
stays in the current one.
What are the flag cards, and why does the forecast jump?
The river does not rise and fall smoothly. Much of each change comes as a sudden jump when a lock keeper
adjusts the weir gates, mostly between 8am and 4pm and mostly when the river is already heading somewhere.
The model itself is smooth: when it isn't sure whether a jump comes this morning or tomorrow morning, it
spreads the change over both, so on its own it puts flag changes at any time of day. For the first three
days, every possible outcome is therefore turned into held levels and jumps. Each hour, the chance of a jump
depends on how far that outcome says the river still has to move over the next day, the time of day,
weekends, the trend over the past day, recent rain, how long since the last jump, and whether this stretch or
a neighbouring one jumped in the last three hours; how big a jump is (keepers often overshoot) comes from
past jumps. These rules were learned from the 15-minute river record and the model's own forecasts from
2019 to 2024 (without 2023), and checked on 2023 and on November 2024 to January 2026. Each outcome still
ends up where it was heading, so this mostly changes when the flag is forecast to change, not how high
the river gets.
The cards above the summary give the share of those outcomes in which the flag changes, and stays changed for at
least three hours, today or by the end of tomorrow (UK time). In the check years, when a card would have said
"very likely" (over 80%), the change happened about 9 times in 10; "likely" (60–80%) about 6 to 7 times in
10. Those checks used the rain that actually fell, so with forecast rain the cards will be a little less
certain. The first card is the official flag: a model of when the flag gets changed (how far past
the line the river is, for how long, the time of day and weekends), fitted on the OURCs flag history (the Isis
since November 2021; Godstow since September 2024, when its flag started being set from this differential),
is run along every outcome starting from the flag flying now; its chance of the flag coming down is then adjusted, because on its own it was too cautious about that in the check years. The second card is the differential: which band it is forecast to be in.
How have earlier forecasts done?
Under each chart you can look back.
Past forecast: drag the slider to any forecast from the last few
weeks (one is saved every 6 hours) and see what it said against what the river then did, with its typical
error and how often it had the flag right.
Forecasts of now: what every forecast from the last ten
days said the latest reading would be. Forecasts saved before the model-error band was added only show the rain spread, not
the model-error band.
How reliable is the summary sentence?
The summary sentence is written automatically from the
average forecast (the purple line), starting from the latest river reading, so it includes the first few
hours. How certain it says it is comes from the spread of the forecast. It's meant to give a general idea of
the next 10 days, not a precise prediction.
The summary sentence is simply a short description of the forecast, without any human intervention. The certainty
bounds are just based off the spread of the forecast. Importantly, the summary sentence is based off the change
from the first (+2h) prediction, so it doesn't take into account the initial jump at t=0. This summary sentence
is meant to give a general idea of the forecast, which is probably more reliable than the prediction chart itself.
Where does the data come from?
Historical river levels and rainfall come from the Environment Agency's flood-monitoring and hydrology APIs.
Rainfall forecasts come from the ECMWF AI Forecasting System (ECMWF-AIFS) via Open-Meteo. The model is
physics-based: a small neural network reads the recent past and sets the starting state of a rainfall-runoff
model (soil wetness, fast and slow runoff stores, groundwater and the river channel). Forecast rain is routed
through those stores hour by hour, and a rating curve that only ever increases turns river flow into the
differential. The forecast is the average of five independently trained copies.
Why hasn't the forecast updated recently?
Usually it's just a temporary glitch in an Environment Agency sensor going briefly offline; the page will
fall back to the latest successful forecast. If a sensor has been offline for more than four hours the page
flags the forecast as
stale. Updates are also scheduled hourly via GitHub Actions and sometimes
queue up, so refreshes may not land exactly on the hour.
Is the forecast reliable?
Please treat this as
experimental. The model starts exactly at the latest observation and
cannot rise without rain, but it can overshoot after heavy rain and still misses some sudden weir changes. Issues and improvements get written up on the
substack; bug reports
and ideas are very welcome on
GitHub.