Skip to content

Commit f4199af

Browse files
committed
Make higher-level function for utilisation and minimum service factor checks
1 parent 4c10462 commit f4199af

2 files changed

Lines changed: 51 additions & 34 deletions

File tree

src/muse/readers/csv.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ def to_agent_share(name):
100100
data = data.drop(["process_name", "region_name", "time"], axis=1)
101101
data = data.apply(to_numeric, axis=0)
102102

103-
check_utilization_not_all_zero(data, filename)
103+
check_utilization_and_minimum_service_factors(data, filename)
104104

105105
result = xr.Dataset.from_dataframe(data.sort_index())
106106
if "fuel" in result.variables:
@@ -132,8 +132,6 @@ def to_agent_share(name):
132132
if "year" in result.dims and len(result.year) == 1:
133133
result = result.isel(year=0, drop=True)
134134

135-
check_minimum_service_factors_in_range(data, filename)
136-
137135
return result
138136

139137

@@ -149,8 +147,7 @@ def read_technodata_timeslices(filename: Union[str, Path]) -> xr.Dataset:
149147
data = csv[csv.technology != "Unit"]
150148

151149
data = data.apply(to_numeric)
152-
check_utilization_not_all_zero(data, filename)
153-
check_minimum_service_factors_in_range(data, filename)
150+
check_utilization_and_minimum_service_factors(data, filename)
154151

