From 05558bebcf0539aabf1a7067c8cd717366b993e2 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Mon, 18 Mar 2024 10:27:21 +0100 Subject: [PATCH 01/15] Add tests for filters --- tests/test_ixmp4.py | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/tests/test_ixmp4.py b/tests/test_ixmp4.py index 1d43a0b41..ad705e02b 100644 --- a/tests/test_ixmp4.py +++ b/tests/test_ixmp4.py @@ -4,6 +4,7 @@ import pyam from pyam import read_ixmp4 +from pyam.testing import assert_iamframe_equal def test_to_ixmp4_missing_region_raises(test_platform, test_df_year): @@ -37,12 +38,12 @@ def test_ixmp4_integration(test_platform, test_df_year): obs = read_ixmp4(platform=test_platform) exp = test_df_year.copy() exp.set_meta(1, "version") # add version number added from ixmp4 - pyam.assert_iamframe_equal(exp, obs) + assert_iamframe_equal(exp, obs) # make one scenario a non-default scenario, make sure that it is not included test_platform.runs.get("model_a", "scen_b").unset_as_default() obs = read_ixmp4(platform=test_platform) - pyam.assert_iamframe_equal(exp.filter(scenario="scen_a"), obs) + assert_iamframe_equal(exp.filter(scenario="scen_a"), obs) # read all scenarios (runs) - version number used as additional index dimension obs = read_ixmp4(platform=test_platform, default_only=False) @@ -54,6 +55,32 @@ def test_ixmp4_integration(test_platform, test_df_year): pyam.assert_iamframe_equal(exp, obs) +@pytest.mark.parametrize( + "filters", + ( + dict(model="model_a"), + dict(scenario="scen_a"), + dict(scenario="*n_a"), + dict(model="model_a", scenario="scen_a", region="World", variable="* Energy"), + dict(scenario="scen_a", region="World", variable="Primary Energy", year=2010), + ), +) +def test_ixmp4_filters(test_platform, test_df_year, filters): + """Write an IamDataFrame to the platform and read it back with filters""" + + # test writing to platform + test_df_year.to_ixmp4(platform=test_platform) + + # add 'version' meta indicator (indicator during imp4 roundtrip) + test_df_year.set_meta(1, "version") + + # read with filters + assert_iamframe_equal( + read_ixmp4(test_platform, **filters), + test_df_year.filter(**filters), + ) + + @pytest.mark.parametrize("drop_meta", (True, False)) def test_ixmp4_reserved_columns(test_platform, test_df_year, drop_meta): """Make sure that a 'version' column in `meta` is not written to the platform""" From eed8e899d7135c1a85f3d6ad634228d32e172385 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Mon, 18 Mar 2024 10:31:24 +0100 Subject: [PATCH 02/15] Add filters to `read_ixmp4()` --- pyam/ixmp4.py | 42 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/pyam/ixmp4.py b/pyam/ixmp4.py index 174c16fa6..094a60e82 100644 --- a/pyam/ixmp4.py +++ b/pyam/ixmp4.py @@ -8,23 +8,47 @@ logger = logging.getLogger(__name__) -def read_ixmp4(platform: ixmp4.Platform | str, default_only: bool = True): +def read_ixmp4( + platform: ixmp4.Platform | str, + default_only: bool = True, + model: str | list[str] | None = None, + scenario: str | list[str] | None = None, + region: str | list[str] | None = None, + variable: str | list[str] | None = None, + unit: str | list[str] | None = None, + year: int | list[int] | None = None, +): """Read scenario runs from an ixmp4 platform database instance Parameters ---------- platform : :class:`ixmp4.Platform` or str - The ixmp4 platform database instance to which the scenario data is saved + The ixmp4 platform database instance to which the scenario data is saved. default_only : :class:`bool`, optional - Read only default runs + Read only default runs. + model, scenario, region, variable, unit : str or list of str, optional + Filter by these dimensions. + year : int or list of int, optional + Filter by time domain. """ from pyam import IamDataFrame if not isinstance(platform, ixmp4.Platform): platform = ixmp4.Platform(platform) - data = platform.iamc.tabulate(run={"default_only": default_only}) - meta = platform.meta.tabulate(run={"default_only": default_only}) + run_filters = _make_dict(run=dict(default_only=default_only)) + iamc_filters = _make_dict( + model=model, + scenario=scenario, + region=region, + variable=variable, + unit=unit, + year=year, + ) + + data = platform.iamc.tabulate(**run_filters, **iamc_filters) + # TODO filter by model/scenario depends on https://github.com/iiasa/ixmp4/pull/66 + meta = platform.meta.tabulate(**run_filters) # if default-only, simplify to standard IAMC index, add `version` as meta indicator if default_only: @@ -43,6 +67,14 @@ def read_ixmp4(platform: ixmp4.Platform | str, default_only: bool = True): return IamDataFrame(data, meta=meta, index=index) +def _make_dict(**kwargs): + _dict = dict() + for key, value in kwargs.items(): + if value is not None: + _dict[key] = value + return _dict + + def write_to_ixmp4(platform: ixmp4.Platform | str, df): """Save all scenarios as new default runs in an ixmp4 platform database instance From 3c847c718f46969b958d9161bacdf6db9564ec09 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Mon, 18 Mar 2024 10:31:35 +0100 Subject: [PATCH 03/15] Minor clean-up --- pyam/ixmp4.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pyam/ixmp4.py b/pyam/ixmp4.py index 094a60e82..f37afd4d7 100644 --- a/pyam/ixmp4.py +++ b/pyam/ixmp4.py @@ -102,8 +102,7 @@ def write_to_ixmp4(platform: ixmp4.Platform | str, df): if missing := set(values).difference(platform_values): raise model.NotFound( ", ".join(missing) - + f". Use `Platform.{dimension}.create()` to add the missing " - f"{dimension}." + + f". Use `Platform.{dimension}.create()` to add missing elements." ) # The "version" meta-indicator, added when reading from an ixmp4 platform, From 6c85a890aeabc00d298dcf860b777955dc6d3323 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Mon, 18 Mar 2024 10:36:44 +0100 Subject: [PATCH 04/15] Add to release notes --- RELEASE_NOTES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 1c3687e33..9a7527182 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -6,6 +6,7 @@ Bumped minimum version of pandas and numpy to fit **ixmp4**'s requirement. ## Individual updates +- [#838](https://github.com/IAMconsortium/pyam/pull/838) Support filters when reading from an ixmp4 platform - [#837](https://github.com/IAMconsortium/pyam/pull/837) Support filters as direct keyword arguments for `categorize()` similar to `validate()` signature (see [#804](https://github.com/IAMconsortium/pyam/pull/804)) - [#832](https://github.com/IAMconsortium/pyam/pull/832) Improve the test-suite for the ixmp4 integration From d0f1ad25131711feb35e8d505c5cec4db2bf5b42 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Wed, 20 Mar 2024 07:05:58 +0100 Subject: [PATCH 05/15] Upgrade ixmp4 dependency --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index cc0b0554e..0e94e9ee7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,7 +44,7 @@ classifiers = [ [tool.poetry.dependencies] python = ">=3.10, <3.13" iam-units = ">=2020.4.21" -ixmp4 = ">=0.7.3" +ixmp4 = ">=0.8.0" matplotlib = ">=3.6.0" numpy = ">=1.26.0" openpyxl = ">=3.1.2" From 14f5f4f87f2e061b5e72b06b981a563e7950dde9 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Wed, 20 Mar 2024 08:17:17 +0100 Subject: [PATCH 06/15] Update lock --- poetry.lock | 467 +++++++++++++++++++++++++++------------------------- 1 file changed, 242 insertions(+), 225 deletions(-) diff --git a/poetry.lock b/poetry.lock index 157655491..ad67f7cee 100644 --- a/poetry.lock +++ b/poetry.lock @@ -202,17 +202,17 @@ css = ["tinycss2 (>=1.1.0,<1.3)"] [[package]] name = "boto3" -version = "1.34.59" +version = "1.34.66" description = "The AWS SDK for Python" optional = false python-versions = ">= 3.8" files = [ - {file = "boto3-1.34.59-py3-none-any.whl", hash = "sha256:004e67b078be58d34469406f93cc8b95bc43becef4bbe44523a0b8e51f84c668"}, - {file = "boto3-1.34.59.tar.gz", hash = "sha256:162edf182e53c198137a28432a626dba103f787a8f5000ed4758b73ccd203fa0"}, + {file = "boto3-1.34.66-py3-none-any.whl", hash = "sha256:036989117c0bc4029daaa4cf713c4ff8c227b3eac6ef0e2118eb4098c114080e"}, + {file = "boto3-1.34.66.tar.gz", hash = "sha256:b1d6be3d5833e56198dc635ff4b428b93e5a2a2bd9bc4d94581a572a1ce97cfe"}, ] [package.dependencies] -botocore = ">=1.34.59,<1.35.0" +botocore = ">=1.34.66,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -221,19 +221,19 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.59" +version = "1.34.66" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">= 3.8" files = [ - {file = "botocore-1.34.59-py3-none-any.whl", hash = "sha256:4bc112dafb1679ab571117593f7656604726a3da0e5ae5bad00ea772fa40e75c"}, - {file = "botocore-1.34.59.tar.gz", hash = "sha256:24edb4d21d7c97dea0c6c4a80d36b3809b1443a30b0bd5e317d6c319dfac823f"}, + {file = "botocore-1.34.66-py3-none-any.whl", hash = "sha256:92560f8fbdaa9dd221212a3d3a7609219ba0bbf308c13571674c0cda9d8f39e1"}, + {file = "botocore-1.34.66.tar.gz", hash = "sha256:fd7d8742007c220f897cb126b8916ca0cf3724a739d4d716aa5385d7f9d8aeb1"}, ] [package.dependencies] jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" -urllib3 = {version = ">=1.25.4,<2.1", markers = "python_version >= \"3.10\""} +urllib3 = {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""} [package.extras] crt = ["awscrt (==0.19.19)"] @@ -483,13 +483,13 @@ files = [ [[package]] name = "comm" -version = "0.2.1" +version = "0.2.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false python-versions = ">=3.8" files = [ - {file = "comm-0.2.1-py3-none-any.whl", hash = "sha256:87928485c0dfc0e7976fd89fc1e187023cf587e7c353e4a9b417555b44adf021"}, - {file = "comm-0.2.1.tar.gz", hash = "sha256:0bc91edae1344d39d3661dcbc36937181fdaddb304790458f8b044dbc064b89a"}, + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, ] [package.dependencies] @@ -662,20 +662,21 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "dask" -version = "2024.2.1" +version = "2024.3.1" description = "Parallel PyData with Task Scheduling" optional = false python-versions = ">=3.9" files = [ - {file = "dask-2024.2.1-py3-none-any.whl", hash = "sha256:a13fcdeead3bab3576495023f83097adcffe2f03c371c241b5a1f0b232b35b38"}, - {file = "dask-2024.2.1.tar.gz", hash = "sha256:9504a1e9f5d8e5403fae931f9f1660d41f510f48895ccefce856ec6a4c2198d8"}, + {file = "dask-2024.3.1-py3-none-any.whl", hash = "sha256:1ac260b8716b1a9fc144c0d7f958336812cfc3ef542a3742c9ae02387189b32b"}, + {file = "dask-2024.3.1.tar.gz", hash = "sha256:78bee2ffd735514e572adaa669fc2a437ec256aecb6bec036a1f5b8dd36b2e60"}, ] [package.dependencies] click = ">=8.1" cloudpickle = ">=1.5.0" +dask-expr = {version = ">=1.0,<1.1", optional = true, markers = "extra == \"dataframe\""} fsspec = ">=2021.09.0" -importlib-metadata = ">=4.13.0" +importlib-metadata = {version = ">=4.13.0", markers = "python_version < \"3.12\""} numpy = {version = ">=1.21", optional = true, markers = "extra == \"array\""} packaging = ">=20.0" pandas = {version = ">=1.3", optional = true, markers = "extra == \"dataframe\""} @@ -686,31 +687,79 @@ toolz = ">=0.10.0" [package.extras] array = ["numpy (>=1.21)"] complete = ["dask[array,dataframe,diagnostics,distributed]", "lz4 (>=4.3.2)", "pyarrow (>=7.0)", "pyarrow-hotfix"] -dataframe = ["dask[array]", "pandas (>=1.3)"] +dataframe = ["dask-expr (>=1.0,<1.1)", "dask[array]", "pandas (>=1.3)"] diagnostics = ["bokeh (>=2.4.2)", "jinja2 (>=2.10.3)"] -distributed = ["distributed (==2024.2.1)"] +distributed = ["distributed (==2024.3.1)"] test = ["pandas[test]", "pre-commit", "pytest", "pytest-cov", "pytest-rerunfailures", "pytest-timeout", "pytest-xdist"] +[[package]] +name = "dask-expr" +version = "1.0.4" +description = "High Level Expressions for Dask" +optional = false +python-versions = ">=3.9" +files = [ + {file = "dask-expr-1.0.4.tar.gz", hash = "sha256:58899409fe9c19eedb1eba2477a0308da2cc3b3e1984b913fdbf012481b76326"}, + {file = "dask_expr-1.0.4-py3-none-any.whl", hash = "sha256:442463458dbd583768d67d4d6a904904e2b3115bb65e6b8215832e760ab86cf1"}, +] + +[package.dependencies] +dask = "2024.3.1" +pandas = ">=2" +pyarrow = ">=7.0.0" + +[[package]] +name = "dataflows-tabulator" +version = "1.54.1" +description = "Consistent interface for stream reading and writing tabular data (csv/xls/json/etc)" +optional = false +python-versions = "*" +files = [ + {file = "dataflows-tabulator-1.54.1.tar.gz", hash = "sha256:c1f4c105735b0a8c5bedbffa4df412ae4009aaec51574100c0ffdf2192095336"}, + {file = "dataflows_tabulator-1.54.1-py2.py3-none-any.whl", hash = "sha256:7d285d5dd134d78910d6e97c2e90dc3200b35743ca46f6a5c5dbdddc53366dfb"}, +] + +[package.dependencies] +boto3 = ">=1.9" +chardet = ">=3.0" +click = ">=6.0" +ijson = ">=3.0.3" +jsonlines = ">=1.1" +linear-tsv = ">=1.0" +openpyxl = ">=2.6" +requests = ">=2.8" +six = ">=1.9" +sqlalchemy = ">=0.9.6" +unicodecsv = ">=0.14" +xlrd = ">=1.0" + +[package.extras] +cchardet = ["cchardet (>=2.0)"] +datapackage = ["datapackage (>=1.12)"] +develop = ["mock", "moto[server]", "pylama", "pytest", "pytest-cov"] +html = ["pyquery (<1.4.2)"] +ods = ["ezodf (>=0.3)", "lxml (>=3.0)"] + [[package]] name = "datapackage" -version = "1.15.2" +version = "1.15.4" description = "Utilities to work with Data Packages as defined on specs.frictionlessdata.io" optional = false python-versions = "*" files = [ - {file = "datapackage-1.15.2-py2.py3-none-any.whl", hash = "sha256:5d429d566482ddb5e2424a4f6ac80782340fd2eb707595d601511d077d6caaba"}, - {file = "datapackage-1.15.2.tar.gz", hash = "sha256:1e91a18c866914dea0acfe2aec785e6ec583c33766b0682c740b30bb7de88c58"}, + {file = "datapackage-1.15.4-py2.py3-none-any.whl", hash = "sha256:c8498b421ef29eb8f71228b789e2148d38663ef0a93680612f058aea2a31e5a2"}, + {file = "datapackage-1.15.4.tar.gz", hash = "sha256:7fe7c17a58bb5fad903209d4f761199569d33cc45aad6d88213a8d8f7b3f7092"}, ] [package.dependencies] chardet = ">=3.0" click = ">=6.7" +dataflows-tabulator = ">=1.29" jsonpointer = ">=1.10" jsonschema = ">=2.5" requests = ">=2.8" six = ">=1.10" -tableschema = ">=1.12.1" -tabulator = ">=1.29" +tableschema = ">=1.20.4" unicodecsv = ">=0.14" [package.extras] @@ -854,13 +903,13 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "fake-useragent" -version = "1.5.0" +version = "1.5.1" description = "Up-to-date simple useragent faker with real world database" optional = false python-versions = "*" files = [ - {file = "fake-useragent-1.5.0.tar.gz", hash = "sha256:c2adf4c536f9b74053e1161374398cdd78d28762062db9b741639b2133da0016"}, - {file = "fake_useragent-1.5.0-py3-none-any.whl", hash = "sha256:1ee651ebd17fa2442abe4393f00e311769051765cd20de23cc50dc771db89540"}, + {file = "fake-useragent-1.5.1.tar.gz", hash = "sha256:6387269f5a2196b5ba7ed8935852f75486845a1c95c50e72460e6a8e762f5c49"}, + {file = "fake_useragent-1.5.1-py3-none-any.whl", hash = "sha256:57415096557c8a4e23b62a375c21c55af5fd4ba30549227f562d2c4f5b60e3b3"}, ] [[package]] @@ -898,53 +947,53 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "fonttools" -version = "4.49.0" +version = "4.50.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.49.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d970ecca0aac90d399e458f0b7a8a597e08f95de021f17785fb68e2dc0b99717"}, - {file = "fonttools-4.49.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac9a745b7609f489faa65e1dc842168c18530874a5f5b742ac3dd79e26bca8bc"}, - {file = "fonttools-4.49.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ba0e00620ca28d4ca11fc700806fd69144b463aa3275e1b36e56c7c09915559"}, - {file = "fonttools-4.49.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdee3ab220283057e7840d5fb768ad4c2ebe65bdba6f75d5d7bf47f4e0ed7d29"}, - {file = "fonttools-4.49.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ce7033cb61f2bb65d8849658d3786188afd80f53dad8366a7232654804529532"}, - {file = "fonttools-4.49.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:07bc5ea02bb7bc3aa40a1eb0481ce20e8d9b9642a9536cde0218290dd6085828"}, - {file = "fonttools-4.49.0-cp310-cp310-win32.whl", hash = "sha256:86eef6aab7fd7c6c8545f3ebd00fd1d6729ca1f63b0cb4d621bccb7d1d1c852b"}, - {file = "fonttools-4.49.0-cp310-cp310-win_amd64.whl", hash = "sha256:1fac1b7eebfce75ea663e860e7c5b4a8831b858c17acd68263bc156125201abf"}, - {file = "fonttools-4.49.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:edc0cce355984bb3c1d1e89d6a661934d39586bb32191ebff98c600f8957c63e"}, - {file = "fonttools-4.49.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:83a0d9336de2cba86d886507dd6e0153df333ac787377325a39a2797ec529814"}, - {file = "fonttools-4.49.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36c8865bdb5cfeec88f5028e7e592370a0657b676c6f1d84a2108e0564f90e22"}, - {file = "fonttools-4.49.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33037d9e56e2562c710c8954d0f20d25b8386b397250d65581e544edc9d6b942"}, - {file = "fonttools-4.49.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8fb022d799b96df3eaa27263e9eea306bd3d437cc9aa981820850281a02b6c9a"}, - {file = "fonttools-4.49.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:33c584c0ef7dc54f5dd4f84082eabd8d09d1871a3d8ca2986b0c0c98165f8e86"}, - {file = "fonttools-4.49.0-cp311-cp311-win32.whl", hash = "sha256:cbe61b158deb09cffdd8540dc4a948d6e8f4d5b4f3bf5cd7db09bd6a61fee64e"}, - {file = "fonttools-4.49.0-cp311-cp311-win_amd64.whl", hash = "sha256:fc11e5114f3f978d0cea7e9853627935b30d451742eeb4239a81a677bdee6bf6"}, - {file = "fonttools-4.49.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d647a0e697e5daa98c87993726da8281c7233d9d4ffe410812a4896c7c57c075"}, - {file = "fonttools-4.49.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f3bbe672df03563d1f3a691ae531f2e31f84061724c319652039e5a70927167e"}, - {file = "fonttools-4.49.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bebd91041dda0d511b0d303180ed36e31f4f54b106b1259b69fade68413aa7ff"}, - {file = "fonttools-4.49.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4145f91531fd43c50f9eb893faa08399816bb0b13c425667c48475c9f3a2b9b5"}, - {file = "fonttools-4.49.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ea329dafb9670ffbdf4dbc3b0e5c264104abcd8441d56de77f06967f032943cb"}, - {file = "fonttools-4.49.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c076a9e548521ecc13d944b1d261ff3d7825048c338722a4bd126d22316087b7"}, - {file = "fonttools-4.49.0-cp312-cp312-win32.whl", hash = "sha256:b607ea1e96768d13be26d2b400d10d3ebd1456343eb5eaddd2f47d1c4bd00880"}, - {file = "fonttools-4.49.0-cp312-cp312-win_amd64.whl", hash = "sha256:a974c49a981e187381b9cc2c07c6b902d0079b88ff01aed34695ec5360767034"}, - {file = "fonttools-4.49.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b85ec0bdd7bdaa5c1946398cbb541e90a6dfc51df76dfa88e0aaa41b335940cb"}, - {file = "fonttools-4.49.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:af20acbe198a8a790618ee42db192eb128afcdcc4e96d99993aca0b60d1faeb4"}, - {file = "fonttools-4.49.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d418b1fee41a1d14931f7ab4b92dc0bc323b490e41d7a333eec82c9f1780c75"}, - {file = "fonttools-4.49.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b44a52b8e6244b6548851b03b2b377a9702b88ddc21dcaf56a15a0393d425cb9"}, - {file = "fonttools-4.49.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7c7125068e04a70739dad11857a4d47626f2b0bd54de39e8622e89701836eabd"}, - {file = "fonttools-4.49.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29e89d0e1a7f18bc30f197cfadcbef5a13d99806447c7e245f5667579a808036"}, - {file = "fonttools-4.49.0-cp38-cp38-win32.whl", hash = "sha256:9d95fa0d22bf4f12d2fb7b07a46070cdfc19ef5a7b1c98bc172bfab5bf0d6844"}, - {file = "fonttools-4.49.0-cp38-cp38-win_amd64.whl", hash = "sha256:768947008b4dc552d02772e5ebd49e71430a466e2373008ce905f953afea755a"}, - {file = "fonttools-4.49.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:08877e355d3dde1c11973bb58d4acad1981e6d1140711230a4bfb40b2b937ccc"}, - {file = "fonttools-4.49.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fdb54b076f25d6b0f0298dc706acee5052de20c83530fa165b60d1f2e9cbe3cb"}, - {file = "fonttools-4.49.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0af65c720520710cc01c293f9c70bd69684365c6015cc3671db2b7d807fe51f2"}, - {file = "fonttools-4.49.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f255ce8ed7556658f6d23f6afd22a6d9bbc3edb9b96c96682124dc487e1bf42"}, - {file = "fonttools-4.49.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d00af0884c0e65f60dfaf9340e26658836b935052fdd0439952ae42e44fdd2be"}, - {file = "fonttools-4.49.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:263832fae27481d48dfafcc43174644b6706639661e242902ceb30553557e16c"}, - {file = "fonttools-4.49.0-cp39-cp39-win32.whl", hash = "sha256:0404faea044577a01bb82d47a8fa4bc7a54067fa7e324785dd65d200d6dd1133"}, - {file = "fonttools-4.49.0-cp39-cp39-win_amd64.whl", hash = "sha256:b050d362df50fc6e38ae3954d8c29bf2da52be384649ee8245fdb5186b620836"}, - {file = "fonttools-4.49.0-py3-none-any.whl", hash = "sha256:af281525e5dd7fa0b39fb1667b8d5ca0e2a9079967e14c4bfe90fd1cd13e0f18"}, - {file = "fonttools-4.49.0.tar.gz", hash = "sha256:ebf46e7f01b7af7861310417d7c49591a85d99146fc23a5ba82fdb28af156321"}, + {file = "fonttools-4.50.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effd303fb422f8ce06543a36ca69148471144c534cc25f30e5be752bc4f46736"}, + {file = "fonttools-4.50.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7913992ab836f621d06aabac118fc258b9947a775a607e1a737eb3a91c360335"}, + {file = "fonttools-4.50.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e0a1c5bd2f63da4043b63888534b52c5a1fd7ae187c8ffc64cbb7ae475b9dab"}, + {file = "fonttools-4.50.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d40fc98540fa5360e7ecf2c56ddf3c6e7dd04929543618fd7b5cc76e66390562"}, + {file = "fonttools-4.50.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fff65fbb7afe137bac3113827855e0204482727bddd00a806034ab0d3951d0d"}, + {file = "fonttools-4.50.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1aeae3dd2ee719074a9372c89ad94f7c581903306d76befdaca2a559f802472"}, + {file = "fonttools-4.50.0-cp310-cp310-win32.whl", hash = "sha256:e9623afa319405da33b43c85cceb0585a6f5d3a1d7c604daf4f7e1dd55c03d1f"}, + {file = "fonttools-4.50.0-cp310-cp310-win_amd64.whl", hash = "sha256:778c5f43e7e654ef7fe0605e80894930bc3a7772e2f496238e57218610140f54"}, + {file = "fonttools-4.50.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3dfb102e7f63b78c832e4539969167ffcc0375b013080e6472350965a5fe8048"}, + {file = "fonttools-4.50.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e58fe34cb379ba3d01d5d319d67dd3ce7ca9a47ad044ea2b22635cd2d1247fc"}, + {file = "fonttools-4.50.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c673ab40d15a442a4e6eb09bf007c1dda47c84ac1e2eecbdf359adacb799c24"}, + {file = "fonttools-4.50.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b3ac35cdcd1a4c90c23a5200212c1bb74fa05833cc7c14291d7043a52ca2aaa"}, + {file = "fonttools-4.50.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8844e7a2c5f7ecf977e82eb6b3014f025c8b454e046d941ece05b768be5847ae"}, + {file = "fonttools-4.50.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f849bd3c5c2249b49c98eca5aaebb920d2bfd92b3c69e84ca9bddf133e9f83f0"}, + {file = "fonttools-4.50.0-cp311-cp311-win32.whl", hash = "sha256:39293ff231b36b035575e81c14626dfc14407a20de5262f9596c2cbb199c3625"}, + {file = "fonttools-4.50.0-cp311-cp311-win_amd64.whl", hash = "sha256:c33d5023523b44d3481624f840c8646656a1def7630ca562f222eb3ead16c438"}, + {file = "fonttools-4.50.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b4a886a6dbe60100ba1cd24de962f8cd18139bd32808da80de1fa9f9f27bf1dc"}, + {file = "fonttools-4.50.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b2ca1837bfbe5eafa11313dbc7edada79052709a1fffa10cea691210af4aa1fa"}, + {file = "fonttools-4.50.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0493dd97ac8977e48ffc1476b932b37c847cbb87fd68673dee5182004906828"}, + {file = "fonttools-4.50.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77844e2f1b0889120b6c222fc49b2b75c3d88b930615e98893b899b9352a27ea"}, + {file = "fonttools-4.50.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3566bfb8c55ed9100afe1ba6f0f12265cd63a1387b9661eb6031a1578a28bad1"}, + {file = "fonttools-4.50.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:35e10ddbc129cf61775d58a14f2d44121178d89874d32cae1eac722e687d9019"}, + {file = "fonttools-4.50.0-cp312-cp312-win32.whl", hash = "sha256:cc8140baf9fa8f9b903f2b393a6c413a220fa990264b215bf48484f3d0bf8710"}, + {file = "fonttools-4.50.0-cp312-cp312-win_amd64.whl", hash = "sha256:0ccc85fd96373ab73c59833b824d7a73846670a0cb1f3afbaee2b2c426a8f931"}, + {file = "fonttools-4.50.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e270a406219af37581d96c810172001ec536e29e5593aa40d4c01cca3e145aa6"}, + {file = "fonttools-4.50.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac2463de667233372e9e1c7e9de3d914b708437ef52a3199fdbf5a60184f190c"}, + {file = "fonttools-4.50.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47abd6669195abe87c22750dbcd366dc3a0648f1b7c93c2baa97429c4dc1506e"}, + {file = "fonttools-4.50.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:074841375e2e3d559aecc86e1224caf78e8b8417bb391e7d2506412538f21adc"}, + {file = "fonttools-4.50.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0743fd2191ad7ab43d78cd747215b12033ddee24fa1e088605a3efe80d6984de"}, + {file = "fonttools-4.50.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3d7080cce7be5ed65bee3496f09f79a82865a514863197ff4d4d177389e981b0"}, + {file = "fonttools-4.50.0-cp38-cp38-win32.whl", hash = "sha256:a467ba4e2eadc1d5cc1a11d355abb945f680473fbe30d15617e104c81f483045"}, + {file = "fonttools-4.50.0-cp38-cp38-win_amd64.whl", hash = "sha256:f77e048f805e00870659d6318fd89ef28ca4ee16a22b4c5e1905b735495fc422"}, + {file = "fonttools-4.50.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b6245eafd553c4e9a0708e93be51392bd2288c773523892fbd616d33fd2fda59"}, + {file = "fonttools-4.50.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a4062cc7e8de26f1603323ef3ae2171c9d29c8a9f5e067d555a2813cd5c7a7e0"}, + {file = "fonttools-4.50.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34692850dfd64ba06af61e5791a441f664cb7d21e7b544e8f385718430e8f8e4"}, + {file = "fonttools-4.50.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678dd95f26a67e02c50dcb5bf250f95231d455642afbc65a3b0bcdacd4e4dd38"}, + {file = "fonttools-4.50.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4f2ce7b0b295fe64ac0a85aef46a0f2614995774bd7bc643b85679c0283287f9"}, + {file = "fonttools-4.50.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d346f4dc2221bfb7ab652d1e37d327578434ce559baf7113b0f55768437fe6a0"}, + {file = "fonttools-4.50.0-cp39-cp39-win32.whl", hash = "sha256:a51eeaf52ba3afd70bf489be20e52fdfafe6c03d652b02477c6ce23c995222f4"}, + {file = "fonttools-4.50.0-cp39-cp39-win_amd64.whl", hash = "sha256:8639be40d583e5d9da67795aa3eeeda0488fb577a1d42ae11a5036f18fb16d93"}, + {file = "fonttools-4.50.0-py3-none-any.whl", hash = "sha256:48fa36da06247aa8282766cfd63efff1bb24e55f020f29a335939ed3844d20d3"}, + {file = "fonttools-4.50.0.tar.gz", hash = "sha256:fa5cf61058c7dbb104c2ac4e782bf1b2016a8cf2f69de6e4dd6a865d2c969bb5"}, ] [package.extras] @@ -963,13 +1012,13 @@ woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "fsspec" -version = "2024.2.0" +version = "2024.3.1" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.2.0-py3-none-any.whl", hash = "sha256:817f969556fa5916bc682e02ca2045f96ff7f586d45110fcb76022063ad2c7d8"}, - {file = "fsspec-2024.2.0.tar.gz", hash = "sha256:b6ad1a679f760dda52b1168c859d01b7b80648ea6f7f7c7f5a8a91dc3f3ecb84"}, + {file = "fsspec-2024.3.1-py3-none-any.whl", hash = "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512"}, + {file = "fsspec-2024.3.1.tar.gz", hash = "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9"}, ] [package.extras] @@ -1414,13 +1463,13 @@ six = "*" [[package]] name = "ixmp4" -version = "0.7.3" +version = "0.8.0" description = "a data warehouse for scenario analysis" optional = false python-versions = ">=3.10,<3.13" files = [ - {file = "ixmp4-0.7.3-py3-none-any.whl", hash = "sha256:4ef3123c7dd689faa8a68df61a02a3c95ca4af5cecc18a1b5bc996dfc9ad3653"}, - {file = "ixmp4-0.7.3.tar.gz", hash = "sha256:f5569cbecc139eca6a456f4cfb70faab6f71653cdd3d18d080d82f09b6778abd"}, + {file = "ixmp4-0.8.0-py3-none-any.whl", hash = "sha256:8d1bee6de071e5ca1b532f1eaf3a0ea0c9437b4af8f2cdc12b838c1cd0a6a28d"}, + {file = "ixmp4-0.8.0.tar.gz", hash = "sha256:702252e8da76b669e0236ecc7dfc86fa55642d27e30e9d17659a65267a179dfc"}, ] [package.dependencies] @@ -1552,13 +1601,13 @@ referencing = ">=0.31.0" [[package]] name = "jupyter-client" -version = "8.6.0" +version = "8.6.1" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, - {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"}, + {file = "jupyter_client-8.6.1-py3-none-any.whl", hash = "sha256:3b7bd22f058434e3b9a7ea4b1500ed47de2713872288c0d511d19926f99b459f"}, + {file = "jupyter_client-8.6.1.tar.gz", hash = "sha256:e842515e2bab8e19186d89fdfea7abd15e39dd581f94e399f00e2af5a1652d3f"}, ] [package.dependencies] @@ -1574,13 +1623,13 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt [[package]] name = "jupyter-core" -version = "5.7.1" +version = "5.7.2" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.7.1-py3-none-any.whl", hash = "sha256:c65c82126453a723a2804aa52409930434598fd9d35091d63dfb919d2b765bb7"}, - {file = "jupyter_core-5.7.1.tar.gz", hash = "sha256:de61a9d7fc71240f688b2fb5ab659fbb56979458dc66a71decd098e03c79e218"}, + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, ] [package.dependencies] @@ -1590,7 +1639,7 @@ traitlets = ">=5.3" [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] -test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] [[package]] name = "jupyterlab-pygments" @@ -1956,13 +2005,13 @@ files = [ [[package]] name = "multimethod" -version = "1.11.2" +version = "1.10" description = "Multiple argument dispatching." optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" files = [ - {file = "multimethod-1.11.2-py3-none-any.whl", hash = "sha256:cb338f09395c0ee87d36c7691cdd794d13d8864358082cf1205f812edd5ce05a"}, - {file = "multimethod-1.11.2.tar.gz", hash = "sha256:7f2a4863967142e6db68632fef9cd79053c09670ba0c5f113301e245140bba5c"}, + {file = "multimethod-1.10-py3-none-any.whl", hash = "sha256:afd84da9c3d0445c84f827e4d63ad42d17c6d29b122427c6dee9032ac2d2a0d4"}, + {file = "multimethod-1.10.tar.gz", hash = "sha256:daa45af3fe257f73abb69673fd54ddeaf31df0eb7363ad6e1251b7c9b192d8c5"}, ] [[package]] @@ -2025,13 +2074,13 @@ files = [ [[package]] name = "nbclient" -version = "0.9.0" +version = "0.10.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = false python-versions = ">=3.8.0" files = [ - {file = "nbclient-0.9.0-py3-none-any.whl", hash = "sha256:a3a1ddfb34d4a9d17fc744d655962714a866639acd30130e9be84191cd97cd15"}, - {file = "nbclient-0.9.0.tar.gz", hash = "sha256:4b28c207877cf33ef3a9838cdc7a54c5ceff981194a82eac59d558f05487295e"}, + {file = "nbclient-0.10.0-py3-none-any.whl", hash = "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f"}, + {file = "nbclient-0.10.0.tar.gz", hash = "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09"}, ] [package.dependencies] @@ -2043,7 +2092,7 @@ traitlets = ">=5.4" [package.extras] dev = ["pre-commit"] docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] -test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] [[package]] name = "nbconvert" @@ -2084,13 +2133,13 @@ webpdf = ["playwright"] [[package]] name = "nbformat" -version = "5.9.2" +version = "5.10.3" description = "The Jupyter Notebook format" optional = false python-versions = ">=3.8" files = [ - {file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"}, - {file = "nbformat-5.9.2.tar.gz", hash = "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192"}, + {file = "nbformat-5.10.3-py3-none-any.whl", hash = "sha256:d9476ca28676799af85385f409b49d95e199951477a159a576ef2a675151e5e8"}, + {file = "nbformat-5.10.3.tar.gz", hash = "sha256:60ed5e910ef7c6264b87d644f276b1b49e24011930deef54605188ddeb211685"}, ] [package.dependencies] @@ -2216,13 +2265,13 @@ et-xmlfile = "*" [[package]] name = "packaging" -version = "23.2" +version = "24.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] [[package]] @@ -2295,17 +2344,17 @@ xml = ["lxml (>=4.8.0)"] [[package]] name = "pandera" -version = "0.18.0" +version = "0.18.3" description = "A light-weight and flexible data validation and testing tool for statistical data objects." optional = false python-versions = ">=3.7" files = [ - {file = "pandera-0.18.0-py3-none-any.whl", hash = "sha256:fe2da835a16df5a7e49fbfb828f1eeaea9d6f4534f124630957e64fef53e7e73"}, - {file = "pandera-0.18.0.tar.gz", hash = "sha256:97ab33d884362c0bb99668a12be2855d15c1a71f4934c588a999947b47764bc1"}, + {file = "pandera-0.18.3-py3-none-any.whl", hash = "sha256:376faf746db57517f7fd85f234fa193e34266e7bcd1781e5c5912befbc180b98"}, + {file = "pandera-0.18.3.tar.gz", hash = "sha256:47dd2e10ed7d2a2bc9cfd154b76b8bcd065a9bf1413d00de902d31c7afeec014"}, ] [package.dependencies] -multimethod = "*" +multimethod = "<=1.10.0" numpy = ">=1.19.0" packaging = ">=20.0" pandas = ">=1.2.0" @@ -2315,7 +2364,7 @@ typing-inspect = ">=0.6.0" wrapt = "*" [package.extras] -all = ["black", "dask", "fastapi", "frictionless (<=4.40.8)", "geopandas", "hypothesis (>=5.41.1)", "modin", "pandas-stubs", "pyspark (>=3.2.0)", "pyyaml (>=5.1)", "ray", "scipy", "shapely"] +all = ["black", "dask", "fastapi", "frictionless (<=4.40.8)", "geopandas", "hypothesis (>=6.92.7)", "modin", "pandas-stubs", "pyspark (>=3.2.0)", "pyyaml (>=5.1)", "ray", "scipy", "shapely"] dask = ["dask"] fastapi = ["fastapi"] geopandas = ["geopandas", "shapely"] @@ -2326,7 +2375,7 @@ modin-dask = ["dask", "modin"] modin-ray = ["modin", "ray"] mypy = ["pandas-stubs"] pyspark = ["pyspark (>=3.2.0)"] -strategies = ["hypothesis (>=5.41.1)"] +strategies = ["hypothesis (>=6.92.7)"] [[package]] name = "pandocfilters" @@ -2514,13 +2563,13 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest- [[package]] name = "plotly" -version = "5.19.0" +version = "5.20.0" description = "An open-source, interactive data visualization library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "plotly-5.19.0-py3-none-any.whl", hash = "sha256:906abcc5f15945765328c5d47edaa884bc99f5985fbc61e8cd4dc361f4ff8f5a"}, - {file = "plotly-5.19.0.tar.gz", hash = "sha256:5ea91a56571292ade3e3bc9bf712eba0b95a1fb0a941375d978cc79432e055f4"}, + {file = "plotly-5.20.0-py3-none-any.whl", hash = "sha256:837a9c8aa90f2c0a2f0d747b82544d014dc2a2bdde967b5bb1da25b53932d1a9"}, + {file = "plotly-5.20.0.tar.gz", hash = "sha256:bf901c805d22032cfa534b2ff7c5aa6b0659e037f19ec1e0cca7f585918b5c89"}, ] [package.dependencies] @@ -2730,47 +2779,47 @@ tests = ["pytest"] [[package]] name = "pyarrow" -version = "15.0.1" +version = "15.0.2" description = "Python library for Apache Arrow" optional = false python-versions = ">=3.8" files = [ - {file = "pyarrow-15.0.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:c2ddb3be5ea938c329a84171694fc230b241ce1b6b0ff1a0280509af51c375fa"}, - {file = "pyarrow-15.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7543ea88a0ff72f8e6baaf9bfdbec2c62aeabdbede9e4a571c71cc3bc43b6302"}, - {file = "pyarrow-15.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1519e218a6941fc074e4501088d891afcb2adf77c236e03c34babcf3d6a0d1c7"}, - {file = "pyarrow-15.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28cafa86e1944761970d3b3fc0411b14ff9b5c2b73cd22aaf470d7a3976335f5"}, - {file = "pyarrow-15.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:be5c3d463e33d03eab496e1af7916b1d44001c08f0f458ad27dc16093a020638"}, - {file = "pyarrow-15.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:47b1eda15d3aa3f49a07b1808648e1397e5dc6a80a30bf87faa8e2d02dad7ac3"}, - {file = "pyarrow-15.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e524a31be7db22deebbbcf242b189063ab9a7652c62471d296b31bc6e3cae77b"}, - {file = "pyarrow-15.0.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:a476fefe8bdd56122fb0d4881b785413e025858803cc1302d0d788d3522b374d"}, - {file = "pyarrow-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:309e6191be385f2e220586bfdb643f9bb21d7e1bc6dd0a6963dc538e347b2431"}, - {file = "pyarrow-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83bc586903dbeb4365cbc72b602f99f70b96c5882e5dfac5278813c7d624ca3c"}, - {file = "pyarrow-15.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e652daac6d8b05280cd2af31c0fb61a4490ec6a53dc01588014d9fa3fdbee9"}, - {file = "pyarrow-15.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:abad2e08652df153a72177ce20c897d083b0c4ebeec051239e2654ddf4d3c996"}, - {file = "pyarrow-15.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cde663352bc83ad75ba7b3206e049ca1a69809223942362a8649e37bd22f9e3b"}, - {file = "pyarrow-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:1b6e237dd7a08482a8b8f3f6512d258d2460f182931832a8c6ef3953203d31e1"}, - {file = "pyarrow-15.0.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:7bd167536ee23192760b8c731d39b7cfd37914c27fd4582335ffd08450ff799d"}, - {file = "pyarrow-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7c08bb31eb2984ba5c3747d375bb522e7e536b8b25b149c9cb5e1c49b0ccb736"}, - {file = "pyarrow-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0f9c1d630ed2524bd1ddf28ec92780a7b599fd54704cd653519f7ff5aec177a"}, - {file = "pyarrow-15.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5186048493395220550bca7b524420471aac2d77af831f584ce132680f55c3df"}, - {file = "pyarrow-15.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:31dc30c7ec8958da3a3d9f31d6c3630429b2091ede0ecd0d989fd6bec129f0e4"}, - {file = "pyarrow-15.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3f111a014fb8ac2297b43a74bf4495cc479a332908f7ee49cb7cbd50714cb0c1"}, - {file = "pyarrow-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:a6d1f7c15d7f68f08490d0cb34611497c74285b8a6bbeab4ef3fc20117310983"}, - {file = "pyarrow-15.0.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:9ad931b996f51c2f978ed517b55cb3c6078272fb4ec579e3da5a8c14873b698d"}, - {file = "pyarrow-15.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:738f6b53ab1c2f66b2bde8a1d77e186aeaab702d849e0dfa1158c9e2c030add3"}, - {file = "pyarrow-15.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c1c3fc16bc74e33bf8f1e5a212938ed8d88e902f372c4dac6b5bad328567d2f"}, - {file = "pyarrow-15.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1fa92512128f6c1b8dde0468c1454dd70f3bff623970e370d52efd4d24fd0be"}, - {file = "pyarrow-15.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:b4157f307c202cbbdac147d9b07447a281fa8e63494f7fc85081da351ec6ace9"}, - {file = "pyarrow-15.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:b75e7da26f383787f80ad76143b44844ffa28648fcc7099a83df1538c078d2f2"}, - {file = "pyarrow-15.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:3a99eac76ae14096c209850935057b9e8ce97a78397c5cde8724674774f34e5d"}, - {file = "pyarrow-15.0.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:dd532d3177e031e9b2d2df19fd003d0cc0520d1747659fcabbd4d9bb87de508c"}, - {file = "pyarrow-15.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ce8c89848fd37e5313fc2ce601483038ee5566db96ba0808d5883b2e2e55dc53"}, - {file = "pyarrow-15.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:862eac5e5f3b6477f7a92b2f27e560e1f4e5e9edfca9ea9da8a7478bb4abd5ce"}, - {file = "pyarrow-15.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f0ea3a29cd5cb99bf14c1c4533eceaa00ea8fb580950fb5a89a5c771a994a4e"}, - {file = "pyarrow-15.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:bb902f780cfd624b2e8fd8501fadab17618fdb548532620ef3d91312aaf0888a"}, - {file = "pyarrow-15.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:4f87757f02735a6bb4ad2e1b98279ac45d53b748d5baf52401516413007c6999"}, - {file = "pyarrow-15.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:efd3816c7fbfcbd406ac0f69873cebb052effd7cdc153ae5836d1b00845845d7"}, - {file = "pyarrow-15.0.1.tar.gz", hash = "sha256:21d812548d39d490e0c6928a7c663f37b96bf764034123d4b4ab4530ecc757a9"}, + {file = "pyarrow-15.0.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:88b340f0a1d05b5ccc3d2d986279045655b1fe8e41aba6ca44ea28da0d1455d8"}, + {file = "pyarrow-15.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eaa8f96cecf32da508e6c7f69bb8401f03745c050c1dd42ec2596f2e98deecac"}, + {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23c6753ed4f6adb8461e7c383e418391b8d8453c5d67e17f416c3a5d5709afbd"}, + {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f639c059035011db8c0497e541a8a45d98a58dbe34dc8fadd0ef128f2cee46e5"}, + {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:290e36a59a0993e9a5224ed2fb3e53375770f07379a0ea03ee2fce2e6d30b423"}, + {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:06c2bb2a98bc792f040bef31ad3e9be6a63d0cb39189227c08a7d955db96816e"}, + {file = "pyarrow-15.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:f7a197f3670606a960ddc12adbe8075cea5f707ad7bf0dffa09637fdbb89f76c"}, + {file = "pyarrow-15.0.2-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:5f8bc839ea36b1f99984c78e06e7a06054693dc2af8920f6fb416b5bca9944e4"}, + {file = "pyarrow-15.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f5e81dfb4e519baa6b4c80410421528c214427e77ca0ea9461eb4097c328fa33"}, + {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a4f240852b302a7af4646c8bfe9950c4691a419847001178662a98915fd7ee7"}, + {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e7d9cfb5a1e648e172428c7a42b744610956f3b70f524aa3a6c02a448ba853e"}, + {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2d4f905209de70c0eb5b2de6763104d5a9a37430f137678edfb9a675bac9cd98"}, + {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:90adb99e8ce5f36fbecbbc422e7dcbcbed07d985eed6062e459e23f9e71fd197"}, + {file = "pyarrow-15.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:b116e7fd7889294cbd24eb90cd9bdd3850be3738d61297855a71ac3b8124ee38"}, + {file = "pyarrow-15.0.2-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:25335e6f1f07fdaa026a61c758ee7d19ce824a866b27bba744348fa73bb5a440"}, + {file = "pyarrow-15.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:90f19e976d9c3d8e73c80be84ddbe2f830b6304e4c576349d9360e335cd627fc"}, + {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a22366249bf5fd40ddacc4f03cd3160f2d7c247692945afb1899bab8a140ddfb"}, + {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2a335198f886b07e4b5ea16d08ee06557e07db54a8400cc0d03c7f6a22f785f"}, + {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e6d459c0c22f0b9c810a3917a1de3ee704b021a5fb8b3bacf968eece6df098f"}, + {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:033b7cad32198754d93465dcfb71d0ba7cb7cd5c9afd7052cab7214676eec38b"}, + {file = "pyarrow-15.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:29850d050379d6e8b5a693098f4de7fd6a2bea4365bfd073d7c57c57b95041ee"}, + {file = "pyarrow-15.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:7167107d7fb6dcadb375b4b691b7e316f4368f39f6f45405a05535d7ad5e5058"}, + {file = "pyarrow-15.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e85241b44cc3d365ef950432a1b3bd44ac54626f37b2e3a0cc89c20e45dfd8bf"}, + {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:248723e4ed3255fcd73edcecc209744d58a9ca852e4cf3d2577811b6d4b59818"}, + {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ff3bdfe6f1b81ca5b73b70a8d482d37a766433823e0c21e22d1d7dde76ca33f"}, + {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:f3d77463dee7e9f284ef42d341689b459a63ff2e75cee2b9302058d0d98fe142"}, + {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:8c1faf2482fb89766e79745670cbca04e7018497d85be9242d5350cba21357e1"}, + {file = "pyarrow-15.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:28f3016958a8e45a1069303a4a4f6a7d4910643fc08adb1e2e4a7ff056272ad3"}, + {file = "pyarrow-15.0.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:89722cb64286ab3d4daf168386f6968c126057b8c7ec3ef96302e81d8cdb8ae4"}, + {file = "pyarrow-15.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cd0ba387705044b3ac77b1b317165c0498299b08261d8122c96051024f953cd5"}, + {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad2459bf1f22b6a5cdcc27ebfd99307d5526b62d217b984b9f5c974651398832"}, + {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58922e4bfece8b02abf7159f1f53a8f4d9f8e08f2d988109126c17c3bb261f22"}, + {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:adccc81d3dc0478ea0b498807b39a8d41628fa9210729b2f718b78cb997c7c91"}, + {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:8bd2baa5fe531571847983f36a30ddbf65261ef23e496862ece83bdceb70420d"}, + {file = "pyarrow-15.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6669799a1d4ca9da9c7e06ef48368320f5856f36f9a4dd31a11839dda3f6cc8c"}, + {file = "pyarrow-15.0.2.tar.gz", hash = "sha256:9c9bc803cb3b7bfacc1e96ffbfd923601065d9d3f911179d81e72d99fd74a3d9"}, ] [package.dependencies] @@ -2789,13 +2838,13 @@ files = [ [[package]] name = "pydantic" -version = "2.6.3" +version = "2.6.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.6.3-py3-none-any.whl", hash = "sha256:72c6034df47f46ccdf81869fddb81aade68056003900a8724a4f160700016a2a"}, - {file = "pydantic-2.6.3.tar.gz", hash = "sha256:e07805c4c7f5c6826e33a1d4c9d47950d7eaf34868e2690f8594d2e30241f11f"}, + {file = "pydantic-2.6.4-py3-none-any.whl", hash = "sha256:cc46fce86607580867bdc3361ad462bab9c222ef042d3da86f2fb333e1d916c5"}, + {file = "pydantic-2.6.4.tar.gz", hash = "sha256:b1704e0847db01817624a6b86766967f552dd9dbf3afba4004409f908dcc84e6"}, ] [package.dependencies] @@ -2975,13 +3024,13 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "8.0.2" +version = "8.1.1" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.0.2-py3-none-any.whl", hash = "sha256:edfaaef32ce5172d5466b5127b42e0d6d35ebbe4453f0e3505d96afd93f6b096"}, - {file = "pytest-8.0.2.tar.gz", hash = "sha256:d4051d623a2e0b7e51960ba963193b09ce6daeb9759a451844a21e4ddedfc1bd"}, + {file = "pytest-8.1.1-py3-none-any.whl", hash = "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7"}, + {file = "pytest-8.1.1.tar.gz", hash = "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044"}, ] [package.dependencies] @@ -2989,11 +3038,11 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=1.3.0,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +pluggy = ">=1.4,<2.0" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-cov" @@ -3263,13 +3312,13 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "referencing" -version = "0.33.0" +version = "0.34.0" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.33.0-py3-none-any.whl", hash = "sha256:39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5"}, - {file = "referencing-0.33.0.tar.gz", hash = "sha256:c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7"}, + {file = "referencing-0.34.0-py3-none-any.whl", hash = "sha256:d53ae300ceddd3169f1ffa9caf2cb7b769e92657e4fafb23d34b93679116dfd4"}, + {file = "referencing-0.34.0.tar.gz", hash = "sha256:5773bd84ef41799a5a8ca72dc34590c041eb01bf9aa02632b4a973fb0181a844"}, ] [package.dependencies] @@ -3541,39 +3590,39 @@ files = [ [[package]] name = "ruff" -version = "0.3.2" +version = "0.3.3" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.3.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:77f2612752e25f730da7421ca5e3147b213dca4f9a0f7e0b534e9562c5441f01"}, - {file = "ruff-0.3.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9966b964b2dd1107797be9ca7195002b874424d1d5472097701ae8f43eadef5d"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b83d17ff166aa0659d1e1deaf9f2f14cbe387293a906de09bc4860717eb2e2da"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb875c6cc87b3703aeda85f01c9aebdce3d217aeaca3c2e52e38077383f7268a"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be75e468a6a86426430373d81c041b7605137a28f7014a72d2fc749e47f572aa"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:967978ac2d4506255e2f52afe70dda023fc602b283e97685c8447d036863a302"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1231eacd4510f73222940727ac927bc5d07667a86b0cbe822024dd00343e77e9"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c6d613b19e9a8021be2ee1d0e27710208d1603b56f47203d0abbde906929a9b"}, - {file = "ruff-0.3.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8439338a6303585d27b66b4626cbde89bb3e50fa3cae86ce52c1db7449330a7"}, - {file = "ruff-0.3.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:de8b480d8379620cbb5ea466a9e53bb467d2fb07c7eca54a4aa8576483c35d36"}, - {file = "ruff-0.3.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b74c3de9103bd35df2bb05d8b2899bf2dbe4efda6474ea9681280648ec4d237d"}, - {file = "ruff-0.3.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f380be9fc15a99765c9cf316b40b9da1f6ad2ab9639e551703e581a5e6da6745"}, - {file = "ruff-0.3.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0ac06a3759c3ab9ef86bbeca665d31ad3aa9a4b1c17684aadb7e61c10baa0df4"}, - {file = "ruff-0.3.2-py3-none-win32.whl", hash = "sha256:9bd640a8f7dd07a0b6901fcebccedadeb1a705a50350fb86b4003b805c81385a"}, - {file = "ruff-0.3.2-py3-none-win_amd64.whl", hash = "sha256:0c1bdd9920cab5707c26c8b3bf33a064a4ca7842d91a99ec0634fec68f9f4037"}, - {file = "ruff-0.3.2-py3-none-win_arm64.whl", hash = "sha256:5f65103b1d76e0d600cabd577b04179ff592064eaa451a70a81085930e907d0b"}, - {file = "ruff-0.3.2.tar.gz", hash = "sha256:fa78ec9418eb1ca3db392811df3376b46471ae93792a81af2d1cbb0e5dcb5142"}, + {file = "ruff-0.3.3-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:973a0e388b7bc2e9148c7f9be8b8c6ae7471b9be37e1cc732f8f44a6f6d7720d"}, + {file = "ruff-0.3.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:cfa60d23269d6e2031129b053fdb4e5a7b0637fc6c9c0586737b962b2f834493"}, + {file = "ruff-0.3.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1eca7ff7a47043cf6ce5c7f45f603b09121a7cc047447744b029d1b719278eb5"}, + {file = "ruff-0.3.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7d3f6762217c1da954de24b4a1a70515630d29f71e268ec5000afe81377642d"}, + {file = "ruff-0.3.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b24c19e8598916d9c6f5a5437671f55ee93c212a2c4c569605dc3842b6820386"}, + {file = "ruff-0.3.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5a6cbf216b69c7090f0fe4669501a27326c34e119068c1494f35aaf4cc683778"}, + {file = "ruff-0.3.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352e95ead6964974b234e16ba8a66dad102ec7bf8ac064a23f95371d8b198aab"}, + {file = "ruff-0.3.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d6ab88c81c4040a817aa432484e838aaddf8bfd7ca70e4e615482757acb64f8"}, + {file = "ruff-0.3.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79bca3a03a759cc773fca69e0bdeac8abd1c13c31b798d5bb3c9da4a03144a9f"}, + {file = "ruff-0.3.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2700a804d5336bcffe063fd789ca2c7b02b552d2e323a336700abb8ae9e6a3f8"}, + {file = "ruff-0.3.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:fd66469f1a18fdb9d32e22b79f486223052ddf057dc56dea0caaf1a47bdfaf4e"}, + {file = "ruff-0.3.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:45817af234605525cdf6317005923bf532514e1ea3d9270acf61ca2440691376"}, + {file = "ruff-0.3.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0da458989ce0159555ef224d5b7c24d3d2e4bf4c300b85467b08c3261c6bc6a8"}, + {file = "ruff-0.3.3-py3-none-win32.whl", hash = "sha256:f2831ec6a580a97f1ea82ea1eda0401c3cdf512cf2045fa3c85e8ef109e87de0"}, + {file = "ruff-0.3.3-py3-none-win_amd64.whl", hash = "sha256:be90bcae57c24d9f9d023b12d627e958eb55f595428bafcb7fec0791ad25ddfc"}, + {file = "ruff-0.3.3-py3-none-win_arm64.whl", hash = "sha256:0171aab5fecdc54383993389710a3d1227f2da124d76a2784a7098e818f92d61"}, + {file = "ruff-0.3.3.tar.gz", hash = "sha256:38671be06f57a2f8aba957d9f701ea889aa5736be806f18c0cd03d6ff0cbca8d"}, ] [[package]] name = "s3transfer" -version = "0.10.0" +version = "0.10.1" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">= 3.8" files = [ - {file = "s3transfer-0.10.0-py3-none-any.whl", hash = "sha256:3cdb40f5cfa6966e812209d0994f2a4709b561c88e90cf00c2696d2df4e56b2e"}, - {file = "s3transfer-0.10.0.tar.gz", hash = "sha256:d0c8bbf672d5eebbe4e57945e23b972d963f07d82f661cabf678a5c88831595b"}, + {file = "s3transfer-0.10.1-py3-none-any.whl", hash = "sha256:ceb252b11bcf87080fb7850a224fb6e05c8a776bab8f2b64b7f25b969464839d"}, + {file = "s3transfer-0.10.1.tar.gz", hash = "sha256:5683916b4c724f799e600f41dd9e10a9ff19871bf87623cc8f491cb4f5fa0a19"}, ] [package.dependencies] @@ -4006,25 +4055,25 @@ full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7 [[package]] name = "tableschema" -version = "1.20.2" +version = "1.20.9" description = "A utility library for working with Table Schema in Python" optional = false python-versions = "*" files = [ - {file = "tableschema-1.20.2-py2.py3-none-any.whl", hash = "sha256:676948747ec8964c6e27e12ce45e203201191bb7e81a26f2eb09a1fdbe130d5c"}, - {file = "tableschema-1.20.2.tar.gz", hash = "sha256:cfa3b0aa1c0941002384c6288794f9488cb5ea9188cf84ac700d17758cb036e7"}, + {file = "tableschema-1.20.9-py2.py3-none-any.whl", hash = "sha256:1b75e0906a193b5097fca655841dc1dfe51f7e7f8785ce34ba865423842bea1b"}, + {file = "tableschema-1.20.9.tar.gz", hash = "sha256:765c3d90decfe9d19bad567cf76f0681badee95690f2ef7dd6320749f2eeffbb"}, ] [package.dependencies] cached-property = ">=1.5" click = ">=3.3" +dataflows-tabulator = ">=1.54.1" isodate = ">=0.5.4" jsonschema = ">=2.5" python-dateutil = ">=2.4" requests = ">=2.5" rfc3986 = ">=1.1.0" six = ">=1.9" -tabulator = ">=1.51.3" unicodecsv = ">=0.14" [package.extras] @@ -4044,38 +4093,6 @@ files = [ [package.extras] widechars = ["wcwidth"] -[[package]] -name = "tabulator" -version = "1.53.5" -description = "Consistent interface for stream reading and writing tabular data (csv/xls/json/etc)" -optional = false -python-versions = "*" -files = [ - {file = "tabulator-1.53.5-py2.py3-none-any.whl", hash = "sha256:6de83026f9dc8ac34dbc9e60cced1785ed2f4022ae0250eeaa59e92b5090f477"}, - {file = "tabulator-1.53.5.tar.gz", hash = "sha256:0e2887d0b36483a292e75b118d7f03e710c1337435553b5f62d2a7a891b7fe55"}, -] - -[package.dependencies] -boto3 = ">=1.9" -chardet = ">=3.0" -click = ">=6.0" -ijson = ">=3.0.3" -jsonlines = ">=1.1" -linear-tsv = ">=1.0" -openpyxl = ">=2.6" -requests = ">=2.8" -six = ">=1.9" -sqlalchemy = ">=0.9.6" -unicodecsv = ">=0.14" -xlrd = ">=1.0" - -[package.extras] -cchardet = ["cchardet (>=2.0)"] -datapackage = ["datapackage (>=1.12)"] -develop = ["mock", "moto[server]", "pylama", "pytest", "pytest-cov"] -html = ["pyquery (<1.4.2)"] -ods = ["ezodf (>=0.3)", "lxml (>=3.0)"] - [[package]] name = "tenacity" version = "8.2.3" @@ -4163,18 +4180,18 @@ files = [ [[package]] name = "traitlets" -version = "5.14.1" +version = "5.14.2" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.14.1-py3-none-any.whl", hash = "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74"}, - {file = "traitlets-5.14.1.tar.gz", hash = "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e"}, + {file = "traitlets-5.14.2-py3-none-any.whl", hash = "sha256:fcdf85684a772ddeba87db2f398ce00b40ff550d1528c03c14dbf6a02003cd80"}, + {file = "traitlets-5.14.2.tar.gz", hash = "sha256:8cdd83c040dab7d1dee822678e5f5d100b514f7b72b01615b26fc5718916fdf9"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.1)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "treelib" @@ -4318,18 +4335,18 @@ files = [ [[package]] name = "urllib3" -version = "2.0.7" +version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, - {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -4502,20 +4519,20 @@ files = [ [[package]] name = "zipp" -version = "3.17.0" +version = "3.18.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, + {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, + {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] lock-version = "2.0" python-versions = ">=3.10, <3.13" -content-hash = "052ef0a9fc5e9ac1dfd92402e17637d155c00cf635810355628ae51a68cd434d" +content-hash = "0ece28e1477091a7b335ac83f2a2269fee2c038ed518d89cc28fb72aad2a4639" From b2d8dd4fb6423395e7a55e1c62742fe7ae85349d Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Wed, 20 Mar 2024 08:17:42 +0100 Subject: [PATCH 07/15] Refactor to ixmp4 v0.8.0 filter signature --- pyam/ixmp4.py | 16 +++++++++------- tests/test_ixmp4.py | 6 +++++- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/pyam/ixmp4.py b/pyam/ixmp4.py index f37afd4d7..392b86fe9 100644 --- a/pyam/ixmp4.py +++ b/pyam/ixmp4.py @@ -36,8 +36,12 @@ def read_ixmp4( if not isinstance(platform, ixmp4.Platform): platform = ixmp4.Platform(platform) - run_filters = _make_dict(run=dict(default_only=default_only)) + # TODO This may have to be revised, see https://github.com/iiasa/ixmp4/issues/72 + meta_filters = _make_dict( + run=dict(default_only=default_only, model=model, scenario=scenario) + ) iamc_filters = _make_dict( + run=dict(default_only=default_only), model=model, scenario=scenario, region=region, @@ -45,22 +49,20 @@ def read_ixmp4( unit=unit, year=year, ) - - data = platform.iamc.tabulate(**run_filters, **iamc_filters) - # TODO filter by model/scenario depends on https://github.com/iiasa/ixmp4/pull/66 - meta = platform.meta.tabulate(**run_filters) + data = platform.iamc.tabulate(**iamc_filters) + meta = platform.meta.tabulate(**meta_filters) # if default-only, simplify to standard IAMC index, add `version` as meta indicator if default_only: index = ["model", "scenario"] - data.drop(columns="version", inplace=True) meta_version = ( - meta[["model", "scenario", "version"]] + data[index + ["version"]] .drop_duplicates() .rename(columns={"version": "value"}) ) meta_version["key"] = "version" meta = pd.concat([meta.drop(columns="version"), meta_version]) + data.drop(columns="version", inplace=True) else: index = ["model", "scenario", "version"] diff --git a/tests/test_ixmp4.py b/tests/test_ixmp4.py index ad705e02b..84e2bb21c 100644 --- a/tests/test_ixmp4.py +++ b/tests/test_ixmp4.py @@ -88,11 +88,15 @@ def test_ixmp4_reserved_columns(test_platform, test_df_year, drop_meta): if drop_meta: test_df_year = pyam.IamDataFrame(test_df_year.data) - # test writing to platform with a version-number as meta indicator + # write to platform with a version-number as meta indicator test_df_year.set_meta(1, "version") # add version number added from ixmp4 test_df_year.to_ixmp4(platform=test_platform) + # version is not saved to the platform if drop_meta: assert len(test_platform.runs.get("model_a", "scen_a").meta) == 0 else: assert "version" not in test_platform.runs.get("model_a", "scen_a").meta + + # version is included when reading again from the platform + assert_iamframe_equal(test_df_year, pyam.read_ixmp4(test_platform)) From 6c5e8ef685985a08d459c7e0f8113207660076ff Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Wed, 20 Mar 2024 08:18:09 +0100 Subject: [PATCH 08/15] Connect `read_iiasa()` to ixmp4 platforms --- pyam/iiasa.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pyam/iiasa.py b/pyam/iiasa.py index e05178d42..0c3271c4a 100644 --- a/pyam/iiasa.py +++ b/pyam/iiasa.py @@ -18,6 +18,7 @@ from requests.auth import AuthBase from pyam.core import IamDataFrame +from pyam.ixmp4 import read_ixmp4 from pyam.logging import deprecation_warning from pyam.str import is_str from pyam.utils import ( @@ -614,6 +615,10 @@ def read_iiasa( kwargs Arguments for :meth:`pyam.iiasa.Connection.query` """ + ixmp4_platforms = [i.name for i in ixmp4.conf.settings.manager.list_platforms()] + if name in ixmp4_platforms: + return read_ixmp4(name, default_only=default_only, **kwargs) + return Connection(name, creds, base_url).query( default_only=default_only, meta=meta, **kwargs ) From 8bb7086a7a8f9c50e3e11f69d8461e2f7cd97be4 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Wed, 20 Mar 2024 09:14:40 +0100 Subject: [PATCH 09/15] Update the docs --- docs/api/database.rst | 16 +++++++++--- docs/api/iiasa.rst | 4 +-- pyam/iiasa.py | 59 +++++++++++++++++++++++++++---------------- 3 files changed, 51 insertions(+), 28 deletions(-) diff --git a/docs/api/database.rst b/docs/api/database.rst index a107dc69f..a0c377b13 100644 --- a/docs/api/database.rst +++ b/docs/api/database.rst @@ -3,15 +3,15 @@ Data resources integration ========================== -Connecting to an IIASA Scenario Explorer instance -------------------------------------------------- +Connecting to an IIASA database instance +---------------------------------------- IIASA's ixmp Scenario Explorer infrastructure implements a RestAPI to directly query the database server connected to an explorer instance. -See https://software.ece.iiasa.ac.at/ixmp-server for more information. +See https://docs.ece.iiasa.ac.at/ for more information. The |pyam| package uses this interface to read timeseries data as well as -categorization and quantitative indicators. +categorization and quantitative meta indicators. The data is returned as an :class:`IamDataFrame`. See `this tutorial <../tutorials/iiasa.html>`_ for more information. @@ -19,6 +19,14 @@ See `this tutorial <../tutorials/iiasa.html>`_ for more information. .. autofunction:: lazy_read_iiasa +Reading from an |ixmp4| platform +-------------------------------- + +The |pyam| package provides a simple interface to read timeseries data and meta +indicators from local or remote |ixmp4| platform instancs. + +.. autofunction:: read_ixmp4 + Reading UNFCCC inventory data ----------------------------- diff --git a/docs/api/iiasa.rst b/docs/api/iiasa.rst index 1c63692ff..63eedba7d 100644 --- a/docs/api/iiasa.rst +++ b/docs/api/iiasa.rst @@ -39,9 +39,9 @@ You will be prompted to enter your password. ------------------------- The *Scenario Apps* use the |ixmp4| package as a database backend. -You can list all available ixmp4 platforms hosted by IIASA using the following: +You can list all available ixmp4 platforms hosted by IIASA using the following function: -.. autofunctions:: platforms +.. autofunction:: platforms *Scenario Explorer* instances (legacy service) ---------------------------------------------- diff --git a/pyam/iiasa.py b/pyam/iiasa.py index 0c3271c4a..16195a5e6 100644 --- a/pyam/iiasa.py +++ b/pyam/iiasa.py @@ -156,8 +156,8 @@ class Connection(object): Notes ----- - Credentials (username & password) are not required to access any public - Scenario Explorer instances (i.e., with Guest login). + Credentials (username & password) are not required to access any public |ixmp4| + or Scenario Explorer database (i.e., with Guest login). """ def __init__(self, name=None, creds=None, auth_url=_AUTH_URL): @@ -590,14 +590,16 @@ def _new_default_api(kwargs): def read_iiasa( name, default_only=True, meta=True, creds=None, base_url=_AUTH_URL, **kwargs ): - """Query an IIASA Scenario Explorer database API and return as IamDataFrame + """Read data from an |ixmp4| platform or an IIASA Scenario Explorer database. Parameters ---------- name : str - | Name of an IIASA Scenario Explorer database instance. + | Name of an |ixmp4| platform or an IIASA Scenario Explorer database instance. + | Use :attr:`platforms ` for a list of |ixmp4| platforms + hosted by IIASA. | Use :attr:`valid_connections ` - for a list of available instances. + for a list of available Scenario Explorer database instances. default_only : bool, optional If `True`, return *only* the default version of a model/scenario. If `False`, return all versions. @@ -605,18 +607,23 @@ def read_iiasa( If `True`, include all meta categories & quantitative indicators (or subset if list is given). creds : str or :class:`pathlib.Path`, optional - | Credentials (username & password) are not required to access - any public Scenario Explorer instances (i.e., with Guest login). - | See :class:`pyam.iiasa.Connection` for details. - | Use :meth:`pyam.iiasa.set_config` to set credentials - for accessing private/restricted Scenario Explorer instances. + Path to a file with authentication credentials. This feature is deprecated, + please run ``ixmp4 login `` in a console instead. base_url : str - Authentication server URL - kwargs - Arguments for :meth:`pyam.iiasa.Connection.query` + Authentication server URL. + **kwargs + Arguments for :meth:`pyam.read_ixmp4` or :meth:`pyam.iiasa.Connection.query`. + + Notes + ----- + Credentials (username & password) are not required to access any public |ixmp4| + or Scenario Explorer database (i.e., with Guest login). """ - ixmp4_platforms = [i.name for i in ixmp4.conf.settings.manager.list_platforms()] - if name in ixmp4_platforms: + if name in [i.name for i in ixmp4.conf.settings.manager.list_platforms()]: + if meta is not True: + raise NotImplementedError( + "Reading from ixmp4 platforms requires `meta=True`" + ) return read_ixmp4(name, default_only=default_only, **kwargs) return Connection(name, creds, base_url).query( @@ -628,7 +635,7 @@ def lazy_read_iiasa( file, name, default_only=True, meta=True, creds=None, base_url=_AUTH_URL, **kwargs ): """ - Try to load data from a local cache, failing that, loads it from the internet. + Try to load data from a local cache, failing that, loads it from an IIASA database. Check if the file in a given location is an up-to-date version of an IIASA database. If so, load it. If not, load data from the IIASA scenario explorer @@ -653,16 +660,24 @@ def lazy_read_iiasa( If `True`, include all meta categories & quantitative indicators (or subset if list is given). creds : str or :class:`pathlib.Path`, optional - | Credentials (username & password) are not required to access - any public Scenario Explorer instances (i.e., with Guest login). - | See :class:`pyam.iiasa.Connection` for details. - | Use :meth:`pyam.iiasa.set_config` to set credentials - for accessing private/restricted Scenario Explorer instances. + Path to a file with authentication credentials. This feature is deprecated, + please run ``ixmp4 login `` in a console instead. base_url : str Authentication server URL kwargs - Arguments for :meth:`pyam.iiasa.Connection.query` + Arguments for :meth:`pyam.read_ixmp4` or :meth:`pyam.iiasa.Connection.query`. + + Notes + ----- + This feature does currently not support reading data from |ixmp4| platforms. + + Credentials (username & password) are not required to access any public |ixmp4| + or Scenario Explorer database (i.e., with Guest login). """ + if name in [i.name for i in ixmp4.conf.settings.manager.list_platforms()]: + raise NotImplementedError( + "The function `lazy_read_iiasa()` does not support ixmp4 platforms." + ) file = Path(file) assert file.suffix in [ From 3771382403947b0cd4b55f13013d37b31bcd9c11 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Thu, 21 Mar 2024 09:02:16 +0100 Subject: [PATCH 10/15] Apply suggestions from code review by @phackstock Co-authored-by: Philip Hackstock <20710924+phackstock@users.noreply.github.com> --- pyam/iiasa.py | 6 +++--- tests/test_ixmp4.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pyam/iiasa.py b/pyam/iiasa.py index 16195a5e6..0ff3de909 100644 --- a/pyam/iiasa.py +++ b/pyam/iiasa.py @@ -156,8 +156,8 @@ class Connection(object): Notes ----- - Credentials (username & password) are not required to access any public |ixmp4| - or Scenario Explorer database (i.e., with Guest login). + Credentials (username & password) are not required to access public |ixmp4| + or Scenario Explorer databases (i.e., with Guest login). """ def __init__(self, name=None, creds=None, auth_url=_AUTH_URL): @@ -674,7 +674,7 @@ def lazy_read_iiasa( Credentials (username & password) are not required to access any public |ixmp4| or Scenario Explorer database (i.e., with Guest login). """ - if name in [i.name for i in ixmp4.conf.settings.manager.list_platforms()]: + if name in [platform.name for platform in ixmp4.conf.settings.manager.list_platforms()]: raise NotImplementedError( "The function `lazy_read_iiasa()` does not support ixmp4 platforms." ) diff --git a/tests/test_ixmp4.py b/tests/test_ixmp4.py index 84e2bb21c..bb375d169 100644 --- a/tests/test_ixmp4.py +++ b/tests/test_ixmp4.py @@ -71,7 +71,7 @@ def test_ixmp4_filters(test_platform, test_df_year, filters): # test writing to platform test_df_year.to_ixmp4(platform=test_platform) - # add 'version' meta indicator (indicator during imp4 roundtrip) + # add 'version' meta indicator (indicator during ixmp4 roundtrip) test_df_year.set_meta(1, "version") # read with filters From befe9de1aefe7c835495c5c3caa5300537dc0258 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Thu, 21 Mar 2024 09:11:21 +0100 Subject: [PATCH 11/15] Make ruff --- pyam/iiasa.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pyam/iiasa.py b/pyam/iiasa.py index 0ff3de909..2234a713d 100644 --- a/pyam/iiasa.py +++ b/pyam/iiasa.py @@ -674,7 +674,9 @@ def lazy_read_iiasa( Credentials (username & password) are not required to access any public |ixmp4| or Scenario Explorer database (i.e., with Guest login). """ - if name in [platform.name for platform in ixmp4.conf.settings.manager.list_platforms()]: + if name in [ + platform.name for platform in ixmp4.conf.settings.manager.list_platforms() + ]: raise NotImplementedError( "The function `lazy_read_iiasa()` does not support ixmp4 platforms." ) From 012aa6b8113280ac4ee12a04bde4fbcf2b888050 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Thu, 21 Mar 2024 09:12:52 +0100 Subject: [PATCH 12/15] Remove `_make_dict()` per suggestion by @phackstock --- pyam/ixmp4.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/pyam/ixmp4.py b/pyam/ixmp4.py index 392b86fe9..fdebd6e24 100644 --- a/pyam/ixmp4.py +++ b/pyam/ixmp4.py @@ -37,10 +37,10 @@ def read_ixmp4( platform = ixmp4.Platform(platform) # TODO This may have to be revised, see https://github.com/iiasa/ixmp4/issues/72 - meta_filters = _make_dict( + meta_filters = dict( run=dict(default_only=default_only, model=model, scenario=scenario) ) - iamc_filters = _make_dict( + iamc_filters = dict( run=dict(default_only=default_only), model=model, scenario=scenario, @@ -69,14 +69,6 @@ def read_ixmp4( return IamDataFrame(data, meta=meta, index=index) -def _make_dict(**kwargs): - _dict = dict() - for key, value in kwargs.items(): - if value is not None: - _dict[key] = value - return _dict - - def write_to_ixmp4(platform: ixmp4.Platform | str, df): """Save all scenarios as new default runs in an ixmp4 platform database instance From 5b012e22faaccbddc221e864e045b5f7f6cb3282 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Thu, 21 Mar 2024 09:17:39 +0100 Subject: [PATCH 13/15] Remove `base_url` as named argument in `read_iiasa()` --- pyam/iiasa.py | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/pyam/iiasa.py b/pyam/iiasa.py index 2234a713d..5b4e7313f 100644 --- a/pyam/iiasa.py +++ b/pyam/iiasa.py @@ -54,7 +54,7 @@ def platforms() -> None: tabulate_manager_platforms(ixmp4.conf.settings.manager.list_platforms()) -def set_config(user, password, file=None): +def set_config(*args, **kwargs): raise DeprecationWarning(f"This method is deprecated. {IXMP4_LOGIN}.") @@ -587,9 +587,7 @@ def _new_default_api(kwargs): ) -def read_iiasa( - name, default_only=True, meta=True, creds=None, base_url=_AUTH_URL, **kwargs -): +def read_iiasa(name, default_only=True, meta=True, creds=None, **kwargs): """Read data from an |ixmp4| platform or an IIASA Scenario Explorer database. Parameters @@ -609,8 +607,6 @@ def read_iiasa( creds : str or :class:`pathlib.Path`, optional Path to a file with authentication credentials. This feature is deprecated, please run ``ixmp4 login `` in a console instead. - base_url : str - Authentication server URL. **kwargs Arguments for :meth:`pyam.read_ixmp4` or :meth:`pyam.iiasa.Connection.query`. @@ -626,13 +622,13 @@ def read_iiasa( ) return read_ixmp4(name, default_only=default_only, **kwargs) - return Connection(name, creds, base_url).query( + return Connection(name, creds).query( default_only=default_only, meta=meta, **kwargs ) def lazy_read_iiasa( - file, name, default_only=True, meta=True, creds=None, base_url=_AUTH_URL, **kwargs + file, name, default_only=True, meta=True, creds=None, **kwargs ): """ Try to load data from a local cache, failing that, loads it from an IIASA database. @@ -662,9 +658,7 @@ def lazy_read_iiasa( creds : str or :class:`pathlib.Path`, optional Path to a file with authentication credentials. This feature is deprecated, please run ``ixmp4 login `` in a console instead. - base_url : str - Authentication server URL - kwargs + **kwargs Arguments for :meth:`pyam.read_ixmp4` or :meth:`pyam.iiasa.Connection.query`. Notes @@ -688,7 +682,7 @@ def lazy_read_iiasa( ], "We will only read and write to csv and xlsx format." if os.path.exists(file): date_set = pd.to_datetime(os.path.getmtime(file), unit="s") - version_info = Connection(name, creds, base_url).properties() + version_info = Connection(name, creds).properties() latest_new = np.nanmax(pd.to_datetime(version_info["create_date"])) latest_update = np.nanmax(pd.to_datetime(version_info["update_date"])) latest = pd.Series([latest_new, latest_update]).max() From 913c2cf650e9a87465aab741920f018cc71064e0 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Thu, 21 Mar 2024 09:20:23 +0100 Subject: [PATCH 14/15] Make ruff --- pyam/iiasa.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pyam/iiasa.py b/pyam/iiasa.py index 5b4e7313f..8f2ef5fff 100644 --- a/pyam/iiasa.py +++ b/pyam/iiasa.py @@ -622,14 +622,10 @@ def read_iiasa(name, default_only=True, meta=True, creds=None, **kwargs): ) return read_ixmp4(name, default_only=default_only, **kwargs) - return Connection(name, creds).query( - default_only=default_only, meta=meta, **kwargs - ) + return Connection(name, creds).query(default_only=default_only, meta=meta, **kwargs) -def lazy_read_iiasa( - file, name, default_only=True, meta=True, creds=None, **kwargs -): +def lazy_read_iiasa(file, name, default_only=True, meta=True, creds=None, **kwargs): """ Try to load data from a local cache, failing that, loads it from an IIASA database. From 7bfe5d8ced1443e6fea9d2f72fa85f58f6cbd5b8 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Thu, 21 Mar 2024 09:24:15 +0100 Subject: [PATCH 15/15] Remove deprecated argument --- pyam/iiasa.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pyam/iiasa.py b/pyam/iiasa.py index 8f2ef5fff..13e9050f5 100644 --- a/pyam/iiasa.py +++ b/pyam/iiasa.py @@ -696,7 +696,6 @@ def lazy_read_iiasa(file, name, default_only=True, meta=True, creds=None, **kwar meta=meta, default_only=default_only, creds=creds, - base_url=base_url, **kwargs, ) Path(file).parent.mkdir(parents=True, exist_ok=True)