Skip to content
← SelectLAB·05PT
LAB · 05 / 09

Heat and electricity load

How much each degree drives electricity demand and a day-ahead forecast with 4% error. ONS · INMET · gradient boosting

How it works

Visual mode: shadows, ambient occlusion, depth of field and quality that adapts to your device. Light mode: no shadows or post-processing. Each bar is one cell of the data; the full analysis is right below.

Sheet of each analysis

Objective, why, target variable, predictors, method, metric, validation and whether the objective was reached.

The shape of a day
Objective
Describe the daily load curve and the calendar effect.
Why
Without separating working days from holidays, any model blames weather for what is calendar.
Target variable
Mean load per hour (MW).
Predictors / explanatory variables
Hour, working day × weekend/holiday.
Method
Conditional means.
Metric
MW; difference per hour.
Validation
Official 2025 national holidays + Carnival.
Objective reached?
Yes: mean peak at 7 pm; largest gap at 2–3 pm.
The hockey-stick curve
Objective
Measure how much each degree adds to load and from what temperature.
Why
A heat wave is the biggest operational error risk; knowing the slope above the break point turns a weather forecast into MW.
Target variable
Daily mean load (working days).
Predictors / explanatory variables
Daily maximum temperature (mean of 2 stations).
Method
Segmented regression with break point searched between 20 and 32 °C.
Metric
MW per °C above and below the break; R².
Validation
Station coverage of 99.5% and 99.7% of hours.
Objective reached?
Yes: break at 23.5 °C, +764 MW/°C above, R² = 0.52.
Forecasting tomorrow
Objective
Forecast next-day load with less error than the naive method, hot days included.
Why
Each point of error becomes unnecessary generation or expensive short-term purchase; hot days are where error costs most.
Target variable
Hourly load (MW).
Predictors / explanatory variables
Hour, weekday, holiday, working day, temperature, degrees above 23.5 °C, load 2 and 7 days earlier.
Method
Six models, from naive to gradient boosting (HistGradientBoosting).
Metric
MAPE overall and on the hottest 10% of days; permutation importance.
Validation
Train Jan–Sep, test Oct–Dec (in the future); observed temperature as an upper bound of a weather forecast.
Objective reached?
Yes: MAPE 4.0% (6.7% naive) and 6.1% on hot days (8.4%).
  1. 01

    Load and weather, hour by hour

    Hourly load of the Southeast/Centre-West subsystem (ONS) and temperature from two INMET stations in São Paulo, all of 2025.

  2. 02

    Six models, one test in the future

    From "same hour last week" to gradient boosting with temperature and recent load. Training January to September, testing October to December.

    MAPE = média(|real − previsto| / real)

Heat and electricity load in data

A full year, hour by hour, of electricity load in Brazil’s Southeast/Centre-West subsystem, crossed with the temperature of two INMET stations in São Paulo. The question is that of whoever operates or buys power: how much does heat drive consumption, and can tomorrow’s load be forecast with small error?

Real-world use

Day-ahead scheduling and energy purchasing: each percentage point of forecast error becomes generation dispatched for nothing or power bought short-term, at a higher price.

01

The shape of a day

QuestionHow is load spread over the day, and does the weekend change it?

Decision and whyI separated working days from weekends and holidays (2025 national holidays plus Carnival). Without that split, any model confuses "Sunday" with "cold day".

ResultOn working days load rises from 6 am, plateaus through business hours and has its mean peak at 7 pm, when lighting and household use add up. On weekends the whole curve is lower, and the gap is largest at 2 and 3 pm (almost 9 GW): it is commercial and industrial demand that disappears.

Source: ONS · curva de carga horária 2025 (SE/CO)

Analysis technical sheet
Objective
Describe the daily load curve and the calendar effect.
Why
Without separating working days from holidays, any model blames weather for what is calendar.
Target variable
Mean load per hour (MW).
Predictors / explanatory variables
Hour, working day × weekend/holiday.
Method
Conditional means.
Metric
MW; difference per hour.
Validation
Official 2025 national holidays + Carnival.
Objective reached?
Yes: mean peak at 7 pm; largest gap at 2–3 pm.

Mean load by hour (MW)

  • working day
  • weekend and holiday
35,000 MW40,000 MW45,000 MW50,000 MW55,000 MWworking day · 0h: 41,102 MWworking day · 1h: 39,074 MWworking day · 2h: 37,841 MWworking day · 3h: 37,242 MWworking day · 4h: 37,420 MWworking day · 5h: 38,890 MWworking day · 6h: 41,411 MWworking day · 7h: 43,804 MWworking day · 8h: 45,828 MWworking day · 9h: 46,895 MWworking day · 10h: 48,019 MWworking day · 11h: 48,580 MWworking day · 12h: 47,976 MWworking day · 13h: 48,617 MWworking day · 14h: 49,137 MWworking day · 15h: 49,359 MWworking day · 16h: 49,609 MWworking day · 17h: 49,356 MWworking day · 18h: 51,254 MWworking day · 19h: 51,904 MWworking day · 20h: 51,195 MWworking day · 21h: 50,128 MWworking day · 22h: 47,709 MWworking day · 23h: 44,672 MWweekend and holiday · 0h: 41,035 MWweekend and holiday · 1h: 39,002 MWweekend and holiday · 2h: 37,598 MWweekend and holiday · 3h: 36,722 MWweekend and holiday · 4h: 36,352 MWweekend and holiday · 5h: 36,236 MWweekend and holiday · 6h: 36,421 MWweekend and holiday · 7h: 37,367 MWweekend and holiday · 8h: 38,425 MWweekend and holiday · 9h: 39,274 MWweekend and holiday · 10h: 40,133 MWweekend and holiday · 11h: 40,934 MWweekend and holiday · 12h: 41,110 MWweekend and holiday · 13h: 40,656 MWweekend and holiday · 14h: 40,259 MWweekend and holiday · 15h: 40,532 MWweekend and holiday · 16h: 41,744 MWweekend and holiday · 17h: 44,179 MWweekend and holiday · 18h: 47,379 MWweekend and holiday · 19h: 47,965 MWweekend and holiday · 20h: 46,993 MWweekend and holiday · 21h: 45,773 MWweekend and holiday · 22h: 43,989 MWweekend and holiday · 23h: 41,796 MW0h3h6h9h12h15h18h21h23h
02

The hockey-stick curve

QuestionHow much does each extra degree raise consumption?

