← Back to projects

Case study · Python & data analytics · 2026

Gate

A historical day-ahead wind intelligence pilot that reconstructs what UK electricity buyers could have known before an auction. Real forecast history, measured error, and an exploratory adjustment evaluated without peeking into future outcomes.

Gate · day view · published forecast and historical adjustment

Real application screenshot. The adjusted estimate is exploratory, and observed generation is shown separately from information available at the original decision.

The problem

A forecast can look accurate in hindsight and still be useless at decision time.

Day-ahead procurement decisions happen before the electricity is generated. Wind forecasts are revised repeatedly, so comparing the latest available forecast with the final result can leak information that was not yet known when the decision had to be made. Gate asks a narrower and more defensible question: what did the published wind forecast say before each auction cutoff?

What I built

A research application with a day view, a month view and visible evidence.

01

Decision-time day view

Compare the forecast available at the selected auction gate with a trial historical adjustment. Reveal actual generation separately, inspect each hour and export the selected day as CSV.

02

Publication history

Inspect forecast revisions and distinguish values published before the cutoff from revisions that arrived too late.

03

Monthly analytics

Explore forecast errors by hour, wind-level band and lead time. Compare the original forecast with exploratory adjustments on later, chronologically evaluated days.

04

Explainable methodology

Document source resolution, timing assumptions, data alignment, validation rules and limitations in the interface and repository.

Data & methodology

Only use information available before the auction.

Gate works from real Elexon BMRS datasets: WINDFOR publishes forecasts for native hourly targets, while FUELHH WIND reports half-hourly observed generation. The pilot covers purchase-decision dates from 1–31 January 2026 and the corresponding delivery days from 2 January–1 February.

01

Preserve source timestamps

Keep every forecast publication timestamp. For each hourly target, select only the latest forecast published no later than the auction closing time minus an assumed five-minute margin.

02

Respect the data's native resolution

Compare hourly forecast targets with the observation for the half-hour starting on the hour. Do not manufacture missing half-hour forecasts.

03

Train on earlier completed days

The experimental adjustment groups forecasts into three wind-level bands and learns their historical signed differences using complete days on or before delivery day D−2. It requires at least seven earlier days before being shown.

Measured findings

The dataset exposed a systematic gap, but the conclusion stays limited.

In the January snapshot, the published WINDFOR series was higher than the FUELHH wind outturn in approximately 85% of the matched hourly comparisons. The gap was larger at higher forecast wind levels. On the same held-out, walk-forward evaluation set of 552 hours across 23 days, the exploratory wind-band adjustment reduced mean absolute difference.

2,123 MW

Published forecast mean absolute difference on the walk-forward evaluation set.

1,382 MW

Wind-band-adjusted mean absolute difference on the same historical evaluation set.

85.5%

Observed hours above the exploratory lower reference, below the study's 90% target.

These numbers are reproducible findings from a short historical pilot, not an operational performance guarantee or advice on how much electricity to buy.

Engineering choices

The difficult part was protecting the meaning of the analysis.

Point-in-time selection

Publication cutoffs and timezone-aware timestamps prevent later forecasts from slipping into earlier decisions.

Real data quality

Snapshot metadata, validation scripts and source-resolution handling make source assumptions inspectable.

Reproducible interface

FastAPI serves read-only analysis; React and TypeScript present day and month views, forecast history and CSV exports.

InputElexon dataFUELHH + WINDFOR
→
ProcessingPythonnormalize & validate
→
APIFastAPIday, month & revisions
→
ClientReactdecision-focused views

What the results do not prove

Clear limitations matter as much as the chart.

WINDFOR and FUELHH may represent different wind-generation populations. Some apparent forecast error could reflect curtailment or differences in coverage. The retrospective October 2026 data snapshot may include actual-value revisions that were not available during January, and one month's historical evaluation is insufficient to promise future accuracy. Gate also has no demand forecasts, power prices or existing client positions, so it cannot recommend a purchase quantity.

Proof & further reading

Open the application, inspect the code, or follow the recorded walkthrough.

The GitHub repository includes the original data snapshot and metadata, ingestion and audit scripts, pytest coverage for cutoff and API behavior, the FastAPI/React implementation, and local commands to reproduce the checks without GitHub Actions. The recorded demo walks through the application and its methodology.

Explore another case study

Digital Wallet & Transaction Service

View project →