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.
There are two ways to access market aggregates:
Making a request to
GET https://query.jua.ai/v1/forecasts/market-aggregatesUsing
POST https://query.jua.ai/v1/forecasts/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.
curl -X GET "https://query.jua.ai/v1/forecast/market-aggregate\
?models=ept2\
&init_time=2025-10-22T00:00:00Z\
&weighting=wind_capacity\
&market_zones=DE\
&variables=wind_speed_at_height_level_100m\
&max_prediction_timedelta=72\
&include_time=true \
-H "X-API-Key: YOUR_API_KEY" \
-H "Accept: application/json"import requests
url = "https://query.jua.ai/v1/forecast/market-aggregate"
headers = {
"X-API-Key": "YOUR_API_KEY",
"Accept": "application/json"
}
params = {
"models": "ept2",
"init_time": "2025-10-22T00:00:00Z",
"weighting": "wind_capacity",
"market_zones": ["DE"], # Germany
"variables": ["wind_speed_at_height_level_100m"],
"max_prediction_timedelta": 72, # hours
"include_time": True,
}
response = requests.get(url, headers=headers, params=params)
data = response.json()const url = new URL("https://query.jua.ai/v1/forecast/market-aggregate");
url.searchParams.append("models", "ept2");
url.searchParams.append("init_time", "2025-10-22T00:00:00Z");
url.searchParams.append("weighting", "wind_capacity");
url.searchParams.append("market_zones", "DE");
url.searchParams.append("variables", "wind_speed_at_height_level_100m");
url.searchParams.append("max_prediction_timedelta", "2880");
url.searchParams.append("include_time", "true");
const response = await fetch(url, {
method: "GET",
headers: {
"X-API-Key": "YOUR_API_KEY",
Accept: "application/json",
},
});
const data = await response.json();{
"model": [
"ept2",
"ept2",
71 more entries...
],
"init_time": ["2025-10-22T00:00:00Z", ...],
"prediction_timedelta": [0, 1, ...., 72],
"time": ["2025-10-22T00:00:00Z", "2025-10-22T01:00:00Z", ...],
"avg__wind_speed_at_height_level_100m": [0.23, 0.51, ...]
} 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.
import requests
url = "https://query.jua.ai/v1/forecast/data"
headers = {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json"
}
params = {
"format": "json"
}
payload = {
"models": ["ept2"],
"geo": {
"type": "market_zone",
"value": ["DE"]
},
"variables": ["wind_speed_at_height_level_100m"],
"init_time": "2025-10-22T00:00:00Z",
"prediction_timedelta": {
"start": 0,
"end": 72
},
"weighting": {
"type": "wind_capacity"
},
"group_by": ["model", "init_time", "prediction_timedelta", "time"],
}
response = requests.post(url, headers=headers, params=params, json=payload)
data = response.json()const url = "https://query.jua.ai/v1/forecast/data?format=json";
const payload = {
models: ["ept2"],
geo: {
type: "market_zone",
value: ["DE"],
},
variables: ["wind_speed_at_height_level_100m"],
init_time: "2025-10-22T00:00:00Z",
prediction_timedelta: {
start: 0,
end: 72,
},
weighting: {
type: "wind_capacity",
},
group_by: ["model", "init_time", "prediction_timedelta", "time"],
};
const response = await fetch(url, {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
Accept: "application/json",
},
body: JSON.stringify(payload),
});
const data = await response.json();{
"model": [
"ept2",
"ept2",
71 more entries...
],
"init_time": ["2025-10-08T00:00:00Z", ...],
"prediction_timedelta": [0, 1, ...., 72],
"avg__wind_speed_at_height_level_100m": [285.34, 285.91, ...],
}Last updated