Decision and whyI plotted the daily maximum temperature against mean load, on working days only. Instead of one line I fitted two lines with a break point, searching for the point that minimises error between 20 and 32 °C. That is the expected shape: below some temperature nobody turns on the air conditioning.

ResultThe break point landed at 23.5 °C. Below it load changes 273 MW per degree; above it, 764 MW per degree, almost 3 times more. Temperature alone explains 52% of the daily variation; the rest is calendar and trend. The year’s peak (62,150 MW) came at 14:00 on 2025-02-18, with 29.3 °C in São Paulo.

Source: ONS × INMET A701 e A771 · analises/energia.py

Analysis technical sheet
Objective
Measure how much each degree adds to load and from what temperature.
Why
A heat wave is the biggest operational error risk; knowing the slope above the break point turns a weather forecast into MW.
Target variable
Daily mean load (working days).
Predictors / explanatory variables
Daily maximum temperature (mean of 2 stations).
Method
Segmented regression with break point searched between 20 and 32 °C.
Metric
MW per °C above and below the break; R².
Validation
Station coverage of 99.5% and 99.7% of hours.
Objective reached?
Yes: break at 23.5 °C, +764 MW/°C above, R² = 0.52.

Daily maximum temperature × mean load

  • working day
  • weekend and holiday
