Skip to content

Commit e123fdd

Browse files
Simplify tariff_key assigning function
1 parent 74af9fa commit e123fdd

4 files changed

Lines changed: 64 additions & 144 deletions

File tree

rate_design/ny/hp_rates/data/tariff_map/Justfile

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22
project_root := absolute_path(justfile_directory() / ".." / ".." / ".." / ".." / "..")
33
data_base := "s3://data.sb/nrel/resstock/res_2024_amy2018_2/metadata"
44

5-
# Usage: just map-electric-tariff [state] [electric_utility] [SB_scenario_name] [upgrade_id]
6-
# Example: just map-electric-tariff "Coned" default_1 00
7-
map-electric-tariff electric_utility SB_scenario_name upgrade_id:
5+
# Usage: just map-electric-tariff [electric_utility] [SB_scenario_type] [SB_scenario_year] [upgrade_id]
6+
# Example: just map-electric-tariff Coned default 1 00
7+
map-electric-tariff electric_utility SB_scenario_name SB_scenario_year upgrade_id:
88
cd {{project_root}} && uv run python {{project_root}}/utils/electric_tariff_mapper.py \
99
--metadata_path "{{data_base}}/state=NY/upgrade={{upgrade_id}}/metadata-sb.parquet" \
1010
--state NY \
1111
--electric_utility "{{electric_utility}}" \
12-
--SB_scenario_name "{{SB_scenario_name}}"
12+
--SB_scenario_name "{{SB_scenario_name}}" \
13+
--SB_scenario_year "{{SB_scenario_year}}"

rate_design/ri/hp_rates/data/tariff_map/Justfile

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22
project_root := absolute_path(justfile_directory() / ".." / ".." / ".." / ".." / "..")
33
data_base := "s3://data.sb/nrel/resstock/res_2024_amy2018_2/metadata"
44

5-
# Usage: just map-electric-tariff [state] [electric_utility] [SB_scenario_name] [upgrade_id]
6-
# Example: just map-electric-tariff "Coned" default_1 00
7-
map-electric-tariff electric_utility SB_scenario_name upgrade_id:
5+
# Usage: just map-electric-tariff [electric_utility] [SB_scenario_type] [SB_scenario_year] [upgrade_id]
6+
# Example: just map-electric-tariff Coned default 1 00
7+
map-electric-tariff electric_utility SB_scenario_name SB_scenario_year upgrade_id:
88
cd {{project_root}} && uv run python {{project_root}}/utils/electric_tariff_mapper.py \
99
--metadata_path "{{data_base}}/state=RI/upgrade={{upgrade_id}}/metadata-sb.parquet" \
1010
--state RI \
1111
--electric_utility "{{electric_utility}}" \
12-
--SB_scenario_name "{{SB_scenario_name}}"
12+
--SB_scenario_name "{{SB_scenario_name}}" \
13+
--SB_scenario_year "{{SB_scenario_year}}"

utils/electric_tariff_mapper.py

Lines changed: 42 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -15,138 +15,49 @@
1515

1616

1717
def 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

11637
def 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

14657
def 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

utils/types.py

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
from typing import Literal
22

3-
SB_scenario = Literal[
4-
"default_1",
5-
"default_2",
6-
"default_3",
7-
"seasonal_1",
8-
"seasonal_2",
9-
"seasonal_3",
10-
"class_specific_seasonal_1",
11-
"class_specific_seasonal_2",
12-
"class_specific_seasonal_3",
13-
"class_specific_seasonal_TOU_1",
14-
"class_specific_seasonal_TOU_2",
15-
"class_specific_seasonal_TOU_3",
16-
]
173

4+
class SB_scenario:
5+
analysis_type: Literal["default", "seasonal", "class_specific_seasonal"]
6+
analysis_year: int
7+
8+
def __init__(self, analysis_type: Literal["default", "seasonal", "class_specific_seasonal"], analysis_year: int):
9+
self.analysis_type = analysis_type
10+
self.analysis_year = analysis_year
11+
12+
def __str__(self):
13+
return f"{self.analysis_type}_{self.analysis_year}"
14+
15+
1816
electric_utility = Literal["Coned", "National Grid", "NYSEG"]

0 commit comments

Comments
 (0)