Skip to content

Commit f97f1ca

Browse files
authored
GridPath v2026.3.0
Merge pull request #1376 from blue-marble/develop
2 parents 6af7057 + 6883e05 commit f97f1ca

1,305 files changed

Lines changed: 852735 additions & 1326570 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/test_gridpath.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@ jobs:
2323
python-version: [ "3.11", "3.12", "3.13" ]
2424

2525
steps:
26-
- uses: actions/checkout@v3
26+
- uses: actions/checkout@v4
2727
- name: Install sqlite3 3.45.0 on Linux
2828
if: startsWith(runner.os, 'Linux')
2929
run: |
3030
bash ./.github/workflows/upgrade_sqlite_on_linux.sh
3131
- name: Set up Python
32-
uses: actions/setup-python@v3
32+
uses: actions/setup-python@v5
3333
with:
3434
python-version: ${{ matrix.python-version }}
3535
- name: Install Cbc and check version (Linux)

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
[![Coverage Status](https://coveralls.io/repos/github/blue-marble/gridpath/badge.svg?branch=main)](https://coveralls.io/github/blue-marble/gridpath?branch=main)
44
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
55
[![Lint Black](https://github.com/blue-marble/gridpath/actions/workflows/black.yml/badge.svg?branch=main)](https://github.com/blue-marble/gridpath/actions/workflows/black.yml)
6-
[![DOI](https://zenodo.org/badge/65574330.svg)](https://zenodo.org/badge/latestdoi/65574330)
6+
[![DOI](https://zenodo.org/badge/65574330.svg)](https://doi.org/10.5281/zenodo.5822994)
77

88
# Welcome to GridPath
99

data_toolkit/load_raw_data.py

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import sys
2424
from argparse import ArgumentParser
2525
import os.path
26+
from sqlite3 import Connection
27+
2628
import pandas as pd
2729

2830
from db.common_functions import spin_on_database_lock_generic, connect_to_database
@@ -69,23 +71,28 @@ def main(args=None):
6971
print(f"... {f}...")
7072
f_path = str(os.path.join(parsed_args.csv_location, f))
7173

72-
# Set low_memory to False to avoid dtype warning
73-
# TODO: actually specify dtypes instead
74-
df = pd.read_csv(
75-
f_path, delimiter=",", low_memory=False, on_bad_lines="warn"
76-
)
77-
78-
spin_on_database_lock_generic(
79-
command=df.to_sql(
80-
name=table,
81-
con=conn,
82-
if_exists="append",
83-
index=False,
84-
)
85-
)
74+
read_and_import_csv(conn, f_path, table)
8675

76+
conn.commit()
8777
conn.close()
8878

8979

80+
def read_and_import_csv(conn: Connection, f_path: str, table):
81+
# Set low_memory to False to avoid dtype warning
82+
# TODO: actually specify dtypes instead
83+
df = pd.read_csv(f_path, delimiter=",", low_memory=False, on_bad_lines="warn")
84+
85+
# print(f_path)
86+
# print(df)
87+
spin_on_database_lock_generic(
88+
command=df.to_sql(
89+
name=table,
90+
con=conn,
91+
if_exists="append",
92+
index=False,
93+
)
94+
)
95+
96+
9097
if __name__ == "__main__":
9198
main()

data_toolkit/manual_adjustments.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@
2020
import pandas as pd
2121

2222
from db.common_functions import connect_to_database
23+
from data_toolkit.load_raw_data import read_and_import_csv
2324
from data_toolkit.project.project_data_filters_common import (
2425
get_eia860_sql_filter_string,
2526
DISAGG_PROJECT_NAME_STR,
27+
AGG_PROJECT_NAME_STR,
2628
)
2729

2830
# Storage durations
@@ -93,6 +95,14 @@ def parse_arguments(args):
9395
help="Overwrite existing CSV files.",
9496
)
9597

98+
parser.add_argument(
99+
"-agg",
100+
"--aggregate_projects",
101+
default=False,
102+
action="store_true",
103+
help="Aggregate all projects to the BA-technology level.",
104+
)
105+
96106
parser.add_argument("-q", "--quiet", default=False, action="store_true")
97107

98108
parsed_arguments = parser.parse_known_args(args=args)[0]
@@ -127,13 +137,14 @@ def make_copy_files(
127137

128138
def add_battery_durations(
129139
conn,
130-
disagg_project_name_str,
140+
project_name_str,
131141
study_year,
132142
eia860_sql_filter_string,
133143
csv_location,
134144
subscenario_id,
135145
subscenario_name,
136146
tech_dur_dict,
147+
aggregate_projects=False,
137148
):
138149
duckdb_conn = duckdb.connect(database=":memory:")
139150
spec_cap_df = pd.read_csv(
@@ -145,17 +156,19 @@ def add_battery_durations(
145156
)
146157

147158
for tech in tech_dur_dict.keys():
159+
group_by = "GROUP BY project" if aggregate_projects else ""
148160
sql = f"""
149-
SELECT {disagg_project_name_str} AS project,
161+
SELECT {project_name_str} AS project,
150162
{study_year} as period
151163
FROM raw_data_eia860_generators
152164
JOIN user_defined_eia_gridpath_key ON
153-
raw_data_eia860_generators.prime_mover_code =
165+
raw_data_eia860_generators.prime_mover_code =
154166
user_defined_eia_gridpath_key.prime_mover_code
155167
AND energy_source_code_1 = energy_source_code
156168
WHERE 1 = 1
157169
AND {eia860_sql_filter_string}
158170
AND raw_data_eia860_generators.prime_mover_code = '{tech}'
171+
{group_by}
159172
;
160173
"""
161174
relevant_projects_df = pd.read_sql(sql, conn)
@@ -215,9 +228,15 @@ def main(args=None):
215228
"PS": parsed_args.pumped_storage_duration,
216229
}
217230

231+
project_name_str = (
232+
AGG_PROJECT_NAME_STR
233+
if parsed_args.aggregate_projects
234+
else DISAGG_PROJECT_NAME_STR
235+
)
236+
218237
add_battery_durations(
219238
conn=conn,
220-
disagg_project_name_str=DISAGG_PROJECT_NAME_STR,
239+
project_name_str=project_name_str,
221240
study_year=parsed_args.study_year,
222241
eia860_sql_filter_string=get_eia860_sql_filter_string(
223242
study_year=parsed_args.study_year, region=parsed_args.region
@@ -226,8 +245,10 @@ def main(args=None):
226245
subscenario_id=parsed_args.project_specified_capacity_scenario_id,
227246
subscenario_name=parsed_args.project_specified_capacity_scenario_name,
228247
tech_dur_dict=tech_dur_dict,
248+
aggregate_projects=parsed_args.aggregate_projects,
229249
)
230250

251+
conn.commit()
231252
conn.close()
232253

233254

data_toolkit/open_data_toolkit_settings_sample.csv

Lines changed: 0 additions & 109 deletions
This file was deleted.

data_toolkit/project/availability/eia860_to_project_availability_input_csvs.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,14 @@ def parse_arguments(args):
8787
"-avl_name", "--project_availability_scenario_name", default="no_derates"
8888
)
8989

90+
parser.add_argument(
91+
"-agg",
92+
"--aggregate_projects",
93+
default=False,
94+
action="store_true",
95+
help="Aggregate all projects to the BA-technology level.",
96+
)
97+
9098
parser.add_argument("-q", "--quiet", default=False, action="store_true")
9199

92100
parsed_arguments = parser.parse_known_args(args=args)[0]
@@ -104,14 +112,36 @@ def get_project_availability(
104112
csv_location,
105113
subscenario_id,
106114
subscenario_name,
115+
aggregate_projects=False,
107116
):
108-
sql = f"""
117+
if aggregate_projects:
118+
sql = f"""
119+
SELECT {agg_project_name_str} AS project,
120+
'exogenous' AS availability_type,
121+
NULL AS exogenous_availability_independent_scenario_id,
122+
NULL AS exogenous_availability_weather_scenario_id,
123+
NULL AS exogenous_availability_independent_bt_hrz_scenario_id,
124+
NULL AS exogenous_availability_weather_bt_hrz_scenario_id,
125+
NULL AS endogenous_availability_scenario_id
126+
FROM raw_data_eia860_generators
127+
JOIN user_defined_eia_gridpath_key ON
128+
raw_data_eia860_generators.prime_mover_code =
129+
user_defined_eia_gridpath_key.prime_mover_code
130+
AND energy_source_code_1 = energy_source_code
131+
WHERE 1 = 1
132+
AND {eia860_sql_filter_string}
133+
GROUP BY project
134+
;
135+
"""
136+
else:
137+
sql = f"""
109138
SELECT {disagg_project_name_str} AS project,
110139
'exogenous' AS availability_type,
111140
NULL AS exogenous_availability_independent_scenario_id,
112141
NULL AS exogenous_availability_weather_scenario_id,
113142
NULL AS exogenous_availability_independent_bt_hrz_scenario_id,
114143
NULL AS exogenous_availability_weather_bt_hrz_scenario_id,
144+
NULL AS exogenous_availability_monthly_scenario_id,
115145
NULL AS endogenous_availability_scenario_id
116146
FROM raw_data_eia860_generators
117147
JOIN user_defined_eia_gridpath_key ON
@@ -130,6 +160,7 @@ def get_project_availability(
130160
NULL AS exogenous_availability_weather_scenario_id,
131161
NULL AS exogenous_availability_independent_bt_hrz_scenario_id,
132162
NULL AS exogenous_availability_weather_bt_hrz_scenario_id,
163+
NULL AS exogenous_availability_monthly_scenario_id,
133164
NULL AS endogenous_availability_scenario_id
134165
FROM raw_data_eia860_generators
135166
JOIN user_defined_eia_gridpath_key
@@ -171,6 +202,7 @@ def main(args=None):
171202
csv_location=parsed_args.output_directory,
172203
subscenario_id=parsed_args.project_availability_scenario_id,
173204
subscenario_name=parsed_args.project_availability_scenario_name,
205+
aggregate_projects=parsed_args.aggregate_projects,
174206
)
175207

176208
conn.close()

0 commit comments

Comments
 (0)