Forecasting
Forecasting New Technologies - When Nothing Else Works
In a recent project, we were asked to help settle a question. Which forecast is reasonable: One forecasting average annual system demand growth of 0.4 percent or one forecasting system peak demand growth at 1.3 percent? Just for some context, our recent utility survey showed that on average utilities expect 0.5 percent long-term system load growth. As it turned out, if you exclude data center loads you get something close to the low forecast and if you explicitly account for data center load growth you get something close to the 1.3 percent forecasted growth.
At a U.S. level, data center load growth has largely been mitigated by efficiency improvements. In this service area, data centers matter. Data centers are highly concentrated, and by far the largest data center concentration is in Northern Virginia (NOVA); data center load growth there has been insane. The first figure shows data center load growth.
Data center loads went from roughly 10 percent of commercial sales in 2011 to 25 percent of commercial sales in 2016. The question is how to forecast this kind of sales growth. Using regression modeling, we tried relating data center sales growth to economic growth, cloud-based spending, measure of cost of computing and modeling data center loads as part of total commercial sales with interacting trend variables. Nothing worked.
We then tried a second approach that entailed treating the data center phenomena as a new technology. Pretty much all new technologies tend to follow an S-shaped adoption path as illustrated.
NOVA data center load growth is also following this path with load increasing at an accelerating rate. Like all new things, it can’t grow like this forever. One approach of explaining the adoption path is with a Bass Diffusion Model (Bass Model). The Bass Diffusion model generates an S-shaped curve using the equation shown here:
The coefficients p and q best explained the historical data center load growth path. The estimated curve was regressed on actual monthly data center capacity and generated the forecast shown next.
The model implies continued strong growth in data center loads out through 2022 where it begins to slow. The second part of the project was to validate the reasonableness of the forecast. We were able to do this through extensive market research on factors driving data center demand and discussions with one of the leading data center brokers in the region. Expected strong demand in cloud computing coupled with the unique regional infrastructure (NOVA has the highest density of fiber anywhere in the United States and three new cables with direct connections to Europe, Africa, and South America) supported the reasonableness of the data center demand forecast.
We foresee being able to use the same approach for forecasting electric vehicles, solar load adoption, and in the northeast, cold climate heat pump adoption.
At a U.S. level, data center load growth has largely been mitigated by efficiency improvements. In this service area, data centers matter. Data centers are highly concentrated, and by far the largest data center concentration is in Northern Virginia (NOVA); data center load growth there has been insane. The first figure shows data center load growth.
Data center loads went from roughly 10 percent of commercial sales in 2011 to 25 percent of commercial sales in 2016. The question is how to forecast this kind of sales growth. Using regression modeling, we tried relating data center sales growth to economic growth, cloud-based spending, measure of cost of computing and modeling data center loads as part of total commercial sales with interacting trend variables. Nothing worked.
We then tried a second approach that entailed treating the data center phenomena as a new technology. Pretty much all new technologies tend to follow an S-shaped adoption path as illustrated.
NOVA data center load growth is also following this path with load increasing at an accelerating rate. Like all new things, it can’t grow like this forever. One approach of explaining the adoption path is with a Bass Diffusion Model (Bass Model). The Bass Diffusion model generates an S-shaped curve using the equation shown here:
The coefficients p and q best explained the historical data center load growth path. The estimated curve was regressed on actual monthly data center capacity and generated the forecast shown next.
The model implies continued strong growth in data center loads out through 2022 where it begins to slow. The second part of the project was to validate the reasonableness of the forecast. We were able to do this through extensive market research on factors driving data center demand and discussions with one of the leading data center brokers in the region. Expected strong demand in cloud computing coupled with the unique regional infrastructure (NOVA has the highest density of fiber anywhere in the United States and three new cables with direct connections to Europe, Africa, and South America) supported the reasonableness of the data center demand forecast.
We foresee being able to use the same approach for forecasting electric vehicles, solar load adoption, and in the northeast, cold climate heat pump adoption.
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>