Forecasting

The Fundamentals of Sales and Demand Forecasting Workshop, October 2014

December 05, 2014

Last month we held our Fundamentals of Sales and Demand Forecasting workshop in Boston. It was a great turn out with 15 forecasters from across the country - from California to Newfoundland & Labrador, Canada. This hands-on MetrixND workshop covers building sales and weather normalization models, reviewing regression modeling fundamentals, evaluating forecast performance, adding model structure through SAE specification and developing regression models with ARMA correction.

The big moment always comes when participants test their forecasting skills. Teams compete to produce the best forecast (as judged by me) with the winning team getting bragging rights and prizes. This year’s forecast competition was to develop a commercial sales forecast for Vermont. Four teams competed and the winning team, comprised of Yi He, and Dave Millar from PG&E, Seoungjoun Won from the Missouri Public Service Commission, and Aditee Madkekar from United Illuminating, nailed it! The Canadian team of Branko Boras and Ramez Hakeem (Enersource Hydro Mississauga) and Candace White (Newfoundland & Labrador Hydro) finished a very close second.



After teaching workshops for the last ten years, I know that we have polished our course agendas to include a lot of material, giving attendees the best value for their time and money. At the end of the second day, as I looked around the room to see glazed-over faces, I wondered if we cover too much. Should we take it slower to ensure the concepts taught can be applied when attendees return to their office by breaking it up into two separate workshops? Fundamentals I, would focus on budget forecasting and budget analysis process and Fundamentals II would focus on long-term forecasting to support IRP and long-term resource planning.

Fundamentals I, the budget forecasting workshop, would cover regression modeling and analysis, identifying and addressing modeling issues such as multi-collinearity and serial correlation, evaluating model performance, working with billing data, weather normalization and variance analysis, unbilled sales estimation, and revenue forecasting.

Fundamentals II, the long-term forecasting workshop, would include SAE modeling, incorporating the impacts of energy efficiency programs, building system peak, and hourly load modeling, modeling new technologies such as LED lighting, photovoltaic market penetration and impacts, plug-in vehicles, and new cold weather heat pumps.

Let me know what you think. Good idea? Bad idea? Would you come to Boston in the spring time? (Isn’t that a song?)

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>