30,00035,00040,00045,00050,00055,00060,000101520253035weekend and holiday · max temperature (°C) 29 · mean load (MW) 35,904working day · max temperature (°C) 31 · mean load (MW) 42,515working day · max temperature (°C) 31 · mean load (MW) 44,511weekend and holiday · max temperature (°C) 29 · mean load (MW) 42,867weekend and holiday · max temperature (°C) 27 · mean load (MW) 39,567working day · max temperature (°C) 30 · mean load (MW) 45,811working day · max temperature (°C) 27 · mean load (MW) 46,743working day · max temperature (°C) 26 · mean load (MW) 47,114working day · max temperature (°C) 24 · mean load (MW) 46,350working day · max temperature (°C) 25 · mean load (MW) 45,868weekend and holiday · max temperature (°C) 26 · mean load (MW) 43,162weekend and holiday · max temperature (°C) 23 · mean load (MW) 39,758working day · max temperature (°C) 23 · mean load (MW) 45,182working day · max temperature (°C) 22 · mean load (MW) 45,721working day · max temperature (°C) 26 · mean load (MW) 46,288working day · max temperature (°C) 29 · mean load (MW) 47,722working day · max temperature (°C) 28 · mean load (MW) 48,888weekend and holiday · max temperature (°C) 32 · mean load (MW) 46,064weekend and holiday · max temperature (°C) 31 · mean load (MW) 43,782working day · max temperature (°C) 32 · mean load (MW) 50,518working day · max temperature (°C) 33 · mean load (MW) 53,363working day · max temperature (°C) 33 · mean load (MW) 54,013working day · max temperature (°C) 30 · mean load (MW) 52,778working day · max temperature (°C) 30 · mean load (MW) 52,025weekend and holiday · max temperature (°C) 32 · mean load (MW) 48,700weekend and holiday · max temperature (°C) 29 · mean load (MW) 44,930working day · max temperature (°C) 25 · mean load (MW) 50,163working day · max temperature (°C) 27 · mean load (MW) 50,797working day · max temperature (°C) 25 · mean load (MW) 50,759working day · max temperature (°C) 25 · mean load (MW) 49,545working day · max temperature (°C) 27 · mean load (MW) 47,953weekend and holiday · max temperature (°C) 27 · mean load (MW) 44,315weekend and holiday · max temperature (°C) 28 · mean load (MW) 41,383working day · max temperature (°C) 27 · mean load (MW) 48,279working day · max temperature (°C) 28 · mean load (MW) 49,896working day · max temperature (°C) 31 · mean load (MW) 50,629working day · max temperature (°C) 32 · mean load (MW) 51,544working day · max temperature (°C) 30 · mean load (MW) 52,244weekend and holiday · max temperature (°C) 29 · mean load (MW) 47,702weekend and holiday · max temperature (°C) 30 · mean load (MW) 44,422working day · max temperature (°C) 29 · mean load (MW) 51,424working day · max temperature (°C) 31 · mean load (MW) 52,444working day · max temperature (°C) 32 · mean load (MW) 53,277working day · max temperature (°C) 31 · mean load (MW) 53,429working day · max temperature (°C) 28 · mean load (MW) 52,974weekend and holiday · max temperature (°C) 30 · mean load (MW) 49,034weekend and holiday · max temperature (°C) 33 · mean load (MW) 46,368working day · max temperature (°C) 34 · mean load (MW) 54,573working day · max temperature (°C) 32 · mean load (MW) 55,585working day · max temperature (°C) 31 · mean load (MW) 54,696working day · max temperature (°C) 32 · mean load (MW) 55,196working day · max temperature (°C) 29 · mean load (MW) 54,703weekend and holiday · max temperature (°C) 29 · mean load (MW) 49,921weekend and holiday · max temperature (°C) 30 · mean load (MW) 46,244working day · max temperature (°C) 31 · mean load (MW) 53,483working day · max temperature (°C) 31 · mean load (MW) 54,125working day · max temperature (°C) 31 · mean load (MW) 54,136working day · max temperature (°C) 32 · mean load (MW) 54,235working day · max temperature (°C) 31 · mean load (MW) 53,664weekend and holiday · max temperature (°C) 32 · mean load (MW) 48,359weekend and holiday · max temperature (°C) 32 · mean load (MW) 45,120weekend and holiday · max temperature (°C) 30 · mean load (MW) 47,856weekend and holiday · max temperature (°C) 30 · mean load (MW) 47,364working day · max temperature (°C) 30 · mean load (MW) 50,745working day · max temperature (°C) 29 · mean load (MW) 52,042working day · max temperature (°C) 29 · mean load (MW) 52,164weekend and holiday · max temperature (°C) 29 · mean load (MW) 48,481weekend and holiday · max temperature (°C) 33 · mean load (MW) 45,591working day · max temperature (°C) 28 · mean load (MW) 52,587working day · max temperature (°C) 30 · mean load (MW) 53,058working day · max temperature (°C) 30 · mean load (MW) 52,208working day · max temperature (°C) 29 · mean load (MW) 52,614working day · max temperature (°C) 28 · mean load (MW) 52,026weekend and holiday · max temperature (°C) 27 · mean load (MW) 48,471weekend and holiday · max temperature (°C) 22 · mean load (MW) 44,230working day · max temperature (°C) 25 · mean load (MW) 49,763working day · max temperature (°C) 30 · mean load (MW) 50,190working day · max temperature (°C) 24 · mean load (MW) 48,665working day · max temperature (°C) 25 · mean load (MW) 47,097working day · max temperature (°C) 25 · mean load (MW) 47,241weekend and holiday · max temperature (°C) 29 · mean load (MW) 44,390weekend and holiday · max temperature (°C) 26 · mean load (MW) 42,199working day · max temperature (°C) 29 · mean load (MW) 48,139working day · max temperature (°C) 28 · mean load (MW) 49,075working day · max temperature (°C) 25 · mean load (MW) 49,448working day · max temperature (°C) 27 · mean load (MW) 48,583working day · max temperature (°C) 30 · mean load (MW) 49,341weekend and holiday · max temperature (°C) 28 · mean load (MW) 46,301weekend and holiday · max temperature (°C) 27 · mean load (MW) 43,139working day · max temperature (°C) 28 · mean load (MW) 49,690working day · max temperature (°C) 28 · mean load (MW) 49,973working day · max temperature (°C) 31 · mean load (MW) 50,440working day · max temperature (°C) 28 · mean load (MW) 51,374working day · max temperature (°C) 26 · mean load (MW) 50,225weekend and holiday · max temperature (°C) 19 · mean load (MW) 42,676weekend and holiday · max temperature (°C) 20 · mean load (MW) 37,781working day · max temperature (°C) 22 · mean load (MW) 43,655working day · max temperature (°C) 26 · mean load (MW) 45,055working day · max temperature (°C) 29 · mean load (MW) 46,934working day · max temperature (°C) 24 · mean load (MW) 46,582working day · max temperature (°C) 25 · mean load (MW) 45,013weekend and holiday · max temperature (°C) 26 · mean load (MW) 42,827weekend and holiday · max temperature (°C) 28 · mean load (MW) 40,400working day · max temperature (°C) 22 · mean load (MW) 46,187working day · max temperature (°C) 25 · mean load (MW) 46,095working day · max temperature (°C) 24 · mean load (MW) 45,835working day · max temperature (°C) 26 · mean load (MW) 45,273weekend and holiday · max temperature (°C) 26 · mean load (MW) 40,379weekend and holiday · max temperature (°C) 28 · mean load (MW) 40,563weekend and holiday · max temperature (°C) 21 · mean load (MW) 37,423weekend and holiday · max temperature (°C) 22 · mean load (MW) 38,756working day · max temperature (°C) 21 · mean load (MW) 42,627working day · max temperature (°C) 24 · mean load (MW) 43,615working day · max temperature (°C) 27 · mean load (MW) 45,305working day · max temperature (°C) 21 · mean load (MW) 46,317weekend and holiday · max temperature (°C) 25 · mean load (MW) 42,750weekend and holiday · max temperature (°C) 27 · mean load (MW) 39,665working day · max temperature (°C) 24 · mean load (MW) 46,113working day · max temperature (°C) 22 · mean load (MW) 45,316working day · max temperature (°C) 22 · mean load (MW) 43,767weekend and holiday · max temperature (°C) 22 · mean load (MW) 39,261working day · max temperature (°C) 23 · mean load (MW) 40,965weekend and holiday · max temperature (°C) 24 · mean load (MW) 38,893weekend and holiday · max temperature (°C) 23 · mean load (MW) 36,660working day · max temperature (°C) 24 · mean load (MW) 42,296working day · max temperature (°C) 25 · mean load (MW) 43,523working day · max temperature (°C) 26 · mean load (MW) 44,369working day · max temperature (°C) 28 · mean load (MW) 44,794working day · max temperature (°C) 29 · mean load (MW) 46,115weekend and holiday · max temperature (°C) 25 · mean load (MW) 43,341weekend and holiday · max temperature (°C) 17 · mean load (MW) 37,635working day · max temperature (°C) 20 · mean load (MW) 42,096working day · max temperature (°C) 22 · mean load (MW) 42,806working day · max temperature (°C) 22 · mean load (MW) 42,055working day · max temperature (°C) 22 · mean load (MW) 42,460working day · max temperature (°C) 24 · mean load (MW) 42,921weekend and holiday · max temperature (°C) 26 · mean load (MW) 40,633weekend and holiday · max temperature (°C) 27 · mean load (MW) 37,642working day · max temperature (°C) 27 · mean load (MW) 43,675working day · max temperature (°C) 28 · mean load (MW) 44,395working day · max temperature (°C) 26 · mean load (MW) 44,730working day · max temperature (°C) 24 · mean load (MW) 44,693working day · max temperature (°C) 20 · mean load (MW) 44,287weekend and holiday · max temperature (°C) 20 · mean load (MW) 40,164weekend and holiday · max temperature (°C) 25 · mean load (MW) 36,510working day · max temperature (°C) 26 · mean load (MW) 42,071working day · max temperature (°C) 25 · mean load (MW) 43,154working day · max temperature (°C) 26 · mean load (MW) 43,255working day · max temperature (°C) 19 · mean load (MW) 41,524working day · max temperature (°C) 19 · mean load (MW) 41,642weekend and holiday · max temperature (°C) 23 · mean load (MW) 38,985weekend and holiday · max temperature (°C) 21 · mean load (MW) 36,067working day · max temperature (°C) 22 · mean load (MW) 41,937working day · max temperature (°C) 22 · mean load (MW) 43,693working day · max temperature (°C) 26 · mean load (MW) 44,160working day · max temperature (°C) 24 · mean load (MW) 44,662working day · max temperature (°C) 19 · mean load (MW) 44,631weekend and holiday · max temperature (°C) 23 · mean load (MW) 41,515weekend and holiday · max temperature (°C) 20 · mean load (MW) 38,130working day · max temperature (°C) 16 · mean load (MW) 43,325working day · max temperature (°C) 17 · mean load (MW) 43,291working day · max temperature (°C) 16 · mean load (MW) 42,203working day · max temperature (°C) 15 · mean load (MW) 41,212working day · max temperature (°C) 19 · mean load (MW) 40,627weekend and holiday · max temperature (°C) 20 · mean load (MW) 38,459weekend and holiday · max temperature (°C) 19 · mean load (MW) 35,887working day · max temperature (°C) 24 · mean load (MW) 41,335working day · max temperature (°C) 25 · mean load (MW) 42,026working day · max temperature (°C) 24 · mean load (MW) 42,322weekend and holiday · max temperature (°C) 25 · mean load (MW) 40,021working day · max temperature (°C) 26 · mean load (MW) 41,221weekend and holiday · max temperature (°C) 24 · mean load (MW) 38,662weekend and holiday · max temperature (°C) 22 · mean load (MW) 36,265working day · max temperature (°C) 24 · mean load (MW) 42,964working day · max temperature (°C) 18 · mean load (MW) 43,314working day · max temperature (°C) 19 · mean load (MW) 41,131working day · max temperature (°C) 27 · mean load (MW) 41,932working day · max temperature (°C) 22 · mean load (MW) 42,865weekend and holiday · max temperature (°C) 25 · mean load (MW) 39,850weekend and holiday · max temperature (°C) 27 · mean load (MW) 36,293working day · max temperature (°C) 20 · mean load (MW) 41,754working day · max temperature (°C) 15 · mean load (MW) 41,933working day · max temperature (°C) 12 · mean load (MW) 41,330working day · max temperature (°C) 13 · mean load (MW) 40,934working day · max temperature (°C) 17 · mean load (MW) 40,998weekend and holiday · max temperature (°C) 21 · mean load (MW) 37,419weekend and holiday · max temperature (°C) 18 · mean load (MW) 34,059working day · max temperature (°C) 19 · mean load (MW) 39,598working day · max temperature (°C) 23 · mean load (MW) 40,906working day · max temperature (°C) 18 · mean load (MW) 40,027working day · max temperature (°C) 20 · mean load (MW) 41,634working day · max temperature (°C) 22 · mean load (MW) 41,820weekend and holiday · max temperature (°C) 21 · mean load (MW) 38,734weekend and holiday · max temperature (°C) 21 · mean load (MW) 35,213working day · max temperature (°C) 21 · mean load (MW) 40,967working day · max temperature (°C) 22 · mean load (MW) 42,144working day · max temperature (°C) 23 · mean load (MW) 41,929working day · max temperature (°C) 24 · mean load (MW) 42,333working day · max temperature (°C) 24 · mean load (MW) 42,062weekend and holiday · max temperature (°C) 19 · mean load (MW) 38,428weekend and holiday · max temperature (°C) 19 · mean load (MW) 35,113working day · max temperature (°C) 23 · mean load (MW) 41,048working day · max temperature (°C) 25 · mean load (MW) 42,606working day · max temperature (°C) 21 · mean load (MW) 42,843working day · max temperature (°C) 19 · mean load (MW) 42,889working day · max temperature (°C) 17 · mean load (MW) 42,709weekend and holiday · max temperature (°C) 25 · mean load (MW) 39,020weekend and holiday · max temperature (°C) 28 · mean load (MW) 36,018working day · max temperature (°C) 22 · mean load (MW) 42,515working day · max temperature (°C) 20 · mean load (MW) 41,792working day · max temperature (°C) 15 · mean load (MW) 40,661working day · max temperature (°C) 18 · mean load (MW) 41,372working day · max temperature (°C) 23 · mean load (MW) 41,481weekend and holiday · max temperature (°C) 26 · mean load (MW) 38,572weekend and holiday · max temperature (°C) 26 · mean load (MW) 35,207working day · max temperature (°C) 22 · mean load (MW) 41,039working day · max temperature (°C) 19 · mean load (MW) 42,678working day · max temperature (°C) 17 · mean load (MW) 41,972working day · max temperature (°C) 25 · mean load (MW) 42,454working day · max temperature (°C) 25 · mean load (MW) 42,748weekend and holiday · max temperature (°C) 19 · mean load (MW) 38,429weekend and holiday · max temperature (°C) 13 · mean load (MW) 33,993working day · max temperature (°C) 16 · mean load (MW) 39,450working day · max temperature (°C) 18 · mean load (MW) 40,630working day · max temperature (°C) 25 · mean load (MW) 41,211working day · max temperature (°C) 18 · mean load (MW) 41,969working day · max temperature (°C) 18 · mean load (MW) 41,840weekend and holiday · max temperature (°C) 20 · mean load (MW) 39,148weekend and holiday · max temperature (°C) 23 · mean load (MW) 35,971working day · max temperature (°C) 22 · mean load (MW) 42,239working day · max temperature (°C) 23 · mean load (MW) 43,374working day · max temperature (°C) 28 · mean load (MW) 44,075working day · max temperature (°C) 29 · mean load (MW) 45,227working day · max temperature (°C) 32 · mean load (MW) 45,346weekend and holiday · max temperature (°C) 31 · mean load (MW) 42,219weekend and holiday · max temperature (°C) 22 · mean load (MW) 38,034working day · max temperature (°C) 25 · mean load (MW) 43,194working day · max temperature (°C) 18 · mean load (MW) 43,950working day · max temperature (°C) 22 · mean load (MW) 44,153working day · max temperature (°C) 23 · mean load (MW) 44,449working day · max temperature (°C) 19 · mean load (MW) 44,480weekend and holiday · max temperature (°C) 22 · mean load (MW) 40,381weekend and holiday · max temperature (°C) 22 · mean load (MW) 36,583working day · max temperature (°C) 23 · mean load (MW) 42,786working day · max temperature (°C) 25 · mean load (MW) 44,241working day · max temperature (°C) 27 · mean load (MW) 44,198working day · max temperature (°C) 29 · mean load (MW) 44,525working day · max temperature (°C) 28 · mean load (MW) 44,628weekend and holiday · max temperature (°C) 18 · mean load (MW) 39,931weekend and holiday · max temperature (°C) 19 · mean load (MW) 36,618working day · max temperature (°C) 28 · mean load (MW) 43,538working day · max temperature (°C) 27 · mean load (MW) 46,062working day · max temperature (°C) 25 · mean load (MW) 45,272working day · max temperature (°C) 30 · mean load (MW) 45,526working day · max temperature (°C) 19 · mean load (MW) 45,366weekend and holiday · max temperature (°C) 20 · mean load (MW) 41,380weekend and holiday · max temperature (°C) 23 · mean load (MW) 37,917working day · max temperature (°C) 26 · mean load (MW) 44,245working day · max temperature (°C) 24 · mean load (MW) 44,791working day · max temperature (°C) 23 · mean load (MW) 44,146working day · max temperature (°C) 23 · mean load (MW) 44,094working day · max temperature (°C) 30 · mean load (MW) 45,171weekend and holiday · max temperature (°C) 32 · mean load (MW) 42,291weekend and holiday · max temperature (°C) 33 · mean load (MW) 40,399working day · max temperature (°C) 22 · mean load (MW) 46,285working day · max temperature (°C) 18 · mean load (MW) 44,286working day · max temperature (°C) 17 · mean load (MW) 43,634working day · max temperature (°C) 15 · mean load (MW) 41,689working day · max temperature (°C) 18 · mean load (MW) 40,747weekend and holiday · max temperature (°C) 21 · mean load (MW) 37,785weekend and holiday · max temperature (°C) 29 · mean load (MW) 35,829working day · max temperature (°C) 29 · mean load (MW) 42,772working day · max temperature (°C) 31 · mean load (MW) 45,474working day · max temperature (°C) 25 · mean load (MW) 45,323working day · max temperature (°C) 21 · mean load (MW) 45,241working day · max temperature (°C) 27 · mean load (MW) 45,351weekend and holiday · max temperature (°C) 24 · mean load (MW) 41,813weekend and holiday · max temperature (°C) 32 · mean load (MW) 39,207working day · max temperature (°C) 34 · mean load (MW) 47,368working day · max temperature (°C) 22 · mean load (MW) 47,526working day · max temperature (°C) 16 · mean load (MW) 45,221working day · max temperature (°C) 18 · mean load (MW) 44,971working day · max temperature (°C) 18 · mean load (MW) 44,659weekend and holiday · max temperature (°C) 25 · mean load (MW) 41,012weekend and holiday · max temperature (°C) 30 · mean load (MW) 38,662working day · max temperature (°C) 26 · mean load (MW) 45,987working day · max temperature (°C) 24 · mean load (MW) 46,159working day · max temperature (°C) 22 · mean load (MW) 45,273working day · max temperature (°C) 29 · mean load (MW) 46,160working day · max temperature (°C) 32 · mean load (MW) 47,812weekend and holiday · max temperature (°C) 22 · mean load (MW) 44,310weekend and holiday · max temperature (°C) 15 · mean load (MW) 37,170working day · max temperature (°C) 18 · mean load (MW) 40,341working day · max temperature (°C) 19 · mean load (MW) 40,421working day · max temperature (°C) 21 · mean load (MW) 40,663working day · max temperature (°C) 23 · mean load (MW) 41,268working day · max temperature (°C) 24 · mean load (MW) 42,372weekend and holiday · max temperature (°C) 30 · mean load (MW) 41,042weekend and holiday · max temperature (°C) 31 · mean load (MW) 39,394working day · max temperature (°C) 21 · mean load (MW) 45,150working day · max temperature (°C) 19 · mean load (MW) 45,894working day · max temperature (°C) 26 · mean load (MW) 46,803working day · max temperature (°C) 18 · mean load (MW) 45,600working day · max temperature (°C) 20 · mean load (MW) 43,930weekend and holiday · max temperature (°C) 28 · mean load (MW) 40,828weekend and holiday · max temperature (°C) 21 · mean load (MW) 38,920working day · max temperature (°C) 26 · mean load (MW) 44,463working day · max temperature (°C) 27 · mean load (MW) 45,498working day · max temperature (°C) 29 · mean load (MW) 46,878working day · max temperature (°C) 20 · mean load (MW) 45,241working day · max temperature (°C) 23 · mean load (MW) 45,166weekend and holiday · max temperature (°C) 26 · mean load (MW) 42,120weekend and holiday · max temperature (°C) 19 · mean load (MW) 36,797working day · max temperature (°C) 21 · mean load (MW) 41,871working day · max temperature (°C) 23 · mean load (MW) 43,877working day · max temperature (°C) 28 · mean load (MW) 45,394working day · max temperature (°C) 26 · mean load (MW) 46,663working day · max temperature (°C) 23 · mean load (MW) 46,683weekend and holiday · max temperature (°C) 24 · mean load (MW) 41,609weekend and holiday · max temperature (°C) 25 · mean load (MW) 40,389working day · max temperature (°C) 27 · mean load (MW) 47,604working day · max temperature (°C) 24 · mean load (MW) 47,148working day · max temperature (°C) 24 · mean load (MW) 45,159weekend and holiday · max temperature (°C) 22 · mean load (MW) 41,903working day · max temperature (°C) 30 · mean load (MW) 44,822weekend and holiday · max temperature (°C) 28 · mean load (MW) 44,059weekend and holiday · max temperature (°C) 23 · mean load (MW) 40,643working day · max temperature (°C) 22 · mean load (MW) 45,204working day · max temperature (°C) 22 · mean load (MW) 44,804working day · max temperature (°C) 23 · mean load (MW) 45,032working day · max temperature (°C) 24 · mean load (MW) 45,668working day · max temperature (°C) 28 · mean load (MW) 46,945weekend and holiday · max temperature (°C) 30 · mean load (MW) 44,042weekend and holiday · max temperature (°C) 31 · mean load (MW) 41,680working day · max temperature (°C) 29 · mean load (MW) 49,318working day · max temperature (°C) 28 · mean load (MW) 50,782working day · max temperature (°C) 28 · mean load (MW) 48,805working day · max temperature (°C) 23 · mean load (MW) 47,124working day · max temperature (°C) 27 · mean load (MW) 46,305weekend and holiday · max temperature (°C) 29 · mean load (MW) 44,084weekend and holiday · max temperature (°C) 32 · mean load (MW) 41,485working day · max temperature (°C) 28 · mean load (MW) 47,040working day · max temperature (°C) 22 · mean load (MW) 46,980working day · max temperature (°C) 28 · mean load (MW) 46,008working day · max temperature (°C) 29 · mean load (MW) 47,592working day · max temperature (°C) 29 · mean load (MW) 48,636weekend and holiday · max temperature (°C) 26 · mean load (MW) 44,699weekend and holiday · max temperature (°C) 26 · mean load (MW) 40,642working day · max temperature (°C) 30 · mean load (MW) 48,081working day · max temperature (°C) 30 · mean load (MW) 49,293working day · max temperature (°C) 18 · mean load (MW) 44,702working day · max temperature (°C) 21 · mean load (MW) 43,269working day · max temperature (°C) 22 · mean load (MW) 43,503weekend and holiday · max temperature (°C) 26 · mean load (MW) 40,806weekend and holiday · max temperature (°C) 32 · mean load (MW) 39,315working day · max temperature (°C) 32 · mean load (MW) 45,234working day · max temperature (°C) 33 · mean load (MW) 47,067working day · max temperature (°C) 33 · mean load (MW) 44,867weekend and holiday · max temperature (°C) 35 · mean load (MW) 40,745working day · max temperature (°C) 34 · mean load (MW) 46,933weekend and holiday · max temperature (°C) 34 · mean load (MW) 46,604weekend and holiday · max temperature (°C) 35 · mean load (MW) 44,606working day · max temperature (°C) 31 · mean load (MW) 48,437working day · max temperature (°C) 33 · mean load (MW) 49,242working day · max temperature (°C) 31 · mean load (MW) 45,291

