Skip to content

Commit 123c659

Browse files
Write tariff map to a csv
1 parent a336dd6 commit 123c659

1 file changed

Lines changed: 95 additions & 31 deletions

File tree

utils/electric_tariff_mapper.py

Lines changed: 95 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,47 +7,107 @@
77

88
from 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+
1014
SB_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

113186
if __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

Comments
 (0)