Skip to content

Commit ab13f1e

Browse files
committed
Add regional cost multipliers
The multipliers are applied to measure and baseline costs by state and building type (residential/commercial), based on data collected from the RSMeans 2021 City Price Index. https://www.google.com/url?q=https://www.rsmeans.com/media/wysiwyg/quarterly_updates/2021-CCI-LocationFactors-V2.pdf?srsltid%3DAfmBOop3jyUcK1-aFa0Vn-MhKx9FCphrlf92quKpA1y-l4W_iIf1hw7q&sa=D&source=editors&ust=1740606379681878&usg=AOvVaw36C0xgCna5378cn3r1yR46
1 parent 84793e9 commit ab13f1e

3 files changed

Lines changed: 77 additions & 0 deletions

File tree

scout/ecm_prep.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ class UsefulInputFiles(object):
150150
hp_convert_rates (tuple): Fuel switching conversion rates.
151151
fug_emissions_dat (tuple): Refrigerant and supply chain methane leakage
152152
data to asses fugitive emissions sources.
153+
local_cost_adj (tuple): State-level cost adjustment indices from RSMeans 2021.
153154
"""
154155

155156
def __init__(self, opts):
@@ -211,6 +212,7 @@ def __init__(self, opts):
211212
self.health_data = fp.CONVERT_DATA / "epa_costs.csv"
212213
self.hp_convert_rates = fp.CONVERT_DATA / "hp_convert_rates.json"
213214
self.fug_emissions_dat = fp.CONVERT_DATA / "fugitive_emissions_convert.json"
215+
self.local_cost_adj = fp.CONVERT_DATA / "loc_cost_adj.csv"
214216

215217
def set_decarb_grid_vars(self, opts: argparse.NameSpace): # noqa: F821
216218
"""Assign instance variables related to grid decarbonization which are dependent on the
@@ -545,6 +547,21 @@ def __init__(self, base_dir, handyfiles, opts):
545547
except ValueError as e:
546548
raise ValueError(
547549
f"Error reading in '{handyfiles.cpi_data}': {str(e)}") from None
550+
# If states are used, read in state-level cost adjustment data
551+
if self.regions == "State":
552+
# Read in adjustment factors
553+
reg_cost_adj_array = pd.read_csv(handyfiles.local_cost_adj)
554+
# Store factors for each state and building type (res/com) in a dict for
555+
# efficient access subsequently
556+
self.reg_cost_adj = {}
557+
for row in reg_cost_adj_array.index:
558+
# Dict is organized by state and building type (res/com) levels
559+
self.reg_cost_adj[reg_cost_adj_array.loc[row, "state"]] = {
560+
bldg: reg_cost_adj_array.loc[row, bldg] for
561+
bldg in ["residential", "commercial"]
562+
}
563+
else:
564+
self.reg_cost_adj = None
548565
# Read in commercial equipment capacity factors
549566
self.cap_facts = Utils.load_json(handyfiles.cap_facts)
550567
# Read in national-level site-source, emissions, and costs data
@@ -5286,6 +5303,12 @@ def fill_mkts(self, msegs, msegs_cpl, convert_data, tsv_data_init, opts,
52865303
"Invalid performance or cost units for ECM '" +
52875304
self.name + "'")
52885305

5306+
# Adjust baseline and measure costs to current region, if applicable
5307+
if self.handyvars.reg_cost_adj is not None:
5308+
cost_meas, cost_base = [
5309+
{yr: x[yr] * self.handyvars.reg_cost_adj[mskeys[1]][bldg_sect]
5310+
for yr in self.handyvars.aeo_years} for x in [cost_meas, cost_base]]
5311+
52895312
# Set stock turnover info. and consumer choice info. to
52905313
# appropriate building type
52915314
if bldg_sect == "residential":
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
state,city,residential,commercial
2+
AL,Huntsville,0.83,0.85
3+
AK,Anchorage,1.17,1.16
4+
AZ,Phoenix,0.84,0.87
5+
AR,Little Rock,0.83,0.82
6+
CA,Los Angeles,1.15,1.12
7+
CO,Denver,0.91,0.92
8+
CT,Bridgeport,1.1,1.08
9+
DE,Wilmington,1.01,1.04
10+
DC,"Washington, D.C.",0.92,0.96
11+
FL,Jacksonville,0.81,0.84
12+
GA,Atlanta,0.9,0.89
13+
HI,Honolulu,1.22,1.19
14+
ID,Boise,0.89,0.91
15+
IL,Chicago,1.25,1.2
16+
IN,Indianapolis,0.92,0.92
17+
IA,Des Moines,0.92,0.94
18+
KS,Wichita,0.81,0.86
19+
KY,Louisville,0.89,0.88
20+
LA,New Orleans,0.85,0.85
21+
ME,Portland,0.94,0.94
22+
MD,Baltimore,0.93,0.94
23+
MA,Boston,1.18,1.14
24+
MI,Detroit,1,1
25+
MN,Minneapolis,1.09,1.07
26+
MS,Jackson,0.84,0.85
27+
MO,Kansas City,0.99,0.99
28+
MT,Billings,0.89,0.91
29+
NE,Omaha,0.9,0.92
30+
NV,Las Vegas,1.03,1.05
31+
NH,Manchester,0.99,0.97
32+
NJ,Newark,1.2,1.17
33+
NM,Albuquerque,0.86,0.87
34+
NY,New York,1.36,1.32
35+
NC,Charlotte,0.99,0.87
36+
ND,Fargo,0.87,0.91
37+
OH,Columbus,0.91,0.92
38+
OK,Oklahoma City,0.84,0.85
39+
OR,Portland,1.02,1.03
40+
PA,Philadelphia,1.17,1.16
41+
RI,Providence,1.09,1.06
42+
SC,Charleston,0.98,0.85
43+
SD,Sioux Falls,0.92,0.92
44+
TN,Nashville,0.87,0.89
45+
TX,Houston,0.84,0.87
46+
UT,Salt Lake City,0.85,0.91
47+
VT,Burlington,1,0.95
48+
VA,Newport News,0.97,0.87
49+
WA,Seattle,1.06,1.07
50+
WV,Charleston,0.94,0.94
51+
WI,Milwaukee,1.07,1.04
52+
WY,Cheyenne,0.86,0.89

tests/ecm_prep_test.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -907,6 +907,8 @@ def setUpClass(cls):
907907
handyfiles_state = ecm_prep.UsefulInputFiles(cls.opts_state)
908908
handyvars_state = ecm_prep.UsefulVars(
909909
base_dir, handyfiles_state, cls.opts_state)
910+
# Suppress regional cost adjustment factors for states
911+
handyvars_state.reg_cost_adj = None
910912
# Fuel switching with exogenous rates
911913
cls.opts_hp_rates, opts_hp_rates_dict = [
912914
copy.deepcopy(x) for x in [cls.opts_emm, opts_emm_dict]]

0 commit comments

Comments
 (0)