Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
2ac15a1
Remove summarize_results (#1340)
anamileva Mar 23, 2026
518e52d
Delete summary results files from examples
anamileva Mar 23, 2026
078425a
Default reserve ramp rates to infinity (#1341)
anamileva Mar 23, 2026
bc7b9d7
Small bug fixes (#1342)
jaxstuhr Apr 1, 2026
776131b
Update scenarios view (#1343)
anamileva Apr 1, 2026
1a7682c
Create OPR_PRJS_IN_TMP set more efficiently (#1344)
anamileva Apr 1, 2026
a9c4e39
Project summary results enhancements (#1345)
anamileva Apr 1, 2026
9452fc3
Save some dispatch_plot mods for future reference
anamileva Apr 1, 2026
47578f8
Add foreign key for project relative capacity mapping (#1347)
Janie115 Apr 2, 2026
df38caa
Enhancements to the import/export rules functionality (#1346)
anamileva Apr 2, 2026
ad380fc
github actions version update (#1350)
anamileva Apr 8, 2026
c53a59e
Month-Hour Policy within Generic Policy Framework (#1349)
jaxstuhr Apr 14, 2026
65be051
Loose ends from #1349
anamileva Apr 14, 2026
7737aaa
Update zenodo badge
anamileva Apr 14, 2026
3fb75b7
Month-hour policy result files cleanup (#1352)
jaxstuhr Apr 15, 2026
7563781
Support for cap factor defaults (#1353)
anamileva Apr 16, 2026
783723f
RA Toolkit updates (#1351)
anamileva Apr 21, 2026
96d692e
Prompt to delete prior databases
anamileva Apr 21, 2026
0c533e6
Quick script for creating test database
anamileva Apr 21, 2026
65509ad
Support for limiting power output from groups of projects (#1356)
anamileva Apr 22, 2026
1b5a3ae
Add batching functions to dispatch plot (#1358)
yifang-zhu-pge Apr 27, 2026
1d0b7cc
Improve query efficiency for profile inputs (#1363)
anamileva Apr 28, 2026
7a3ceee
Apply outages to hybrid gen and stor components (#1364)
anamileva Apr 28, 2026
4a69304
RA Toolkit support for not printing default availability values of 1 …
anamileva Apr 28, 2026
b8e7a83
Support for loading HiGHS solutions + tweaks to CPLEX solution parsing
anamileva Apr 29, 2026
026ed3c
Support for simple monthly project availability derates (#1366)
anamileva Apr 29, 2026
0dc352d
Refactor scenario structure code (#1367)
anamileva Apr 30, 2026
0f55936
Pandas 2.x int64 fix and hydro_balancing_type parameter in Data Toolk…
allisonmcampbell May 4, 2026
12bc8ca
Temporal structure overwrite from CSV file (#1368)
anamileva May 6, 2026
4a44486
Results import efficiencies (#1369)
anamileva May 12, 2026
eb567f1
Batch draws and remove seed from temp iterations (#1370)
anamileva May 13, 2026
d4cc65f
Allow negative generic policy targets
anamileva May 18, 2026
3db0cf5
Don't create logger on --skip_solve and explicitly close logger (#1371)
anamileva May 18, 2026
9476db5
Support for drawing availability profiles from historical data (#1372)
anamileva May 19, 2026
fa43505
Improve efficiency of Data Toolkit availability profile creation (#1373)
anamileva May 19, 2026
1ae84ae
Efficient parallelization with incomplete_only flag (#1375)
anamileva May 27, 2026
70957e5
Fixes to some cost queries (#1374)
eranschweitzer May 28, 2026
89988c5
Data Toolkit optional BA-level project aggregation via --aggregate_pr…
allisonmcampbell May 28, 2026
6883e05
Bump version to v2026.3.0
anamileva May 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions .github/workflows/test_gridpath.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@ jobs:
python-version: [ "3.11", "3.12", "3.13" ]

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Install sqlite3 3.45.0 on Linux
if: startsWith(runner.os, 'Linux')
run: |
bash ./.github/workflows/upgrade_sqlite_on_linux.sh
- name: Set up Python
uses: actions/setup-python@v3
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Install Cbc and check version (Linux)
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
[![Coverage Status](https://coveralls.io/repos/github/blue-marble/gridpath/badge.svg?branch=main)](https://coveralls.io/github/blue-marble/gridpath?branch=main)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![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)
[![DOI](https://zenodo.org/badge/65574330.svg)](https://zenodo.org/badge/latestdoi/65574330)
[![DOI](https://zenodo.org/badge/65574330.svg)](https://doi.org/10.5281/zenodo.5822994)

# Welcome to GridPath

Expand Down
35 changes: 21 additions & 14 deletions data_toolkit/load_raw_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
import sys
from argparse import ArgumentParser
import os.path
from sqlite3 import Connection

import pandas as pd

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

# Set low_memory to False to avoid dtype warning
# TODO: actually specify dtypes instead
df = pd.read_csv(
f_path, delimiter=",", low_memory=False, on_bad_lines="warn"
)

spin_on_database_lock_generic(
command=df.to_sql(
name=table,
con=conn,
if_exists="append",
index=False,
)
)
read_and_import_csv(conn, f_path, table)

conn.commit()
conn.close()


def read_and_import_csv(conn: Connection, f_path: str, table):
# Set low_memory to False to avoid dtype warning
# TODO: actually specify dtypes instead
df = pd.read_csv(f_path, delimiter=",", low_memory=False, on_bad_lines="warn")

# print(f_path)
# print(df)
spin_on_database_lock_generic(
command=df.to_sql(
name=table,
con=conn,
if_exists="append",
index=False,
)
)


if __name__ == "__main__":
main()
29 changes: 25 additions & 4 deletions data_toolkit/manual_adjustments.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,11 @@
import pandas as pd

from db.common_functions import connect_to_database
from data_toolkit.load_raw_data import read_and_import_csv
from data_toolkit.project.project_data_filters_common import (
get_eia860_sql_filter_string,
DISAGG_PROJECT_NAME_STR,
AGG_PROJECT_NAME_STR,
)

# Storage durations
Expand Down Expand Up @@ -93,6 +95,14 @@ def parse_arguments(args):
help="Overwrite existing CSV files.",
)

parser.add_argument(
"-agg",
"--aggregate_projects",
default=False,
action="store_true",
help="Aggregate all projects to the BA-technology level.",
)

parser.add_argument("-q", "--quiet", default=False, action="store_true")

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

def add_battery_durations(
conn,
disagg_project_name_str,
project_name_str,
study_year,
eia860_sql_filter_string,
csv_location,
subscenario_id,
subscenario_name,
tech_dur_dict,
aggregate_projects=False,
):
duckdb_conn = duckdb.connect(database=":memory:")
spec_cap_df = pd.read_csv(
Expand All @@ -145,17 +156,19 @@ def add_battery_durations(
)

for tech in tech_dur_dict.keys():
group_by = "GROUP BY project" if aggregate_projects else ""
sql = f"""
SELECT {disagg_project_name_str} AS project,
SELECT {project_name_str} AS project,
{study_year} as period
FROM raw_data_eia860_generators
JOIN user_defined_eia_gridpath_key ON
raw_data_eia860_generators.prime_mover_code =
raw_data_eia860_generators.prime_mover_code =
user_defined_eia_gridpath_key.prime_mover_code
AND energy_source_code_1 = energy_source_code
WHERE 1 = 1
AND {eia860_sql_filter_string}
AND raw_data_eia860_generators.prime_mover_code = '{tech}'
{group_by}
;
"""
relevant_projects_df = pd.read_sql(sql, conn)
Expand Down Expand Up @@ -215,9 +228,15 @@ def main(args=None):
"PS": parsed_args.pumped_storage_duration,
}

project_name_str = (
AGG_PROJECT_NAME_STR
if parsed_args.aggregate_projects
else DISAGG_PROJECT_NAME_STR
)

add_battery_durations(
conn=conn,
disagg_project_name_str=DISAGG_PROJECT_NAME_STR,
project_name_str=project_name_str,
study_year=parsed_args.study_year,
eia860_sql_filter_string=get_eia860_sql_filter_string(
study_year=parsed_args.study_year, region=parsed_args.region
Expand All @@ -226,8 +245,10 @@ def main(args=None):
subscenario_id=parsed_args.project_specified_capacity_scenario_id,
subscenario_name=parsed_args.project_specified_capacity_scenario_name,
tech_dur_dict=tech_dur_dict,
aggregate_projects=parsed_args.aggregate_projects,
)

conn.commit()
conn.close()


Expand Down
109 changes: 0 additions & 109 deletions data_toolkit/open_data_toolkit_settings_sample.csv

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,14 @@ def parse_arguments(args):
"-avl_name", "--project_availability_scenario_name", default="no_derates"
)

parser.add_argument(
"-agg",
"--aggregate_projects",
default=False,
action="store_true",
help="Aggregate all projects to the BA-technology level.",
)

parser.add_argument("-q", "--quiet", default=False, action="store_true")

parsed_arguments = parser.parse_known_args(args=args)[0]
Expand All @@ -104,14 +112,36 @@ def get_project_availability(
csv_location,
subscenario_id,
subscenario_name,
aggregate_projects=False,
):
sql = f"""
if aggregate_projects:
sql = f"""
SELECT {agg_project_name_str} AS project,
'exogenous' AS availability_type,
NULL AS exogenous_availability_independent_scenario_id,
NULL AS exogenous_availability_weather_scenario_id,
NULL AS exogenous_availability_independent_bt_hrz_scenario_id,
NULL AS exogenous_availability_weather_bt_hrz_scenario_id,
NULL AS endogenous_availability_scenario_id
FROM raw_data_eia860_generators
JOIN user_defined_eia_gridpath_key ON
raw_data_eia860_generators.prime_mover_code =
user_defined_eia_gridpath_key.prime_mover_code
AND energy_source_code_1 = energy_source_code
WHERE 1 = 1
AND {eia860_sql_filter_string}
GROUP BY project
;
"""
else:
sql = f"""
SELECT {disagg_project_name_str} AS project,
'exogenous' AS availability_type,
NULL AS exogenous_availability_independent_scenario_id,
NULL AS exogenous_availability_weather_scenario_id,
NULL AS exogenous_availability_independent_bt_hrz_scenario_id,
NULL AS exogenous_availability_weather_bt_hrz_scenario_id,
NULL AS exogenous_availability_monthly_scenario_id,
NULL AS endogenous_availability_scenario_id
FROM raw_data_eia860_generators
JOIN user_defined_eia_gridpath_key ON
Expand All @@ -130,6 +160,7 @@ def get_project_availability(
NULL AS exogenous_availability_weather_scenario_id,
NULL AS exogenous_availability_independent_bt_hrz_scenario_id,
NULL AS exogenous_availability_weather_bt_hrz_scenario_id,
NULL AS exogenous_availability_monthly_scenario_id,
NULL AS endogenous_availability_scenario_id
FROM raw_data_eia860_generators
JOIN user_defined_eia_gridpath_key
Expand Down Expand Up @@ -171,6 +202,7 @@ def main(args=None):
csv_location=parsed_args.output_directory,
subscenario_id=parsed_args.project_availability_scenario_id,
subscenario_name=parsed_args.project_availability_scenario_name,
aggregate_projects=parsed_args.aggregate_projects,
)

conn.close()
Expand Down
Loading
Loading