diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 65e8c4ef8..94293de47 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -4,8 +4,8 @@ - [#944](https://github.com/IAMconsortium/pyam/pull/944) Refactor to a `format_n()` function for nice log messages - [#943](https://github.com/IAMconsortium/pyam/pull/943) Improved handling for division by zero - [#941](https://github.com/IAMconsortium/pyam/pull/941) Add a `compute.share()` method -- [#938](https://github.com/IAMconsortium/pyam/pull/938) Add a function to initialize an IamDataFrame from an * - *ixmp4.Run** +- [#938](https://github.com/IAMconsortium/pyam/pull/938) Add a function to initialize an IamDataFrame from an **ixmp4.Run** +- [#950](https://github.com/IAMconsortium/pyam/pull/950) Add a useful error message on empty query result from an **ixmp4.Platform** # Release v3.2.0 diff --git a/pyam/ixmp4.py b/pyam/ixmp4.py index 5c0f64d01..29d024ca1 100644 --- a/pyam/ixmp4.py +++ b/pyam/ixmp4.py @@ -42,18 +42,24 @@ def read_ixmp4( meta_filters = dict( run=dict(default_only=default_only, model=model, scenario=scenario) ) - iamc_filters = dict( - run=dict(default_only=default_only), - model=model, - scenario=scenario, - region=region, - variable=variable, - unit=unit, - year=year, - ) + iamc_filters = dict(run=dict(default_only=default_only)) + for key, value in ( + ("model", model), + ("scenario", scenario), + ("region", region), + ("variable", variable), + ("unit", unit), + ("year", year), + ): + if value is not None: + iamc_filters[key] = value + data = platform.iamc.tabulate(**iamc_filters) meta = platform.meta.tabulate(**meta_filters) + if data.empty: + raise ValueError("No scenario data with filters " + str(iamc_filters)) + # if default-only, simplify to standard IAMC index, add `version` as meta indicator if default_only: index = ["model", "scenario"] diff --git a/tests/test_ixmp4.py b/tests/test_ixmp4.py index 5ff4dc62c..5028102f6 100644 --- a/tests/test_ixmp4.py +++ b/tests/test_ixmp4.py @@ -112,6 +112,11 @@ def test_ixmp4_reserved_columns(test_platform, test_df_year, drop_meta): assert_iamframe_equal(test_df_year, pyam.read_ixmp4(test_platform)) +def test_ixmp4_empty_result(test_platform): + with pytest.raises(ValueError, match=r"No scenario data with filters \{.*'foo'\}"): + read_ixmp4(test_platform, variable="foo") + + def test_ixmp4_read_run(test_platform, test_df): """Initialize an IamDataFrame from an ixmp4 run"""