Salahuddin Bayassi

Data science · 2026

Su Ufku

A daily water outlook for İstanbul's dams that shows where the citywide reserve is heading over 30, 60 and 90 days as honest ranges, and in a 13-year hindcast misses by 3.7 points at 30 days, 35% less than "same day last year".

Role
Solo: data pipeline, model, evaluation, site
Stack
Python, pandas, SciPy, GitHub Actions, Next.js, Cloudflare Workers
Year
2026
Status
Shipped
points of fill, typical 30-day miss (hindcast, 2011–2023)
3.7
smaller 30-day miss than same day last year
35%
of outcomes inside the 80% range at 30 days (target: 80%)
85%
past weeks re-forecast with only what was known then
679
İstanbul's ten dams on 27 October 2026 as glowing bars, the Asian and European sides side by side, with the city at 53.0% and its 30-day range of 65–97% drawn past it

Intended use

When İstanbul's dams run low, the news asks how many days of water are left, and the answers range from 45 to 125.

Su Ufku ("Water Horizon") is a public, daily-updated outlook for the city's ten dams. Every morning it shows today's level and where the citywide reserve is likely to be in 14 and 30 days, then dry, average and wet scenarios out to 90. It never names a day the water "runs out"; it shows how many days the usable water would last, as a range. Every forecast is archived and checked in public once its date has passed. The site is in Turkish first, with an English version.

The hard part is the data, not the model. Sources disagree on dam sizes, there is a two-year hole in the daily record, and nobody publishes how much water sits unusable at the bottom of a dam, so the site shows both readings until İSKİ, the city's water authority, says which is right.

Architecture

once a dayhundreds of futuresnever editedonce the date passesİSKİ, İBB, Open-MeteoECMWF, 51 runs, days 1–14Past years' weather, days 15–90Daily fetch + cleanWater-balance modelForecast archivePublic scorecardStatic site on Workers
System diagram: data flows left to right

Decisions

  1. A bathtub, not a neural net. A water balance (rain in, city use and evaporation out, pipeline transfers on top) beat a LightGBM model at every forecast length and in every season: 3.7 points off at 30 days against 4.3. It also explains itself in one sentence.
  2. Ranges over a single number. Days 1–14 use ECMWF's 51 weather runs. After that it replays each past year's weather from the same date. The ranges are widened from the model's own past misses, because without that they held only about half the outcomes.
  3. A bar set in advance. The long-range scenarios only ship while the model beats "same day last year" at 30 days. A quarterly retrain has to pass the same gate, plus the tests, before it replaces the current model.
  4. Forecasts are immutable. Each morning's forecast is committed to the repo and never edited, and a test proves no forecast can see data from after its issue date.
  5. No server. GitHub Actions does the fetching, forecasting and scoring every morning. The site is static and redeploys to Cloudflare Workers after each run.

Results & evaluation

points of fill, typical 30-day miss (hindcast, 2011–2023)
3.7
smaller 30-day miss than same day last year
35%
of outcomes inside the 80% range at 30 days (target: 80%)
85%
past weeks re-forecast with only what was known then
679
Chart of İstanbul's dam fill from 2000 to 2026, rising every winter and falling every summer, with five drought lows below 20% marked: 2007, 2008, 2014, 2021 and 2023
26 years of dam levels the model learns from
Fan chart: the measured level climbs to 53% after October rain, then dry, average and wet scenarios fan out to 60 and 90 days, from 76 to 100%
90 days, under three kinds of weather
One upright range per morning since 19 October 2026, each showing the 30-day forecast made that day above the measured level
Every morning's forecast, kept and never edited

Limitations & next steps

  • The accuracy figures above are a hindcast: forecasts re-made for 679 past weeks using only what was known then. The first live 14- and 30-day results are due on 2 November 2026.
  • The live record so far is a warning: the shorter 1–13-day runs, which the model makes but the site doesn't publish, have all 36 come in too high. The site shows that on its scorecard rather than hiding it.
  • At 60–90 days the model has no clear edge over the best simple rule, so those are shown only as labelled scenarios. Ranges made in autumn run too narrow: 72% of outcomes inside at 90 days, against a target of 80%.
  • It forecasts the whole city, not single dams, and it cannot foresee restrictions, closures or snow.
  • Next: find why the short runs run high, build up a live track record, and ask İSKİ for its dead-storage figures.
Next project · ML engineeringWarden