max temperature (°C) × mean load (MW)

Dashed line: the two-line fit, using working days only.

03

Forecasting tomorrow

QuestionWhich model best forecasts next-day load, and does temperature help?

Decision and whyTraining from 2025-01-08 to 2025-09-30 and testing from 2025-10-01 to 2025-12-31, always in the future relative to training. I compared six models, from the simplest (repeat the same hour last week) to gradient boosting with temperature and the load from two days earlier, which is already known when the forecast is made. Metric: mean absolute percentage error (MAPE), overall and on the hottest 10% of days.

ResultThe best model errs by 4.0% on average, 40% less than repeating last week (6.7%). On hot days, where error costs most, it also wins: 6.1% versus 8.4%. Lesson: the temperature line, which looked like the cleanest explanation, got worse out of sample (11.7% on hot days), because the relationship learned from January to September did not hold at year end. The recent load level corrects that shift.

Source: ONS × INMET · analises/energia.py (scikit-learn)

Analysis technical sheet
Objective
Forecast next-day load with less error than the naive method, hot days included.
Why
Each point of error becomes unnecessary generation or expensive short-term purchase; hot days are where error costs most.
Target variable
Hourly load (MW).
Predictors / explanatory variables
Hour, weekday, holiday, working day, temperature, degrees above 23.5 °C, load 2 and 7 days earlier.
Method
Six models, from naive to gradient boosting (HistGradientBoosting).
Metric
MAPE overall and on the hottest 10% of days; permutation importance.
Validation
Train Jan–Sep, test Oct–Dec (in the future); observed temperature as an upper bound of a weather forecast.
Objective reached?
Yes: MAPE 4.0% (6.7% naive) and 6.1% on hot days (8.4%).

