Industry Insights
Finding the Right Tool
My desire to make popcorn for the evening of binge watching came to a sudden halt when the microwave door latch stuck. Undeterred by this setback, I put on my repairman cap, opened my toolbox, prepared to open the appliance. Within minutes, I ran into some odd looking screws – not the typical “slot” or “Phillips” head. A quick internet search revealed that I had a “security hex socket” screw. Without the proper screwdriver, I began to look for a different snack.
What do popcorn and microwaves have to do with forecasting? Recently, I had a conversation with a utility budget forecaster tasked with developing the Integrated Resource Plan (IRP) forecast. While the forecaster was familiar with budget forecasting models, he was concerned that the models could not be applied to the IRP forecast.
The budget models are simple econometric equations that capture customer and average use growth based on macroeconomic drivers, normal weather, and end-shift variables. While economic and end-shift variables project growth and calibrate the model to the latest data, the weather variables capture heating and cooling response. This structure is well suited to forecasts next year’s budget. However, the forecaster’s concern is whether this type of model adequately captures the changes in the system over the next 30 years.
Applying a budget forecast models to a 30-year IRP forecast assumes that the relationship between the economic drivers and energy usages remain constant over the forecast horizon. However, our intuition tells us that changes in energy efficiency standards and new technologies will change energy usage patterns creating deviations from this historic relationship. A few potential changes are listed on the Appliance Standards Awareness Project website (http://www.appliance-standards.org/national). The list includes energy efficiency changes for at least 14 residential end-uses such as air conditioners, clothes dryers, clothes washers, and furnaces.
In order to adequately capture energy consumption changes over the 30 year planning horizon, future changes should be included in the forecast models. Including end-use energy efficiency changes is one modification needed to adapt the budget model to a 30-year model. Additionally, projections of behind-the-meter generation (solar) and new technologies (electric vehicles) should also be included capture risk scenarios.
After much discussion, my budget forecaster agreed that applying a budget forecast model for an IRP is like trying to apply a slot or Phillips head screwdriver to the security hex socket. While we could force the issue, applying the wrong tools in any situation only leads to frustration.
What do popcorn and microwaves have to do with forecasting? Recently, I had a conversation with a utility budget forecaster tasked with developing the Integrated Resource Plan (IRP) forecast. While the forecaster was familiar with budget forecasting models, he was concerned that the models could not be applied to the IRP forecast.
The budget models are simple econometric equations that capture customer and average use growth based on macroeconomic drivers, normal weather, and end-shift variables. While economic and end-shift variables project growth and calibrate the model to the latest data, the weather variables capture heating and cooling response. This structure is well suited to forecasts next year’s budget. However, the forecaster’s concern is whether this type of model adequately captures the changes in the system over the next 30 years.
Applying a budget forecast models to a 30-year IRP forecast assumes that the relationship between the economic drivers and energy usages remain constant over the forecast horizon. However, our intuition tells us that changes in energy efficiency standards and new technologies will change energy usage patterns creating deviations from this historic relationship. A few potential changes are listed on the Appliance Standards Awareness Project website (http://www.appliance-standards.org/national). The list includes energy efficiency changes for at least 14 residential end-uses such as air conditioners, clothes dryers, clothes washers, and furnaces.
In order to adequately capture energy consumption changes over the 30 year planning horizon, future changes should be included in the forecast models. Including end-use energy efficiency changes is one modification needed to adapt the budget model to a 30-year model. Additionally, projections of behind-the-meter generation (solar) and new technologies (electric vehicles) should also be included capture risk scenarios.
After much discussion, my budget forecaster agreed that applying a budget forecast model for an IRP is like trying to apply a slot or Phillips head screwdriver to the security hex socket. While we could force the issue, applying the wrong tools in any situation only leads to frustration.
Wystąpił błąd podczas przetwarzania szablonu.
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>