Skip to content

Commit

Permalink
LCA cambium related - added default cambium files, updated resource _…
Browse files Browse the repository at this point in the history
…_init__, added cambium_data.py, updated pyproject.toml to include pytest-dependency, added test_cambium_resource.py, updated tests/hopp/utils.py with default cambium file
  • Loading branch information
dakotaramos committed Oct 22, 2024
1 parent 14ec697 commit 179a9f5
Show file tree
Hide file tree
Showing 11 changed files with 52,978 additions and 0 deletions.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions hopp/simulation/technologies/resource/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@
from hopp.simulation.technologies.resource.elec_prices import ElectricityPrices
from hopp.simulation.technologies.resource.resource import Resource
from hopp.simulation.technologies.resource.greet_data import GREETData
from hopp.simulation.technologies.resource.cambium_data import CambiumData
316 changes: 316 additions & 0 deletions hopp/simulation/technologies/resource/cambium_data.py

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ changelog = "https://github.com/NREL/HOPP/blob/main/RELEASE.md"
develop = [
"pytest",
"pytest-subtests",
"pytest-dependency",
"responses",
"sphinx",
"sphinx-rtd-theme",
Expand Down
93 changes: 93 additions & 0 deletions tests/hopp/test_cambium_resource.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
import pytest
import os
import json
import re
import glob
import pandas as pd
import requests

from hopp import ROOT_DIR
from hopp.simulation.technologies.resource import CambiumData
from hopp.simulation.technologies.resource.cambium_data import CAMBIUM_BASE_URL
from tests.hopp.utils import DEFAULT_CAMBIUM_DATA_FILE

# Obtain list of default cambium files
DEFAULT_CAMBIUM_DATA_FILE_DIR = DEFAULT_CAMBIUM_DATA_FILE.parent
DEFAULT_CAMBIUM_DATA_FILES_LIST = list(glob.glob(str(DEFAULT_CAMBIUM_DATA_FILE_DIR / "Cambium*.csv")))
DEFAULT_CAMBIUM_DATA_FILES_LIST.sort()

# Set default input arguments for CambiumData class (lat/lon corresponds to Golden, CO campus, aligns with other resource tests / files)
year = 2024
lat = 39.7555
lon = -105.2211

default_cambium_data_df = pd.read_csv(DEFAULT_CAMBIUM_DATA_FILE)

# Test functionality of loading Cambium Data from existing resource files
def test_cambium_load_from_file():
loaded_from_file_cambium = CambiumData(lat=lat, lon=lon, year=year, filepath=DEFAULT_CAMBIUM_DATA_FILE)
loaded_from_file_cambium_resource_files = loaded_from_file_cambium.resource_files
loaded_from_file_cambium_resource_files.sort()
# Check if list of resource files saved as class object attribute is equivalent to list of default files
assert loaded_from_file_cambium.resource_files == DEFAULT_CAMBIUM_DATA_FILES_LIST
# Check total # of files loaded / saved == 6 (2025:2050:5)
assert len(loaded_from_file_cambium.resource_files) == 6
assert len(loaded_from_file_cambium.cambium_years) == 6

# Test functionality of calling cambium API and saving to non-default file names by providing a filepath that does not exist
def test_cambium_save_to_file():
test_cambium_data_filepath = DEFAULT_CAMBIUM_DATA_FILE_DIR / "test_Cambium_AnyScenario_hourly_AnyLocation_2025.csv"
saved_to_file_cambium = CambiumData(lat=lat, lon=lon, year=year, filepath=test_cambium_data_filepath)
# For each resource file saved as class object attribute, check the file exists / was saved
for resource_file in saved_to_file_cambium.resource_files:
assert os.path.isfile(resource_file) == True
# Check total # of files downloaded / saved == 6 (2025:2050:5)
assert len(saved_to_file_cambium.resource_files) == 6
assert len(saved_to_file_cambium.cambium_years) == 6

# Test consistency of data between cached default cambium data files and test_Cambium_... files created from test_cambium_save_to_file()
def test_cambium_data_consistency():
test_resource_files = list(glob.glob(str(DEFAULT_CAMBIUM_DATA_FILE_DIR / "test_*.csv")))
test_resource_files.sort()
test_2025_resource_file_df = pd.read_csv(test_resource_files[0])
test_2050_resource_file_df = pd.read_csv(test_resource_files[-1])
default_2025_cambium_data_file_df = pd.read_csv(DEFAULT_CAMBIUM_DATA_FILES_LIST[0])
default_2050_cambium_data_file_df = pd.read_csv(DEFAULT_CAMBIUM_DATA_FILES_LIST[-1])
# Check column names from respective dataframes are equivalent
assert list(test_2025_resource_file_df.columns) == list(default_2025_cambium_data_file_df.columns)
assert list(test_2050_resource_file_df.columns) == list(default_2050_cambium_data_file_df.columns)
# Check column values are equivalent, sum all rows for each column and compare test vs default
assert list(test_2025_resource_file_df.sum()) == list(default_2025_cambium_data_file_df.sum())
assert list(test_2050_resource_file_df.sum()) == list(default_2050_cambium_data_file_df.sum())

# Test Cambium API server health
@pytest.mark.dependency(name="api_server_health")
def test_cambium_api_server_health():
url = CAMBIUM_BASE_URL
r = requests.get(url)
assert r.status_code != 500

# Test Cambium API calls
@pytest.mark.dependency(depends=["api_server_health"])
def test_cambium_api():
# Test base URL with no variables / arguments passed
url = CAMBIUM_BASE_URL
r = requests.get(url)
response_dict = json.loads(r.text)
assert r.status_code == 200
assert response_dict["status"] == "FAILED"
assert response_dict["message"] == "Missing columns: ['project_uuid', 'scenario', 'location_type', 'time_type', 'year']"

# Test a full URL call
url = 'https://scenarioviewer.nrel.gov/api/get-data-cache/?project_uuid=0f92fe57-3365-428a-8fe8-0afc326b3b43&scenario=Mid-case with 100% decarbonization by 2035&location_type=GEA Regions 2023&latitude=39.755&longitude=-105.2211&year=2025&time_type=hourly&metric_col=lrmer_co2e'
r = requests.get(url)
response_dict = json.loads(r.text)
assert r.status_code == 200
assert response_dict["status"] == "SUCCESS"
assert response_dict["message"][0]["metric"] == 'LRMER: CO2e Combustion+Precombustion [kg/MWh]'

# Test incorrect API URL
url = (CAMBIUM_BASE_URL + "a")
r = requests.get(url)
assert r.status_code == 404

1 change: 1 addition & 0 deletions tests/hopp/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
DEFAULT_SOLAR_RESOURCE_FILE = ROOT_DIR / "simulation" / "resource_files" / "solar" / "35.2018863_-101.945027_psmv3_60_2012.csv"
DEFAULT_WIND_RESOURCE_FILE = ROOT_DIR / "simulation" / "resource_files" / "wind" / "35.2018863_-101.945027_windtoolkit_2012_60min_80m_100m.srw"
DEFAULT_GREET_DATA_FILE = ROOT_DIR / "simulation" / "resource_files" / "greet" / "2023" / "greet_2023_processed.yaml"
DEFAULT_CAMBIUM_DATA_FILE = ROOT_DIR / "simulation" / "resource_files" / "cambium" / "Cambium23_MidCase100by2035_hourly_West_Connect_North_2025.csv"

# default configuration for `CustomFinancialModel`
DEFAULT_FIN_CONFIG = {
Expand Down

0 comments on commit 179a9f5

Please sign in to comment.