Day-ahead forecast error (MAPE)

  • all days
  • hottest 10%
same hour, last week: all days 6.7 % · hottest 10% 8.4 %same hour, last week6.7 %8.4 %calendar regression: all days 5.0 % · hottest 10% 7.3 %calendar regression5.0 %7.3 %calendar + temperature curve: all days 5.6 % · hottest 10% 11.7 %calendar + temperature curve5.6 %11.7 %boosting without temperature: all days 6.2 % · hottest 10% 8.0 %boosting without temperature6.2 %8.0 %boosting with temperature: all days 5.0 % · hottest 10% 7.4 %boosting with temperature5.0 %7.4 %boosting + temperature + recent level: all days 4.0 % · hottest 10% 6.1 %boosting + temperature + re…4.0 %6.1 %

Hottest test week, from 2025-12-23 (MW)

  • actual
  • best model
  • last week
30,000 MW35,000 MW40,000 MW45,000 MW50,000 MW55,000 MW60,000 MWactual · 23/12: 44,914 MWactual · : 42,458 MWactual · : 40,777 MWactual · : 39,918 MWactual · : 39,470 MWactual · : 39,330 MWactual · : 40,532 MWactual · : 42,516 MWactual · : 44,855 MWactual · : 46,498 MWactual · : 48,087 MWactual · : 49,231 MWactual · : 49,322 MWactual · : 49,533 MWactual · : 49,813 MWactual · : 50,658 MWactual · : 50,544 MWactual · : 49,786 MWactual · : 50,331 MWactual · : 53,283 MWactual · : 53,327 MWactual · : 52,853 MWactual · : 51,837 MWactual · : 49,723 MWactual · 23/12: 47,107 MWactual · : 44,597 MWactual · : 42,719 MWactual · : 41,573 MWactual · : 40,883 MWactual · : 40,037 MWactual · : 40,473 MWactual · : 41,488 MWactual · : 42,997 MWactual · : 43,783 MWactual · : 44,737 MWactual · : 46,057 MWactual · : 46,177 MWactual · : 45,795 MWactual · : 45,307 MWactual · : 45,394 MWactual · : 45,793 MWactual · : 46,803 MWactual · : 48,824 MWactual · : 52,160 MWactual · : 50,467 MWactual · : 46,987 MWactual · : 44,161 MWactual · : 42,501 MWactual · 23/12: 41,505 MWactual · : 41,453 MWactual · : 41,186 MWactual · : 40,364 MWactual · : 39,454 MWactual · : 37,878 MWactual · : 37,172 MWactual · : 36,978 MWactual · : 36,946 MWactual · : 37,262 MWactual · : 38,062 MWactual · : 39,282 MWactual · : 39,054 MWactual · : 37,748 MWactual · : 36,914 MWactual · : 37,113 MWactual · : 38,317 MWactual · : 40,104 MWactual · : 42,841 MWactual · : 46,864 MWactual · : 48,226 MWactual · : 48,607 MWactual · : 48,143 MWactual · : 46,414 MWactual · 23/12: 44,464 MWactual · : 42,752 MWactual · : 41,397 MWactual · : 40,429 MWactual · : 39,938 MWactual · : 39,552 MWactual · : 40,401 MWactual · : 41,991 MWactual · : 43,952 MWactual · : 45,603 MWactual · : 46,887 MWactual · : 48,440 MWactual · : 49,524 MWactual · : 49,554 MWactual · : 48,977 MWactual · : 49,481 MWactual · : 50,030 MWactual · : 49,808 MWactual · : 50,422 MWactual · : 53,265 MWactual · : 53,701 MWactual · : 53,332 MWactual · : 52,179 MWactual · : 50,317 MWactual · 23/12: 48,118 MWactual · : 46,090 MWactual · : 44,460 MWactual · : 43,184 MWactual · : 42,621 MWactual · : 41,699 MWactual · : 42,045 MWactual · : 42,722 MWactual · : 43,692 MWactual · : 44,541 MWactual · : 45,492 MWactual · : 46,719 MWactual · : 46,958 MWactual · : 46,430 MWactual · : 46,139 MWactual · : 46,651 MWactual · : 46,919 MWactual · : 47,971 MWactual · : 49,829 MWactual · : 52,591 MWactual · : 52,423 MWactual · : 51,634 MWactual · : 50,562 MWactual · : 49,015 MWactual · 23/12: 46,974 MWactual · : 45,085 MWactual · : 43,600 MWactual · : 42,485 MWactual · : 41,566 MWactual · : 40,527 MWactual · : 40,021 MWactual · : 39,555 MWactual · : 40,066 MWactual · : 40,855 MWactual · : 42,037 MWactual · : 43,482 MWactual · : 44,186 MWactual · : 43,381 MWactual · : 43,168 MWactual · : 43,989 MWactual · : 44,833 MWactual · : 46,579 MWactual · : 48,247 MWactual · : 50,781 MWactual · : 50,886 MWactual · : 50,581 MWactual · : 49,705 MWactual · : 47,942 MWactual · 23/12: 45,745 MWactual · : 43,842 MWactual · : 42,490 MWactual · : 41,589 MWactual · : 41,255 MWactual · : 41,052 MWactual · : 42,267 MWactual · : 44,184 MWactual · : 46,571 MWactual · : 48,046 MWactual · : 48,989 MWactual · : 50,078 MWactual · : 50,416 MWactual · : 51,309 MWactual · : 51,704 MWactual · : 51,588 MWactual · : 51,543 MWactual · : 51,044 MWactual · : 51,223 MWactual · : 53,879 MWactual · : 54,661 MWactual · : 54,560 MWactual · : 53,343 MWactual · : 51,118 MWbest model · 23/12: 47,365 MWbest model · : 44,814 MWbest model · : 43,213 MWbest model · : 43,377 MWbest model · : 43,365 MWbest model · : 43,323 MWbest model · : 45,597 MWbest model · : 48,227 MWbest model · : 48,757 MWbest model · : 50,800 MWbest model · : 52,301 MWbest model · : 54,772 MWbest model · : 54,481 MWbest model · : 54,110 MWbest model · : 53,796 MWbest model · : 54,919 MWbest model · : 56,176 MWbest model · : 54,977 MWbest model · : 55,860 MWbest model · : 55,983 MWbest model · : 55,984 MWbest model · : 55,959 MWbest model · : 54,640 MWbest model · : 52,446 MWbest model · 23/12: 46,845 MWbest model · : 45,091 MWbest model · : 44,064 MWbest model · : 43,066 MWbest model · : 43,064 MWbest model · : 42,916 MWbest model · : 44,505 MWbest model · : 45,602 MWbest model · : 48,378 MWbest model · : 50,210 MWbest model · : 49,275 MWbest model · : 48,838 MWbest model · : 48,478 MWbest model · : 49,385 MWbest model · : 50,074 MWbest model · : 50,111 MWbest model · : 50,029 MWbest model · : 50,381 MWbest model · : 51,977 MWbest model · : 55,845 MWbest model · : 55,397 MWbest model · : 54,919 MWbest model · : 51,991 MWbest model · : 50,336 MWbest model · 23/12: 45,413 MWbest model · : 43,511 MWbest model · : 42,419 MWbest model · : 41,386 MWbest model · : 40,246 MWbest model · : 39,452 MWbest model · : 39,687 MWbest model · : 39,386 MWbest model · : 41,751 MWbest model · : 42,806 MWbest model · : 42,966 MWbest model · : 43,763 MWbest model · : 44,033 MWbest model · : 44,717 MWbest model · : 44,684 MWbest model · : 44,255 MWbest model · : 44,685 MWbest model · : 45,112 MWbest model · : 47,649 MWbest model · : 49,496 MWbest model · : 50,008 MWbest model · : 49,298 MWbest model · : 49,780 MWbest model · : 46,427 MWbest model · 23/12: 49,564 MWbest model · : 45,783 MWbest model · : 44,915 MWbest model · : 43,356 MWbest model · : 42,559 MWbest model · : 42,738 MWbest model · : 43,810 MWbest model · : 44,856 MWbest model · : 47,131 MWbest model · : 47,889 MWbest model · : 49,786 MWbest model · : 49,936 MWbest model · : 49,808 MWbest model · : 49,445 MWbest model · : 49,688 MWbest model · : 49,691 MWbest model · : 49,447 MWbest model · : 48,838 MWbest model · : 51,172 MWbest model · : 54,194 MWbest model · : 52,566 MWbest model · : 50,276 MWbest model · : 47,111 MWbest model · : 45,627 MWbest model · 23/12: 43,900 MWbest model · : 44,380 MWbest model · : 43,284 MWbest model · : 41,860 MWbest model · : 40,435 MWbest model · : 38,784 MWbest model · : 38,538 MWbest model · : 38,353 MWbest model · : 38,751 MWbest model · : 39,464 MWbest model · : 39,198 MWbest model · : 39,631 MWbest model · : 38,979 MWbest model · : 38,637 MWbest model · : 38,323 MWbest model · : 37,949 MWbest model · : 38,920 MWbest model · : 40,295 MWbest model · : 44,263 MWbest model · : 47,831 MWbest model · : 49,855 MWbest model · : 47,937 MWbest model · : 47,186 MWbest model · : 44,802 MWbest model · 23/12: 44,432 MWbest model · : 41,686 MWbest model · : 39,787 MWbest model · : 37,997 MWbest model · : 37,555 MWbest model · : 36,531 MWbest model · : 35,365 MWbest model · : 35,822 MWbest model · : 36,025 MWbest model · : 37,192 MWbest model · : 39,282 MWbest model · : 40,957 MWbest model · : 41,637 MWbest model · : 40,962 MWbest model · : 40,807 MWbest model · : 40,754 MWbest model · : 42,524 MWbest model · : 44,577 MWbest model · : 45,958 MWbest model · : 50,305 MWbest model · : 51,393 MWbest model · : 50,834 MWbest model · : 50,209 MWbest model · : 48,271 MWbest model · 23/12: 46,476 MWbest model · : 45,939 MWbest model · : 43,896 MWbest model · : 43,769 MWbest model · : 44,193 MWbest model · : 44,694 MWbest model · : 47,086 MWbest model · : 47,221 MWbest model · : 48,834 MWbest model · : 51,344 MWbest model · : 53,247 MWbest model · : 53,269 MWbest model · : 52,723 MWbest model · : 54,986 MWbest model · : 55,071 MWbest model · : 55,231 MWbest model · : 54,662 MWbest model · : 54,531 MWbest model · : 53,324 MWbest model · : 56,092 MWbest model · : 56,180 MWbest model · : 55,980 MWbest model · : 54,029 MWbest model · : 52,366 MWlast week · 23/12: 45,660 MWlast week · : 43,262 MWlast week · : 41,803 MWlast week · : 40,982 MWlast week · : 40,930 MWlast week · : 41,321 MWlast week · : 43,881 MWlast week · : 47,694 MWlast week · : 50,708 MWlast week · : 52,659 MWlast week · : 54,066 MWlast week · : 53,944 MWlast week · : 51,855 MWlast week · : 51,858 MWlast week · : 52,740 MWlast week · : 53,538 MWlast week · : 53,789 MWlast week · : 52,001 MWlast week · : 52,400 MWlast week · : 54,235 MWlast week · : 53,694 MWlast week · : 52,617 MWlast week · : 50,238 MWlast week · : 47,155 MWlast week · 23/12: 44,223 MWlast week · : 42,073 MWlast week · : 40,419 MWlast week · : 39,578 MWlast week · : 39,433 MWlast week · : 39,916 MWlast week · : 41,416 MWlast week · : 43,498 MWlast week · : 45,037 MWlast week · : 45,989 MWlast week · : 46,157 MWlast week · : 45,312 MWlast week · : 44,217 MWlast week · : 45,386 MWlast week · : 46,371 MWlast week · : 46,971 MWlast week · : 47,091 MWlast week · : 46,834 MWlast week · : 47,950 MWlast week · : 49,787 MWlast week · : 49,369 MWlast week · : 47,793 MWlast week · : 45,459 MWlast week · : 42,572 MWlast week · 23/12: 40,047 MWlast week · : 37,794 MWlast week · : 36,458 MWlast week · : 35,834 MWlast week · : 35,997 MWlast week · : 36,689 MWlast week · : 38,704 MWlast week · : 41,625 MWlast week · : 43,457 MWlast week · : 44,136 MWlast week · : 44,428 MWlast week · : 44,191 MWlast week · : 44,001 MWlast week · : 44,954 MWlast week · : 45,764 MWlast week · : 46,693 MWlast week · : 47,331 MWlast week · : 47,098 MWlast week · : 47,922 MWlast week · : 49,834 MWlast week · : 49,310 MWlast week · : 48,012 MWlast week · : 45,694 MWlast week · : 42,474 MWlast week · 23/12: 39,420 MWlast week · : 37,148 MWlast week · : 35,903 MWlast week · : 35,340 MWlast week · : 35,532 MWlast week · : 36,544 MWlast week · : 38,933 MWlast week · : 41,705 MWlast week · : 44,206 MWlast week · : 45,726 MWlast week · : 46,435 MWlast week · : 46,349 MWlast week · : 46,250 MWlast week · : 46,712 MWlast week · : 46,302 MWlast week · : 46,310 MWlast week · : 46,187 MWlast week · : 46,412 MWlast week · : 47,811 MWlast week · : 49,807 MWlast week · : 48,864 MWlast week · : 47,590 MWlast week · : 45,563 MWlast week · : 43,030 MWlast week · 23/12: 40,158 MWlast week · : 38,106 MWlast week · : 36,595 MWlast week · : 35,747 MWlast week · : 35,617 MWlast week · : 35,244 MWlast week · : 36,411 MWlast week · : 38,271 MWlast week · : 39,871 MWlast week · : 41,235 MWlast week · : 42,234 MWlast week · : 41,654 MWlast week · : 40,637 MWlast week · : 40,031 MWlast week · : 39,818 MWlast week · : 39,982 MWlast week · : 41,206 MWlast week · : 43,068 MWlast week · : 45,509 MWlast week · : 48,320 MWlast week · : 47,622 MWlast week · : 45,871 MWlast week · : 44,137 MWlast week · : 41,995 MWlast week · 23/12: 39,876 MWlast week · : 37,806 MWlast week · : 36,097 MWlast week · : 35,094 MWlast week · : 34,690 MWlast week · : 33,578 MWlast week · : 33,451 MWlast week · : 33,666 MWlast week · : 34,255 MWlast week · : 35,631 MWlast week · : 37,617 MWlast week · : 38,911 MWlast week · : 39,015 MWlast week · : 38,152 MWlast week · : 37,297 MWlast week · : 38,139 MWlast week · : 40,054 MWlast week · : 42,771 MWlast week · : 44,894 MWlast week · : 47,628 MWlast week · : 47,691 MWlast week · : 47,245 MWlast week · : 46,059 MWlast week · : 43,943 MWlast week · 23/12: 41,491 MWlast week · : 39,377 MWlast week · : 37,960 MWlast week · : 37,150 MWlast week · : 37,099 MWlast week · : 37,308 MWlast week · : 39,002 MWlast week · : 41,202 MWlast week · : 43,745 MWlast week · : 45,238 MWlast week · : 46,460 MWlast week · : 47,403 MWlast week · : 47,425 MWlast week · : 48,379 MWlast week · : 48,621 MWlast week · : 48,096 MWlast week · : 48,552 MWlast week · : 48,178 MWlast week · : 49,044 MWlast week · : 52,120 MWlast week · : 52,160 MWlast week · : 51,777 MWlast week · : 50,307 MWlast week · : 47,514 MW23/12