155152
ts = pd.MultiIndex.from_frame(
156153
data.drop(
@@ -925,13 +922,18 @@ def read_finite_resources(path: Union[str, Path]) -> xr.DataArray:
925922
return xr.Dataset.from_dataframe(data).to_array(dim="commodity")
926923

927924

928-
def check_utilization_not_all_zero(data, filename):
925+
def check_utilization_and_minimum_service_factors(data, filename):
929926
if "utilization_factor" not in data.columns:
930927
raise ValueError(
931928
f"""A technology needs to have a utilization factor defined for every
932929
timeslice. Please check file {filename}."""
933930
)
934931

932+
_check_utilization_not_all_zero(data, filename)
933+
_check_minimum_service_factors_in_range(data, filename)
934+
935+
936+
def _check_utilization_not_all_zero(data, filename):
935937
utilization_sum = data.groupby(["technology", "region", "year"]).sum()
936938

937939
if (utilization_sum.utilization_factor == 0).any():
@@ -941,7 +943,7 @@ def check_utilization_not_all_zero(data, filename):
941943
)
942944

943945

944-
def check_minimum_service_factors_in_range(data, filename):
946+
def _check_minimum_service_factors_in_range(data, filename):
945947
try:
946948
min_service_factor = data["minimum_service_factor"]
947949
except KeyError:

tests/test_readers.py

Lines changed: 42 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from itertools import chain, permutations
22
from pathlib import Path
3+
from unittest.mock import patch
34

45
import toml
56
import xarray as xr
@@ -415,7 +416,7 @@ def test_read_trade_technodata(tmp_path):
415416

416417
def test_check_utilization_not_all_zero_success():
417418
import pandas as pd
418-
from muse.readers.csv import check_utilization_not_all_zero
419+
from muse.readers.csv import _check_utilization_not_all_zero
419420

420421
df = pd.DataFrame(
421422
{
@@ -425,12 +426,12 @@ def test_check_utilization_not_all_zero_success():
425426
"year": (2010, 2010, 2011),
426427
}
427428
)
428-
check_utilization_not_all_zero(df, "file.csv")
429+
_check_utilization_not_all_zero(df, "file.csv")
429430

430431

431432
def test_check_utilization_not_all_zero_fail_all_zero():
432433
import pandas as pd
433-
from muse.readers.csv import check_utilization_not_all_zero
434+
from muse.readers.csv import _check_utilization_not_all_zero
434435

435436
df = pd.DataFrame(
436437
{
@@ -442,52 +443,66 @@ def test_check_utilization_not_all_zero_fail_all_zero():
442443
)
443444

444445
with raises(ValueError):
445-
check_utilization_not_all_zero(df, "file.csv")
446-
447-
448-
def test_check_utilization_not_all_zero_fail_missing_column():
449-
import pandas as pd
450-
from muse.readers.csv import check_utilization_not_all_zero
451-
452-
# NB: Required utilization_factor column is missing
453-
df = pd.DataFrame(
454-
{
455-
"technology": ("gas", "gas", "solar"),
456-
"region": ("GB", "GB", "FR"),
457-
"year": (2010, 2010, 2011),
458-
}
459-
)
460-
461-
with raises(ValueError):
462-
check_utilization_not_all_zero(df, "file.csv")
446+
_check_utilization_not_all_zero(df, "file.csv")
463447

464448

465449
def test_check_minimum_service_factors_in_range_success():
466450
import pandas as pd
467-
from muse.readers.csv import check_minimum_service_factors_in_range
451+
from muse.readers.csv import _check_minimum_service_factors_in_range
468452

469453
df = pd.DataFrame({"minimum_service_factor": (0, 1)})
470-
check_minimum_service_factors_in_range(df, "file.csv")
454+
_check_minimum_service_factors_in_range(df, "file.csv")
471455

472456

473457
def test_check_minimum_service_factors_in_range_column_missing():
474458
import pandas as pd
475-
from muse.readers.csv import check_minimum_service_factors_in_range
459+
from muse.readers.csv import _check_minimum_service_factors_in_range
476460

477461
# If the minimum_service_factor column is missing, the function should just return
478462
# without raising an error
479463
df = pd.DataFrame()
480-
check_minimum_service_factors_in_range(df, "file.csv")
464+
_check_minimum_service_factors_in_range(df, "file.csv")
481465

482466

483467
@mark.parametrize(
484468
"values", chain.from_iterable(permutations((0, bad)) for bad in (-1, 2))
485469
)
486470
def test_check_minimum_service_factors_in_range_fail(values):
487471
import pandas as pd
488-
from muse.readers.csv import check_minimum_service_factors_in_range
472+
from muse.readers.csv import _check_minimum_service_factors_in_range
489473

490474
df = pd.DataFrame({"minimum_service_factor": values})
491475

492476
with raises(ValueError):
493-
check_minimum_service_factors_in_range(df, "file.csv")
477+
_check_minimum_service_factors_in_range(df, "file.csv")
478+
479+
480+
@patch("muse.readers.csv._check_minimum_service_factors_in_range")
481+
@patch("muse.readers.csv._check_utilization_not_all_zero")
482+
def test_check_utilization_and_minimum_service_factors(*mocks):
483+
import pandas as pd
484+
from muse.readers.csv import check_utilization_and_minimum_service_factors
485+
486+
df = pd.DataFrame({"utilization_factor": (0, 0, 1)})
487+
check_utilization_and_minimum_service_factors(df, "file.csv")
488+
for mock in mocks:
489+
mock.assert_called_once_with(df, "file.csv")
490+
491+
492+
@patch("muse.readers.csv._check_minimum_service_factors_in_range")
493+
@patch("muse.readers.csv._check_utilization_not_all_zero")
494+
def test_check_utilization_and_minimum_service_factors_missing_column(*mocks):
495+
import pandas as pd
496+
from muse.readers.csv import check_utilization_and_minimum_service_factors
497+
498+
# NB: Required utilization_factor column is missing
499+
df = pd.DataFrame(
500+
{
501+
"technology": ("gas", "gas", "solar"),
502+
"region": ("GB", "GB", "FR"),
503+
"year": (2010, 2010, 2011),
504+
}
505+
)
506+
507+
with raises(ValueError):
508+
check_utilization_and_minimum_service_factors(df, "file.csv")

0 commit comments

Comments
 (0)