77
88from utils .types import SB_scenario , electric_utility
99
10+ # Project root (rate-design-platform); independent of cwd or caller
11+ _PROJECT_ROOT = Path (__file__ ).resolve ().parent .parent
12+ RATE_DESIGN_DIR = _PROJECT_ROOT / "rate_design"
13+
1014SB_scenarios_path = Path (__file__ ).parent / "SB_scenarios.json"
1115
1216
13- def define_tariff_key (
17+ def define_electrical_tariff_key (
1418 SB_scenario_name : SB_scenario ,
1519 electric_utility : electric_utility ,
1620 customer_class : str ,
1721) -> str :
1822 tariff_key = ""
1923 match SB_scenario_name :
24+ # Default scenario
2025 case "default_1" | "default_2" | "default_3" :
2126 tariff_key = "default"
27+
28+ # Seasonal flat scenarios
2229 case "seasonal_1" | "seasonal_2" | "seasonal_3" :
23- if customer_class == "has_HP" :
24- tariff_key = "seasonal_HP"
25- elif customer_class == "no_HP" :
26- tariff_key = "seasonal_default"
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 } " )
2751 else :
28- raise ValueError (f"Invalid customer class: { customer_class } " )
52+ raise ValueError (f"Invalid electric utility: { electric_utility } " )
53+
54+ # Class-specific seasonal flat scenarios
2955 case (
3056 "class_specific_seasonal_1"
3157 | "class_specific_seasonal_2"
3258 | "class_specific_seasonal_3"
3359 ):
34- if customer_class == "has_HP" :
35- tariff_key = "class_specific_seasonal_HP"
36- elif customer_class == "no_HP" :
37- tariff_key = "class_specific_seasonal_default"
38- else :
39- raise ValueError (f"Invalid customer class: { customer_class } " )
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
4083 case (
4184 "class_specific_seasonal_TOU_1"
4285 | "class_specific_seasonal_TOU_2"
4386 | "class_specific_seasonal_TOU_3"
4487 ):
45- if customer_class == "has_HP" :
46- tariff_key = "class_specific_seasonal_TOU_HP"
47- elif customer_class == "no_HP" :
48- tariff_key = "class_specific_seasonal_TOU_default"
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 } " )
49109 else :
50- raise ValueError (f"Invalid customer class : { customer_class } " )
110+ raise ValueError (f"Invalid electric utility : { electric_utility } " )
51111 case _:
52112 raise ValueError (f"Invalid SB scenario name: { SB_scenario_name } " )
53113 return tariff_key
@@ -63,7 +123,7 @@ def generate_electrical_tariff_mapping(
63123 )
64124 has_hp = metadata_df ["postprocess_group.has_hp" ]
65125 for customer_class in ["has_HP" , "no_HP" ]:
66- tariff_key = define_tariff_key (
126+ tariff_key = define_electrical_tariff_key (
67127 SB_scenario_name , electric_utility , customer_class
68128 )
69129 if customer_class == "has_HP" :
@@ -87,6 +147,7 @@ def map_electric_tariff(
87147 SB_metadata_path : S3Path ,
88148 electric_utility : electric_utility ,
89149 SB_scenario_name : SB_scenario ,
150+ state : str ,
90151):
91152 if not SB_metadata_path .exists ():
92153 raise FileNotFoundError (f"SB metadata path { SB_metadata_path } does not exist" )
@@ -98,16 +159,28 @@ def map_electric_tariff(
98159 if utility_metadata_df .is_empty ():
99160 return
100161
101- print (utility_metadata_df .head (10 ))
162+ print (utility_metadata_df .head (20 ))
102163 print (len (utility_metadata_df ))
103164
104165 electrical_tariff_mapping_df = generate_electrical_tariff_mapping (
105166 utility_metadata_df , SB_scenario_name , electric_utility
106167 )
107168
108- print (electrical_tariff_mapping_df .head (10 ))
169+ print (electrical_tariff_mapping_df .head (20 ))
170+
171+ output_path = (
172+ RATE_DESIGN_DIR
173+ / state .lower ()
174+ / "hp_rates"
175+ / "data"
176+ / "tariff_map"
177+ / f"{ electric_utility } _{ SB_scenario_name } .csv"
178+ )
179+ if not output_path .parent .exists ():
180+ output_path .parent .mkdir (parents = True )
181+ electrical_tariff_mapping_df .write_csv (output_path )
109182
110- return utility_metadata_df
183+ return
111184
112185
113186if __name__ == "__main__" :
@@ -150,16 +223,7 @@ def map_electric_tariff(
150223 SB_metadata_path = temp_path ,
151224 electric_utility = cast (electric_utility , "Coned" ),
152225 SB_scenario_name = cast (SB_scenario , "default_1" ),
153- )
154- map_electric_tariff (
155- SB_metadata_path = temp_path ,
156- electric_utility = cast (electric_utility , "National Grid" ),
157- SB_scenario_name = cast (SB_scenario , "seasonal_1" ),
158- )
159- map_electric_tariff (
160- SB_metadata_path = temp_path ,
161- electric_utility = cast (electric_utility , "NYSEG" ),
162- SB_scenario_name = cast (SB_scenario , "class_specific_seasonal_1" ),
226+ state = state ,
163227 )
164228
165229 #########################################################
0 commit comments