The week includes Christmas. On the 25th the model errs most (about 9% above actual): holidays are few in training and each has its own shape.

What the best model uses (permutation importance)

load 2 days earlier: error increase without the variable 2.8 %load 2 days earlier2.8 %hour of day: error increase without the variable 1.8 %hour of day1.8 %day of week: error increase without the variable 1.6 %day of week1.6 %temperature: error increase without the variable 1.4 %temperature1.4 %load 7 days earlier: error increase without the variable 1.3 %load 7 days earlier1.3 %working day: error increase without the variable 1.2 %working day1.2 %holiday: error increase without the variable 0.1 %holiday0.1 %

How much MAPE rises when the variable is shuffled in the test set.

What each dataset contributed

  1. ONS hourly load: the shape of the day and the weight of the calendar (working day, holiday).
  2. INMET temperature: the air-conditioning break point and what each degree costs in MW.
  3. Recent load: the most important variable, following level shifts the calendar cannot see.
  4. Testing in the future: showed that the nicest model in training was not the best outside it.

Limits of this analysis

  • I use the observed temperature as if it were the weather forecast: it is the upper bound of the gain. With a real forecast, error would be somewhat higher.
  • Two São Paulo stations stand in for a subsystem stretching from Minas Gerais to the Centre-West.
  • One year of data: it captures neither multi-year trend nor drought years.

Analysis code: analises/energia.py