Every morning we run the dams’ water balance 90 days ahead.
Each morning we start from the latest reading and add up, day by day, the water flowing into and out of the dams: for the first 14 days with the 51 runs of the weather forecast, after that with past years’ weather.
Water comes in two ways and leaves two ways.
Every morning we start from the latest measured fill level and work out how the lakes will fill and drain over the next 90 days.
- Rain: part of the rain on the hills around the dams runs into the lakes. How much depends on how wet the ground already is. After a dry summer the same rain brings a fraction of what it brings after a wet winter.
- Use: the city draws about 3.2 million m³ a day, a little more in summer.
- Evaporation: water lost off the lake surface.
- Pipelines: water brought from Melen and Yeşilçay. İSKİ decides how much. The weather doesn’t tell us.
Nobody knows the rain beyond two weeks.
Nobody can know the rain more than about two weeks ahead. So for the first 14 days we use the 51 separate forecasts of the European Centre for Medium-Range Weather Forecasts (ECMWF). After day 14 we replay the weather of each past year on the same dates, one year at a time, and work out what the lakes would do if the coming months went the same way. That gives hundreds of possible futures.
Up to day 30 we gather those futures into one range. From day 30 to day 90 we sort them by their rain into dry, average and wet, and show the range of each.
We set the range from our own past misses.
We set the range so there’s an 80% chance the level stays inside it. We widen it using the model’s own past misses, and only misses that were already known when the forecast was made. Without this, the ranges held about half of the outcomes.
Every forecast is saved and, when its target date arrives, checked against what happened. The results are on the Scorecard page.
How long the water lasts is a range too.
We never give a date when the water “runs out”. Instead we show, as a range, how many days the usable water would last under these assumptions. Usable water is the water in the lakes minus the part at the bottom that can’t be drawn.
İSKİ doesn’t publish how much that bottom part is. Because İSKİ’s percentages have reached zero at some dams, we think they already count only usable water. That isn’t confirmed, so we show both: the bottom ignored, and 10% of capacity unusable (a rule of thumb often quoted in the press). Both stay side by side until İSKİ answers.
The calculation itself is this short.
The total water in the dams, V (million m³), changes in daily steps:
V[t+1]=V[t] + inflow[t] − use[t] − loss[t] + transfers
- inflow
- Water running into the lakes, worked out from catchment rain with a soil-moisture (bucket) model. When the lakes are nearly full, extra water goes over the spillways, and that is in the sums.
- use
- The city’s daily water use. It varies with the season, the day of the week, holidays and temperature.
- loss
- Evaporation and other losses. Lake surface areas aren’t published, so evaporation can’t be separated. One coefficient stands for evaporation, releases and seepage together.
- transfers
- Water from Melen and Yeşilçay, estimated from past data as one net amount per year. That amount doesn’t match the totals İSKİ reports, so it isn’t presented as a measurement. In forecasts it is a low, typical or high assumption.
Rain correction
For weather we use the ERA5 reanalysis. Against İSKİ’s own rain gauges, ERA5 reads 10–30% low. So each dam’s ERA5 rain is scaled up by the ratio of the gauge total to the ERA5 total over the training period.
We tried a more complex model
We also tried a LightGBM machine-learning model with the same inputs. It did worse than the simple water-balance model for every forecast length and in every season. At 30 days the machine-learning model was off by 4.3 points on average, the bucket model by 3.7. About 700 weeks of data aren’t enough for anything more flexible. We will use machine learning only if it beats the simple method.
Where the model is weak.
- At longer range the model shows no clear edge over the strongest simple rule (the usual change for the season). In the hindcast it was no better than that rule in the cases below. That is why 60–90 days are shown only as labelled scenarios.
- Spring (Mar–May): 30 days, 60 days and 90 days
- Autumn (Sep–Nov): 90 days
- Other years: 60 days and 90 days
- Scenarios worked out in autumn show too narrow a range at 60 and 90 days. In the hindcast, 80% of outcomes should have landed inside. At day 60 it was 75%, at day 90 68%. What matters most is when the first big rain arrives.
- There is no daily dam data between 20 February 2024 and 15 April 2026, only the summers. Those winters are missing for good, so the last two winter refills can’t be tested in a hindcast.
- İSKİ decides how much water is transferred. The model learns transfers from past data as one net amount and uses that amount in forecasts. It doesn’t match the totals İSKİ reports, because it also carries whatever the other terms of the sum miss.
- The daily consumption series on İBB’s open-data portal ends in February 2024. Current forecasts use approximate values read off the yearly charts on İSKİ’s page.
- How much unusable water sits at the bottom isn’t published. We show both, and neither is confirmed.
- In the hindcast the first 14 days were also replayed with past years’ weather. Live forecasts use a real weather forecast for those days, so only the live scorecard can measure real short-range skill.
- The model doesn’t know about operating decisions such as taking a dam offline or water restrictions. It assumes normal operation. Snow isn’t modelled. Only the city total is forecast, not single dams.
The route from data to screen.
The same route every morning. Each step below shows today’s actual value.
1. Reading
Fill levels come from İSKİ’s page, or via dolulukorani.com and DSİ. Past years come from İBB Open Data, weather from Open-Meteo. Each source is asked at most once a day.
- Today
- Latest reading 6 November 2026, iski
2. Raw archive
Each file is kept exactly as it arrived and never changed. If a bug turns up, the history is worked out again from these files.
- File
- data/raw/
3. Clean tables
City and per-dam series. Every row says where its data came from. A missing day stays empty and is never filled with an estimate.
- Today
- 8,894 days of citywide record
- File
- city_daily.parquet
4. Water-balance model
Starts from today’s fill level and works out the lakes’ next 90 days. For the first 14 it uses the 51 separate weather forecasts of the European centre (ECMWF), after that past years’ weather.
- Today
- 1,326 possible futures
- File
- models/2/
5. Forecast archive
The day’s forecast is written to its own file and never touched again. If the program tries to change an old file, it stops itself.
- Today
- Forecast of 6 November 2026
- File
- data/forecasts/2026-11-06.parquet
6. Scorecard
When a forecast’s target date arrives, it is set against that day’s reading and marked as inside or outside its range.
- Today
- 4 results in
- File
- live_scores.csv
7. This page
The site is rebuilt from these files every morning. The page does no calculation in the browser; the figures are precomputed.
- Today
- Last updated Friday 6 November 2026, 23:04
- File
- data/public/site/
If a step fails it runs again at 12:40. Times are İstanbul time.
Which version is running.
Model: water balance, version 2, fitted on readings up to 14 February 2024. Last check 27 October 2026: passed the hindcast and went live.