Forecasting
Reducing the Potential for Generation Redispatch
The pan-European electricity market enables competitive wholesale and retail exchange of electricity while ensuring the security of the electric grid. The market design supports both day-ahead and intraday electricity exchanges that require accurate electricity consumption and generation forecasts to ensure safe and cost-effective grid operations. The day-ahead market establishes an initial schedule of generation resources required to meet the anticipated day-ahead electricity consumption. The intraday market provides for electricity exchanges to clear current day energy imbalances. As a last resort, Transmission System Operators (TSOs) redispatch generation to relieve congestion bottlenecks and maintain system security.
Over the period of 2015 through 2019, the cost of Germany’s generation redispatch averaged a little under €1 billion per year. To help manage the cost of redispatch in the face of the rapid deployment of renewable generation, Germany’s Redispatch 2.0 guidelines allow German TSOs to throttle down grid-connected wind, solar, and combined heat and power generation if other redispatch options are more costly. To assess all possible redispatch options, German Distribution System Operators (DSOs) are required to submit to their respective Transmission System Operator (TSO) day-ahead and intraday forecasts of generation (> 100 KW) and consumption within their distribution system. The DSO forecasts are critical inputs to network models that redispatch grid and non-grid connected generation (for example, centralized dispatched load control) to meet consumption subject to transmission and distribution system operating constraints.
Day-ahead and intraday consumption forecasts are developed generally using techniques from two broad classes of load forecast frameworks:
A useful way of thinking of a load forecast is to look at it as an average of historical load data under similar calendar, economic, weather and solar conditions as the day being forecasted. From the perspective of an event like COVID-19, the challenge is that the historical data upon which the load forecasts are constructed are not under the same economic conditions as those prevailing under lockdown mandates imposed by countries to curb the spread of COVID-19. Although lockdown policies vary across Europe, in general, the policies have led to school closures and reduced operations or closures of non-essential businesses. Many other businesses have a large portion of their employees working remotely from home. The net effect is a shift of weekday electricity consumption from the nonresidential sector to the residential sector. For DSOs and TSOs operating in countries with lockdown mandates in place, there has been an evolution of the system load shape toward a residential load pattern. Day-ahead and intraday load forecast frameworks that do not adapt to the shift in load patterns will realize an erosion of forecast performance. This adds pressure on system operators to continually evaluate their generation dispatch plans to ensure all energy imbalances are cleared.
Dr. Frank Monforte, Director of Forecasting Solutions at Itron, recently wrote a white paper that presents a framework for improving day-ahead and intraday consumption forecasts in the face of existing COVID-19 lockdown mitigation policies, as well as when the lockdown policies are relaxed to allow for a re-opening of Europe’s economies. Historical hourly load data for 10 countries spanning the pan-European electric grid is used to demonstrate how load consumption patterns have changed because of COVID-19 lockdowns. The analysis of the data suggests how existing load forecasting frameworks can be adapted to prevent erosion of forecast performance. Download a copy today!
Over the period of 2015 through 2019, the cost of Germany’s generation redispatch averaged a little under €1 billion per year. To help manage the cost of redispatch in the face of the rapid deployment of renewable generation, Germany’s Redispatch 2.0 guidelines allow German TSOs to throttle down grid-connected wind, solar, and combined heat and power generation if other redispatch options are more costly. To assess all possible redispatch options, German Distribution System Operators (DSOs) are required to submit to their respective Transmission System Operator (TSO) day-ahead and intraday forecasts of generation (> 100 KW) and consumption within their distribution system. The DSO forecasts are critical inputs to network models that redispatch grid and non-grid connected generation (for example, centralized dispatched load control) to meet consumption subject to transmission and distribution system operating constraints.
Day-ahead and intraday consumption forecasts are developed generally using techniques from two broad classes of load forecast frameworks:
- Equation-based Approaches: Under this approach, parametrized equations are used to predict loads as a function of calendar (e.g., day-of-the-week, season, holidays, special event days), economic (e.g., operating schedules, employment levels), weather (e.g., temperature, humidity, wind speed, precipitation) and solar (sunrise/sunset times, observance of daylight savings, solar irradiance) conditions. Historical load data are combined with historical measurements of explanatory variables or features to estimate the parameters of the equations. Once the parameters are estimated, forecasted calendar, economic, weather and solar conditions are passed into the equations to form the load forecast. Techniques that fall into this class are multivariate regression, advanced neural networks, and support vector regression, among others.
- Classification-based Approaches: Under this approach, historical load data are classified based on calendar, economic, weather and solar conditions. Days with similar conditions as the forecast day are then averaged to form the load forecast. Techniques that fall into this class are Gradient Boost, Random Forests, and Like Day Lookup, among others.
A useful way of thinking of a load forecast is to look at it as an average of historical load data under similar calendar, economic, weather and solar conditions as the day being forecasted. From the perspective of an event like COVID-19, the challenge is that the historical data upon which the load forecasts are constructed are not under the same economic conditions as those prevailing under lockdown mandates imposed by countries to curb the spread of COVID-19. Although lockdown policies vary across Europe, in general, the policies have led to school closures and reduced operations or closures of non-essential businesses. Many other businesses have a large portion of their employees working remotely from home. The net effect is a shift of weekday electricity consumption from the nonresidential sector to the residential sector. For DSOs and TSOs operating in countries with lockdown mandates in place, there has been an evolution of the system load shape toward a residential load pattern. Day-ahead and intraday load forecast frameworks that do not adapt to the shift in load patterns will realize an erosion of forecast performance. This adds pressure on system operators to continually evaluate their generation dispatch plans to ensure all energy imbalances are cleared.
Dr. Frank Monforte, Director of Forecasting Solutions at Itron, recently wrote a white paper that presents a framework for improving day-ahead and intraday consumption forecasts in the face of existing COVID-19 lockdown mitigation policies, as well as when the lockdown policies are relaxed to allow for a re-opening of Europe’s economies. Historical hourly load data for 10 countries spanning the pan-European electric grid is used to demonstrate how load consumption patterns have changed because of COVID-19 lockdowns. The analysis of the data suggests how existing load forecasting frameworks can be adapted to prevent erosion of forecast performance. Download a copy today!
Si è verificato un errore nell'elaborarazione del modello.
The following has evaluated to null or missing:
==> authorContent.contentFields [in template "44616#44647#114455" at line 9, column 17]
----
Tip: It's the step after the last dot that caused this error, not those before it.
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: contentFields = authorContent.content... [in template "44616#44647#114455" at line 9, column 1]
----
1<#assign
2 webContentData = jsonFactoryUtil.createJSONObject(author.getData())
3 classPK = webContentData.classPK
4/>
5
6<#assign
7authorContent = restClient.get("/headless-delivery/v1.0/structured-contents/" + classPK + "?fields=contentFields%2CfriendlyUrlPath%2CtaxonomyCategoryBriefs")
8contentFields = authorContent.contentFields
9categories=authorContent.taxonomyCategoryBriefs
10authorContentData = jsonFactoryUtil.createJSONObject(authorContent)
11friendlyURL = authorContentData.friendlyUrlPath
12authorCategoryId = "0"
13/>
14
15<#list contentFields as contentField >
16 <#assign
17 contentFieldData = jsonFactoryUtil.createJSONObject(contentField)
18 name = contentField.name
19 />
20 <#if name == 'authorImage'>
21 <#if (contentField.contentFieldValue.image)??>
22 <#assign authorImageURL = contentField.contentFieldValue.image.contentUrl />
23 </#if>
24 </#if>
25 <#if name == 'authorName'>
26 <#assign authorName = contentField.contentFieldValue.data />
27 <#list categories as category >
28 <#if authorName == category.taxonomyCategoryName>
29 <#assign authorCategoryId = category.taxonomyCategoryId />
30 </#if>
31 </#list>
32 </#if>
33 <#if name == 'authorDescription'>
34 <#assign authorDescription = contentField.contentFieldValue.data />
35
36 </#if>
37
38 <#if name == 'authorJobTitle'>
39 <#assign authorJobTitle = contentField.contentFieldValue.data />
40
41 </#if>
42
43</#list>
44
45<div class="blog-author-info">
46 <#if authorImageURL??>
47 <img class="blog-author-img" id="author-image" src="${authorImageURL}" alt="" />
48 </#if>
49 <#if authorName??>
50 <#if authorName != "">
51 <p class="blog-author-name">By <a id="author-detail-page" href="/w/${friendlyURL}?filter_category_552298=${authorCategoryId}"><span id="author-full-name">${authorName}</span></a></p>
52 <hr />
53 </#if>
54 </#if>
55 <#if authorJobTitle??>
56 <#if authorJobTitle != "">
57 <p class="blog-author-title" id="author-job-title" >${authorJobTitle}</p>
58 <hr />
59 </#if>
60 </#if>
61 <#if authorDescription??>
62 <#if authorDescription != "" && authorDescription != "null" >
63 <p class="blog-author-desc" id="author-job-desc">${authorDescription}</p>
64 <hr />
65 </#if>
66 </#if>
67</div>
The following has evaluated to null or missing: ==> authorContent.contentFields [in template "44616#44647#114455" at line 9, column 17] ---- Tip: It's the step after the last dot that caused this error, not those before it. ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: contentFields = authorContent.content... [in template "44616#44647#114455" at line 9, column 1] ----
1<#assign
2 webContentData = jsonFactoryUtil.createJSONObject(author.getData())
3 classPK = webContentData.classPK
4/>
5
6<#assign
7authorContent = restClient.get("/headless-delivery/v1.0/structured-contents/" + classPK + "?fields=contentFields%2CfriendlyUrlPath%2CtaxonomyCategoryBriefs")
8contentFields = authorContent.contentFields
9categories=authorContent.taxonomyCategoryBriefs
10authorContentData = jsonFactoryUtil.createJSONObject(authorContent)
11friendlyURL = authorContentData.friendlyUrlPath
12authorCategoryId = "0"
13/>
14
15<#list contentFields as contentField >
16 <#assign
17 contentFieldData = jsonFactoryUtil.createJSONObject(contentField)
18 name = contentField.name
19 />
20 <#if name == 'authorImage'>
21 <#if (contentField.contentFieldValue.image)??>
22 <#assign authorImageURL = contentField.contentFieldValue.image.contentUrl />
23 </#if>
24 </#if>
25 <#if name == 'authorName'>
26 <#assign authorName = contentField.contentFieldValue.data />
27 <#list categories as category >
28 <#if authorName == category.taxonomyCategoryName>
29 <#assign authorCategoryId = category.taxonomyCategoryId />
30 </#if>
31 </#list>
32 </#if>
33 <#if name == 'authorDescription'>
34 <#assign authorDescription = contentField.contentFieldValue.data />
35
36 </#if>
37
38 <#if name == 'authorJobTitle'>
39 <#assign authorJobTitle = contentField.contentFieldValue.data />
40
41 </#if>
42
43</#list>
44
45<div class="blog-author-info">
46 <#if authorImageURL??>
47 <img class="blog-author-img" id="author-image" src="${authorImageURL}" alt="" />
48 </#if>
49 <#if authorName??>
50 <#if authorName != "">
51 <p class="blog-author-name">By <a id="author-detail-page" href="/w/${friendlyURL}?filter_category_552298=${authorCategoryId}"><span id="author-full-name">${authorName}</span></a></p>
52 <hr />
53 </#if>
54 </#if>
55 <#if authorJobTitle??>
56 <#if authorJobTitle != "">
57 <p class="blog-author-title" id="author-job-title" >${authorJobTitle}</p>
58 <hr />
59 </#if>
60 </#if>
61 <#if authorDescription??>
62 <#if authorDescription != "" && authorDescription != "null" >
63 <p class="blog-author-desc" id="author-job-desc">${authorDescription}</p>
64 <hr />
65 </#if>
66 </#if>
67</div>