1515
1616
1717def define_electrical_tariff_key (
18- SB_scenario_name : SB_scenario ,
18+ SB_scenario : SB_scenario ,
1919 electric_utility : electric_utility ,
20- customer_class : str ,
21- ) -> str :
22- tariff_key = ""
23- match SB_scenario_name :
24- # Default scenario
25- case "default_1" | "default_2" | "default_3" :
26- tariff_key = "default"
27-
28- # Seasonal flat scenarios
29- case "seasonal_1" | "seasonal_2" | "seasonal_3" :
30- if electric_utility == "Coned" :
31- if customer_class == "has_HP" :
32- tariff_key = "Coned_seasonal_HP"
33- elif customer_class == "no_HP" :
34- tariff_key = "Coned_seasonal_default"
35- else :
36- raise ValueError (f"Invalid customer class: { customer_class } " )
37- elif electric_utility == "National Grid" :
38- if customer_class == "has_HP" :
39- tariff_key = "National_Grid_seasonal_HP"
40- elif customer_class == "no_HP" :
41- tariff_key = "National_Grid_seasonal_default"
42- else :
43- raise ValueError (f"Invalid customer class: { customer_class } " )
44- elif electric_utility == "NYSEG" :
45- if customer_class == "has_HP" :
46- tariff_key = "NYSEG_seasonal_HP"
47- elif customer_class == "no_HP" :
48- tariff_key = "NYSEG_seasonal_default"
49- else :
50- raise ValueError (f"Invalid customer class: { customer_class } " )
51- else :
52- raise ValueError (f"Invalid electric utility: { electric_utility } " )
53-
54- # Class-specific seasonal flat scenarios
55- case (
56- "class_specific_seasonal_1"
57- | "class_specific_seasonal_2"
58- | "class_specific_seasonal_3"
59- ):
60- if electric_utility == "Coned" :
61- if customer_class == "has_HP" :
62- tariff_key = "Coned_class_specific_seasonal_HP"
63- elif customer_class == "no_HP" :
64- tariff_key = "Coned_class_specific_seasonal_default"
65- else :
66- raise ValueError (f"Invalid customer class: { customer_class } " )
67- elif electric_utility == "National Grid" :
68- if customer_class == "has_HP" :
69- tariff_key = "National_Grid_class_specific_seasonal_HP"
70- elif customer_class == "no_HP" :
71- tariff_key = "National_Grid_class_specific_seasonal_default"
72- else :
73- raise ValueError (f"Invalid customer class: { customer_class } " )
74- elif electric_utility == "NYSEG" :
75- if customer_class == "has_HP" :
76- tariff_key = "NYSEG_class_specific_seasonal_HP"
77- elif customer_class == "no_HP" :
78- tariff_key = "NYSEG_class_specific_seasonal_default"
79- else :
80- raise ValueError (f"Invalid customer class: { customer_class } " )
81-
82- # Class-specific seasonal TOU scenarios
83- case (
84- "class_specific_seasonal_TOU_1"
85- | "class_specific_seasonal_TOU_2"
86- | "class_specific_seasonal_TOU_3"
87- ):
88- if electric_utility == "Coned" :
89- if customer_class == "has_HP" :
90- tariff_key = "Coned_class_specific_seasonal_TOU_HP"
91- elif customer_class == "no_HP" :
92- tariff_key = "Coned_class_specific_seasonal_TOU_default"
93- else :
94- raise ValueError (f"Invalid customer class: { customer_class } " )
95- elif electric_utility == "National Grid" :
96- if customer_class == "has_HP" :
97- tariff_key = "National_Grid_class_specific_seasonal_TOU_HP"
98- elif customer_class == "no_HP" :
99- tariff_key = "National_Grid_class_specific_seasonal_TOU_default"
100- else :
101- raise ValueError (f"Invalid customer class: { customer_class } " )
102- elif electric_utility == "NYSEG" :
103- if customer_class == "has_HP" :
104- tariff_key = "NYSEG_class_specific_seasonal_TOU_HP"
105- elif customer_class == "no_HP" :
106- tariff_key = "NYSEG_class_specific_seasonal_TOU_default"
107- else :
108- raise ValueError (f"Invalid customer class: { customer_class } " )
109- else :
110- raise ValueError (f"Invalid electric utility: { electric_utility } " )
111- case _:
112- raise ValueError (f"Invalid SB scenario name: { SB_scenario_name } " )
113- return tariff_key
20+ has_hp : pl .Series ,
21+ ) -> pl .Expr :
22+ if SB_scenario .analysis_type == "default" :
23+ return pl .lit (f"{ electric_utility } _{ SB_scenario } _default" )
24+ elif (
25+ SB_scenario .analysis_type == "seasonal"
26+ or SB_scenario .analysis_type == "class_specific_seasonal"
27+ ):
28+ return (
29+ pl .when (has_hp )
30+ .then (pl .lit (f"{ electric_utility } _{ SB_scenario } _HP.csv" ))
31+ .otherwise (pl .lit (f"{ electric_utility } _{ SB_scenario } _flat.csv" ))
32+ )
33+ else :
34+ raise ValueError (f"Invalid SB scenario: { SB_scenario } " )
11435
11536
11637def generate_electrical_tariff_mapping (
11738 metadata_df : pl .DataFrame ,
118- SB_scenario_name : SB_scenario ,
39+ SB_scenario : SB_scenario ,
11940 electric_utility : electric_utility ,
12041) -> pl .DataFrame :
121- electrical_tariff_mapping_df = metadata_df .select (pl .col ("bldg_id" )).with_columns (
122- pl .lit ("" ).alias ("tariff_key" )
123- )
12442 has_hp = metadata_df ["postprocess_group.has_hp" ]
125- for customer_class in ["has_HP" , "no_HP" ]:
126- tariff_key = define_electrical_tariff_key (
127- SB_scenario_name , electric_utility , customer_class
128- )
129- if customer_class == "has_HP" :
130- electrical_tariff_mapping_df = electrical_tariff_mapping_df .with_columns (
131- pl .when (has_hp ) # Only change rows where has_hp is True
132- .then (pl .lit (tariff_key ))
133- .otherwise (pl .col ("tariff_key" ))
134- .alias ("tariff_key" )
135- )
136- elif customer_class == "no_HP" :
137- electrical_tariff_mapping_df = electrical_tariff_mapping_df .with_columns (
138- pl .when (~ has_hp ) # Only change rows where has_hp is False
139- .then (pl .lit (tariff_key ))
140- .otherwise (pl .col ("tariff_key" ))
141- .alias ("tariff_key" )
43+
44+ electrical_tariff_mapping_df = (
45+ metadata_df .select (pl .col ("bldg_id" ))
46+ .with_columns (pl .lit ("" ).alias ("tariff_key" ))
47+ .with_columns (
48+ define_electrical_tariff_key (SB_scenario , electric_utility , has_hp ).alias (
49+ "tariff_key"
14250 )
51+ )
52+ )
53+
14354 return electrical_tariff_mapping_df
14455
14556
14657def map_electric_tariff (
14758 SB_metadata_path : S3Path ,
14859 electric_utility : electric_utility ,
149- SB_scenario_name : SB_scenario ,
60+ SB_scenario : SB_scenario ,
15061 state : str ,
15162):
15263 if not SB_metadata_path .exists ():
@@ -160,12 +71,10 @@ def map_electric_tariff(
16071 return
16172
16273 print (utility_metadata_df .head (20 ))
163- print (len (utility_metadata_df ))
16474
16575 electrical_tariff_mapping_df = generate_electrical_tariff_mapping (
166- utility_metadata_df , SB_scenario_name , electric_utility
76+ utility_metadata_df , SB_scenario , electric_utility
16777 )
168-
16978 print (electrical_tariff_mapping_df .head (20 ))
17079
17180 output_path = (
@@ -174,7 +83,7 @@ def map_electric_tariff(
17483 / "hp_rates"
17584 / "data"
17685 / "tariff_map"
177- / f"{ electric_utility } _{ SB_scenario_name } .csv"
86+ / f"{ electric_utility } _{ SB_scenario } .csv"
17887 )
17988 if not output_path .parent .exists ():
18089 output_path .parent .mkdir (parents = True )
@@ -195,6 +104,9 @@ def main():
195104 parser .add_argument (
196105 "--SB_scenario_name" , required = True , help = "SB scenario name (e.g. default_1)"
197106 )
107+ parser .add_argument (
108+ "--SB_scenario_year" , required = True , help = "SB scenario year (e.g. 2024)"
109+ )
198110 args = parser .parse_args ()
199111
200112 #########################################################
@@ -221,10 +133,18 @@ def main():
221133 temp_path .write_bytes (buf .getvalue ())
222134 #########################################################
223135
136+ if (
137+ args .SB_scenario_name != "default"
138+ and args .SB_scenario_name != "seasonal"
139+ and args .SB_scenario_name != "class_specific_seasonal"
140+ ):
141+ raise ValueError (f"Invalid SB scenario name: { args .SB_scenario_name } " )
142+
143+ sb_scenario = SB_scenario (args .SB_scenario_name , args .SB_scenario_year )
224144 map_electric_tariff (
225145 SB_metadata_path = temp_path ,
226146 electric_utility = args .electric_utility ,
227- SB_scenario_name = args . SB_scenario_name ,
147+ SB_scenario = sb_scenario ,
228148 state = args .state ,
229149 )
230150
0 commit comments