Market Aggregates
What are Market Aggregates for?
Market aggregates, especially used with weighting such as capacity weighting, are useful proxies to estimate how differences in forecasts - either between models or between different forecasts of the same model - impact energy production & consumption.
Imagine you are comparing the latest 12PM forecast of EPT against the 6 AM forecast. In Deckenpfronn, Germany, there is a huge difference in prediction for 100m wind speed. But since there is no wind park in Deckenpfronn this difference in wind speed will have no impact at the energy production at all. However, differences in wind speed at for example Reussenkoge Wind Farm, with a production capacity of over 250 MW, will have significant impacts on the energy output.
This is why we offer to compute capacity weighted averages for both solar and wind parameters. The averages are computed as
Where is the value of the variable (e.g. wind speed) at a specific location (e.g. a wind farm), is the production capacity at that location and is the total production capacity of the selected region.
Output MW Mode
By adding unit=mw to the GET /v1/forecast/market-aggregate endpoint, the query engine applies generic power curves to weather forecasts and returns predicted megawatts (MW) instead of raw weather values. This is useful for comparing different models and quick MW estimates across many European zones.
MW mode is available on both endpoints:
GET /v1/forecast/market-aggregate?unit=mw&...POST /v1/forecast/datawithweighting.unit=mwin the body
MW mode:
Activated by setting
unit=mw(GET query parameter) orweighting.unit="mw"(POST body)Three weighting types are supported. In MW mode the
variablesfield does not change the result — each weighting always produces the same MW columns:weighting=wind_capacity→ returnswind_onshore_mw,wind_offshore_mw(orwind_total_mwfor combined-only zones such as GB)weighting=solar_capacity→ returnssolar_mwweighting=population→ returnsload_mw(electricity-demand forecast)
To retrieve weather values at a specific height (e.g. 10m wind), use weather mode instead (omit
unit=mw)Restricts geo to
market_zoneorcountry_key(no polygon or bounding box)Only available for zones listed under MW-Capable Zones below
Weighting is auto-derived from the requested variable on the GET endpoint (wind speed →
wind_capacity, shortwave flux →solar_capacity, 2m temperature →population)Wind and solar can be selected simultaneously on the GET endpoint; the backend issues separate queries per variable and merges
When
merge_zones_or_countriesis enabled, MW values are summed across zones
Optional MW debiasing
MW output is raw by default if you omit debias. Examples on this page pass debias=true so new integrations get the walk-forward correction. Set debias=true on GET /v1/forecast/market-aggregate to apply the same walk-forward additive MW bias correction used by Power Forecast: eight weeks of history for wind and four weeks for solar and load to estimate the bias for each init time and lead; that bias is subtracted from the current forecast, then the window moves ahead.
debias=true requires unit=mw and market_zones. It is not supported with country_keys or weather units.
For POST /v1/forecast/data, use the corresponding request-body field:
Historical periods with negative day-ahead prices are left out of the bias estimate. Omitting the option—or setting it to false—returns the unchanged raw MW forecast.
Example: Wind MW Forecast
Example: Load (Demand) Forecast
A population-weighted electricity-demand forecast in MW, produced by applying a temperature-driven load curve to 2m air temperature.
The same query expressed against POST /v1/forecast/data:
Load forecasts are available for ~48 zones today. Query GET /v1/forecast/market-aggregate/mw-zones and read the load key for the current list.
Example: Get Available MW Zones
The keys break down as:
wind— zones that supportwind_capacityweighting; output may includewind_onshore_mwand/orwind_offshore_mw.wind_combined— zones (today:GBonly) that store wind capacity as a single combined value rather than split into onshore/offshore; output iswind_total_mw.wind_onshore_only— subset ofwindzones that only have onshore capacity data fitted; output iswind_onshore_mwonly.solar— zones that supportsolar_capacityweighting; output issolar_mw.load— zones that have a fitted population-weighted load curve; output isload_mwwhenweighting=populationandunit=mw.
MW-Capable Zones
The list is dynamic and grows over time as new zones are onboarded. Always query the mw-zones endpoint for the current set rather than hard-coding a list.
MW Column Names
When MW mode is enabled, output columns are renamed:
wind_onshore_mw
Wind Onshore MW
MW
wind_capacity
wind_offshore_mw
Wind Offshore MW
MW
wind_capacity
wind_total_mw
Wind Total MW
MW
wind_capacity (combined-only zones)
solar_mw
Solar MW
MW
solar_capacity
load_mw
Load MW
MW
population
Variable-to-Weighting Mapping
When not using MW mode, the weighting field is applied based on the variable:
wind_speed_at_height_level_100m
wind_capacity
wind_speed_at_height_level_10m
wind_capacity
surface_downwelling_shortwave_flux_sum_1h
solar_capacity
air_temperature_at_height_level_2m
population
Aggregation Periods and Column Naming
Daily and weekly aggregation is requested as a group_by entry on POST /v1/forecast/data — for example time__to_start_of(day) or time__to_start_of(week). The GET /v1/forecast/market-aggregate endpoint has no aggregation-period parameter (temporal_resolution resamples; it is not the same as daily/weekly bucketing).
Market aggregate responses use an avg__ prefix on variable columns. The response time column stays named time in every case — only the row count and the snapped timestamps change:
Hourly (
group_byincludestime):avg__wind_speed_at_height_level_100m, time columntimeDaily (
group_byincludestime__to_start_of(day)):avg__wind_speed_at_height_level_100m, time column stilltime(timestamps snapped to day start)Weekly (
group_byincludestime__to_start_of(week)):avg__wind_speed_at_height_level_100m, time column stilltime(timestamps snapped to week start)
In MW mode, columns use entirely different names (see MW Column Names above).
Accessing Market Aggregates
There are two ways to access market aggregates:
Making a request to
GET https://query.jua.ai/v1/forecast/market-aggregateUsing
POST https://query.jua.ai/v1/forecast/datawhich allows selecting custom regions such as polygons and bounding boxes
Using the `market-aggregate` endpoint
A convenient GET endpoint that allows fast and easy access to one or multiple market zones.
Using the generic `data` endpoint
While adding slightly more overhead to the query, the data endpoint provides more flexibility such as defining custom regions using polygons and bounding boxes. The example below is equivalent to the request to the market-aggregate endpoint above.
Countries with Regional Zones
Some countries don't have a single zone code — use their regional zones instead:
Italy
IT-CNO, IT-CSO, IT-NO, IT-SAR, IT-SIC, IT-SO
Norway
NO-NO1, NO-NO2, NO-NO3, NO-NO4, NO-NO5
Sweden
SE-SE1, SE-SE2, SE-SE3, SE-SE4
Denmark
DK-BHM, DK-DK1, DK-DK2
Japan
JP-CB, JP-CG, JP-HKD, JP-HR, JP-KN, JP-KY, JP-ON, JP-SK, JP-TH, JP-TK
Countries with single zone codes: DE, FR, GB, NL, PL, ES, BE, AT, CH, CZ, PT, GR, IE
Last updated