From a6a3ca854ec77b35542d9eca69afda327e40d199 Mon Sep 17 00:00:00 2001 From: rwijtvliet Date: Tue, 5 Dec 2023 14:54:35 +0100 Subject: [PATCH 1/8] New release (#65) * Poetry (#59) * changed to poetry * fixed pint problem (groups in unitdef.txt) and pint-pandas dependency problem by fixing pandas to 2.0 * ci pipeline * ci pipeline * ci with poetry * solve dependency problems between pandas and pint-pandas * workaround pint-pandas bug * typo * seaborn pinned version to 0.8 * fixed to_excel function, updated version of pint * fixed arithmatic on pflines without overlap * small changes small changes * more consistent functions to get random pfline * deleted comment * change the python version for push request to 3.11 * test * Removed unused dependency * updated toml * added exception if no clipboard available * updated toml * fixed pfline_excelclipboad.py * changed lock file for pre-commit * install poetry libraries in pre-commit step * use black on all files in pre-commit * updated flake8 version in pre-commit.yaml * exclude .venv folder from flake8 * changed setup.cfg to ignore flake8 error messages * make wavg avaiable at package root * fixed docs, added int/float test * renamed doc to docs * removed python3.8 (pandas compatibility) * readthedocs using poetry --------- Co-authored-by: rwijtvliet Co-authored-by: Alina Voilova * Better development functions for pfline (#63) * added more flexible and more complete way of getting pflines for testing purposes * additional argument to get negative values as well * start-of-day tools * start-of-day tools (#64) --------- Co-authored-by: Alina Voilova <91426818+Pizza2Pizza@users.noreply.github.com> Co-authored-by: Alina Voilova --- poetry.lock | 2 +- portfolyo/dev/develop.py | 161 +++++++++++++++++++++++++-------- portfolyo/tools/__init__.py | 1 + portfolyo/tools/changefreq.py | 10 +- portfolyo/tools/isboundary.py | 4 +- portfolyo/tools/startofday.py | 69 ++++++++++++++ portfolyo/tools/trim.py | 3 +- pyproject.toml | 2 +- tests/tools/test_startofday.py | 71 +++++++++++++++ 9 files changed, 274 insertions(+), 49 deletions(-) create mode 100644 portfolyo/tools/startofday.py create mode 100644 tests/tools/test_startofday.py diff --git a/poetry.lock b/poetry.lock index f60ba1a..582f065 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2871,4 +2871,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "0c192403b2749daa7649eb4cca700d4abf9df9af1b6ece371dca202c7713b374" +content-hash = "cc0cdc76ab8b5f234e70e625215e81e9936fdf1b69afc7403abd9436ace0f73a" diff --git a/portfolyo/dev/develop.py b/portfolyo/dev/develop.py index 10e95f9..5c7f426 100644 --- a/portfolyo/dev/develop.py +++ b/portfolyo/dev/develop.py @@ -3,7 +3,7 @@ """ import datetime as dt -from typing import Dict, Union +from typing import Dict, Union, Callable, Tuple import numpy as np import pandas as pd @@ -15,6 +15,8 @@ OK_COL_COMBOS = ["w", "q", "p", "pr", "qr", "qp", "wp", "wr"] +INDEX_LEN = {"AS": 4, "QS": 5, "MS": 14, "D": 400, "H": 10_000, "15T": 50_000} + def get_index( freq: str = "D", @@ -23,16 +25,14 @@ def get_index( periods: int = None, start_of_day: dt.time = None, *, - _seed: bool = True, + _seed: int = None, ) -> pd.DatetimeIndex: """Get index.""" if _seed: np.random.seed(_seed) if not periods: - standard = {"AS": 4, "QS": 5, "MS": 14, "D": 400, "H": 10_000, "15T": 50_000} - periods = standard.get(freq, 10) - if _seed: - periods = np.random.randint(periods // 2, periods * 2) + standard_len = INDEX_LEN.get(freq, 10) + periods = np.random.randint(standard_len // 2, standard_len * 2) if tools.freq.up_or_down(freq, "H") <= 0 and tz is None: # Shorten index to not include timestamp that do not exist in Europe/Berlin. periods = min(periods, 4000) @@ -128,58 +128,139 @@ def get_dataframe( # Portfolio line. +def _get_namefn(nlevels: int) -> Callable[[int], str]: + """Name function. Turns int into string in various ways.""" + if nlevels % 5 == 0: + + def fn(i: int) -> str: + return str(i) # simply the number + + elif nlevels % 5 == 1: + + def fn(i: int) -> str: + return chr(i + 65) # capital letter + + elif nlevels % 5 == 2: + + def fn(i: int) -> str: + return chr(i + 65 + 32) # small letter + + elif nlevels % 5 == 3: + symbols = [(40, "XL"), (10, "X"), (9, "IX"), (5, "V"), (4, "IV"), (1, "I")] + + def fn(i: int) -> str: + i += 1 # make sure start with 1 + roman = "" + for value, symbol in symbols: + while i >= value: + roman += symbol + i -= value + return roman # roman numeral + + else: + + def fn(i: int) -> str: + i += 1 # make sure start with 1 + tens, ones = divmod(i, 10) + suffix = "th" + if tens != 1: + if ones == 1: + suffix = "st" + elif ones == 2: + suffix = "nd" + elif ones == 3: + suffix = "rd" + return f"{i}{suffix}" # 1st, 2nd, 3rd, 4th, ... + + return fn + + def get_pfline( i: pd.DatetimeIndex = None, kind: Kind = Kind.COMPLETE, nlevels: int = 1, + childcount: int = 2, *, + positive: bool = False, + _ancestornames: Tuple[str] = (), _seed: int = None, -) -> FlatPfLine: - """Get a portfolio line.""" +) -> PfLine: + """ + Create a portfolio line. + + Parameters + ---------- + i : pd.DatetimeIndex, optional (default: random) + Datetimeindex to use for the portfolio line. + kind : Kind, optional (default: COMPLETE) + nlevels : int (default: 1) + Number of levels. Must be >=1 If 1, return flat portfolio line. + childcount : int, optional (default: 2) + Number of children on each level. (Ignored if `nlevels` == 1) + positive : bool, optional (default: False) + If True, return only positive values. If False, make 1/3 of pflines negative. + _ancestornames : Tuple[str], optional (default: ()) + Text to start the childrens' names with (concatenated with '-') + _seed : int, optional (default: no seed value) + Seed value for the randomizer. + + Returns + ------- + PfLine + """ + # Gather information. + if i is None: + i = get_index(_seed=_seed) + if _seed: + np.random.seed(_seed) + # Create flat pfline. if nlevels == 1: - return get_flatpfline(i, kind, _seed=_seed) - else: - return get_nestedpfline(i, kind, nlevels, _seed=_seed) + columns = { + Kind.VOLUME: "q", + Kind.PRICE: "p", + Kind.REVENUE: "r", + Kind.COMPLETE: "qr", + }[kind] + df = get_dataframe(i, columns, _seed=_seed) + if not positive and np.random.rand() < 0.33: + df = -1 * df # HACK: `-df` leads to error in pint. Maybe fixed in future + return create.flatpfline(df) + # Create nested PfLine. + if childcount < 1: + raise ValueError("Nested PfLine must have at least 1 child.") + namefn = _get_namefn(nlevels) + children = {} + for c in range(childcount): + names = (*_ancestornames, namefn(c)) + name = "-".join(names) + children[name] = get_pfline( + i, kind, nlevels - 1, childcount, _ancestornames=names, _seed=_seed + ) + return create.nestedpfline(children) def get_flatpfline( i: pd.DatetimeIndex = None, kind: Kind = Kind.COMPLETE, *, _seed: int = None ) -> FlatPfLine: """Get flat portfolio line, i.e. without children.""" - columns = { - Kind.VOLUME: "q", - Kind.PRICE: "p", - Kind.REVENUE: "r", - Kind.COMPLETE: "qr", - }[kind] - return create.flatpfline(get_dataframe(i, columns, _seed=_seed)) + return get_pfline(i, kind, 1, _seed=_seed) def get_nestedpfline( i: pd.DatetimeIndex = None, kind: Kind = Kind.COMPLETE, nlevels: int = 2, + childcount: int = 2, *, _seed: int = None, ) -> NestedPfLine: - """Get nested portfolio line. With 2 children of the same ``kind``. If ``nlevels``==2, the children are both flat; if not, + """Get nested portfolio line with children of the same ``kind``. If ``nlevels``==2, the children are both flat; if not, the portfolio line is multiply nested.""" - if i is None: - i = get_index(_seed=_seed) - if nlevels == 2: - return create.nestedpfline( - { - "A": get_flatpfline(i, kind, _seed=_seed), - "B": get_flatpfline(i, kind, _seed=_seed), - } - ) - else: - return create.nestedpfline( - { - "A": get_nestedpfline(i, kind, nlevels - 1, _seed=_seed), - "B": get_nestedpfline(i, kind, nlevels - 1, _seed=_seed), - } + if nlevels <= 1: + raise ValueError( + "Nested PfLine must have at least 2 levels. Use `get_flatpfline` or the more general `get_pfline` instead." ) + return get_pfline(i, kind, nlevels, childcount, _seed=_seed) def get_randompfline( @@ -187,8 +268,9 @@ def get_randompfline( kind: Kind = Kind.COMPLETE, max_nlevels: int = 3, max_childcount: int = 2, - prefix: str = "", *, + positive: bool = False, + _ancestornames: Tuple[str] = (), _seed: int = None, ) -> PfLine: """Get portfolio line, without children or with children in random number of levels. @@ -201,18 +283,21 @@ def get_randompfline( nlevels = np.random.randint(1, max_nlevels + 1) # Create flat PfLine. if nlevels == 1: - return get_flatpfline(i, kind, _seed=_seed) + return get_pfline(i, kind, 1, positive=positive, _seed=_seed) # Create nested PfLine. + namefn = _get_namefn(nlevels) children = {} childcount = np.random.randint(1, max_childcount + 1) for c in range(childcount): - name = f"part {prefix}{c}." + names = (*_ancestornames, namefn(c)) + name = "-".join(names) children[name] = get_randompfline( i, kind, max_nlevels - 1, max_childcount, - prefix=f"{prefix}{c}.", + positive=positive, + _ancestornames=names, _seed=_seed, ) return create.nestedpfline(children) diff --git a/portfolyo/tools/__init__.py b/portfolyo/tools/__init__.py index 36ba61e..8e6f519 100644 --- a/portfolyo/tools/__init__.py +++ b/portfolyo/tools/__init__.py @@ -20,4 +20,5 @@ tzone, unit, wavg, + startofday, ) diff --git a/portfolyo/tools/changefreq.py b/portfolyo/tools/changefreq.py index 7a86da1..72d3477 100644 --- a/portfolyo/tools/changefreq.py +++ b/portfolyo/tools/changefreq.py @@ -1,10 +1,11 @@ """Functions to change frequency of a pandas dataframe.""" -import datetime as dt from typing import Any, Union import pandas as pd + +from . import startofday as tools_startofday from . import freq as tools_freq from . import right as tools_right from . import trim as tools_trim @@ -43,8 +44,7 @@ def _downsample_summable(s: pd.Series, freq: str) -> pd.Series: if not len(s): # Empty series. return _emptyseries(s, freq) - start_of_day = s.index[0].time() - offset = dt.timedelta(hours=start_of_day.hour, minutes=start_of_day.minute) + offset = tools_startofday.get(s.index, "timedelta") source_vs_daily = tools_freq.up_or_down(s.index.freq, "D") target_vs_daily = tools_freq.up_or_down(freq, "D") @@ -83,9 +83,7 @@ def _upsample_avgable(s: pd.Series, freq: str) -> pd.Series: if not len(s): # Empty series. return _emptyseries(s, freq) - start_of_day = s.index[0].time() - offset = dt.timedelta(hours=start_of_day.hour, minutes=start_of_day.minute) - + offset = tools_startofday.get(s.index, "timedelta") source_vs_daily = tools_freq.up_or_down(s.index.freq, "D") target_vs_daily = tools_freq.up_or_down(freq, "D") diff --git a/portfolyo/tools/isboundary.py b/portfolyo/tools/isboundary.py index e697a2b..e6208ef 100644 --- a/portfolyo/tools/isboundary.py +++ b/portfolyo/tools/isboundary.py @@ -9,6 +9,7 @@ import pandas as pd from . import freq as tools_freq +from . import startofday as tools_startofday # Necessary because pd.DatetimeIndex.is_year_start is broken. @@ -124,8 +125,7 @@ def index(i: pd.DatetimeIndex, freq: str) -> pd.Series: # we need to check if the stamps are on the first day of X AND if they have the correct time. else: # . Check time of day. - start_of_day = i[0].time() - values = i.time == start_of_day + values = i.time == tools_startofday.get(i) # . Check day of X. if tools_freq.up_or_down(freq, "D") > 0: values &= is_X_start(i, freq) diff --git a/portfolyo/tools/startofday.py b/portfolyo/tools/startofday.py new file mode 100644 index 0000000..14c6af9 --- /dev/null +++ b/portfolyo/tools/startofday.py @@ -0,0 +1,69 @@ +""" +Tools to get/set start-of-day. +""" + + +import pandas as pd +from . import freq as tools_freq +import datetime as dt +from typing import Union + + +def get( + i: pd.DatetimeIndex, returntype: str = "time" +) -> Union[dt.time, str, dt.timedelta]: + """Get start-of-day of an index. + + Parameters + ---------- + i : pd.DatetimeIndex + returntype : {'time', 'str', 'timedelta'}, optional (default: 'time') + If 'time', return as datetime.time object. + If 'str', return as HH:MM:SS string. + If 'timedelta', return as datetime.timedelta object with timedelta to previous + midnight (24h day). + + Returns + ------- + Union[dt.time, str] + """ + start_of_day = i[0].time() + if returntype == "time": + return start_of_day + elif returntype == "str": + return f"{start_of_day.hour:02}:{start_of_day.minute:02}:00" + elif returntype == "timedelta": + return dt.timedelta(hours=start_of_day.hour, minutes=start_of_day.minute) + raise ValueError( + f"Unknown value for parameter 'returntype'. Expected one of {'time', 'str', 'timedelta'}, got {returntype}." + ) + + +def set(i: pd.DatetimeIndex, start_of_day: dt.time = None) -> pd.DatetimeIndex: + """Set the start-of-day of an index by changing the time-part of the index elements. + + Parameters + ---------- + i : pd.DatetimeIndex + Index; must have a daily (or longer) frequency. + start_of_day : dt.time, optional (default: midnight) + The new time that replaces the time-part of index elements. + + Returns + ------- + pd.DatetimeIndex + With adjusted time-part. Date-part is unchanged, so new timestamps are on same + calendar day as original timestamps. + """ + if tools_freq.up_or_down(i.freq, "D") < 0: + raise ValueError( + "Can only set the start-of-day of an index with daily (or longer) frequency." + ) + + if start_of_day is None: + start_of_day = dt.time(hour=0, minute=0, second=0) + elif start_of_day.second != 0 or start_of_day.minute % 15 != 0: + raise ValueError("Start of day must coincide with a full quarterhour.") + + tss = (ts.replace(hour=start_of_day.hour, minute=start_of_day.minute) for ts in i) + return pd.DatetimeIndex(tss, freq=i.freq, tz=i.tz) diff --git a/portfolyo/tools/trim.py b/portfolyo/tools/trim.py index 7e575dd..bf34278 100644 --- a/portfolyo/tools/trim.py +++ b/portfolyo/tools/trim.py @@ -9,6 +9,7 @@ from . import ceil as tools_ceil from . import floor as tools_floor from . import freq as tools_freq +from . import startofday as tools_startofday from . import right as tools_right @@ -38,7 +39,7 @@ def index(i: pd.DatetimeIndex, freq: str) -> pd.DatetimeIndex: if not i.freq: raise ValueError("Index ``i`` does not have a frequency.") # Use index to find start_of_day. - start_of_day = i[0].time() + start_of_day = tools_startofday.get(i) # Trim on both sides. mask_start = i >= tools_ceil.stamp(i[0], freq, 0, start_of_day) i_right = tools_right.index(i) diff --git a/pyproject.toml b/pyproject.toml index f452e76..673fce3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,12 +12,12 @@ readme = "README.rst" [tool.poetry.dependencies] python = "^3.9" pandas = "~2.0" # pandas 2.1.0 doesn't play nice with pint-pandas. Update when new pint-pandas version is released (>0.5) -numpy = "^1.25.2" matplotlib = "^3.7.2" pint = "0.19.2" pint-pandas = "0.4" colorama = "^0.4.6" holidays = "^0.32" +numpy = "^1.26.2" [tool.poetry.group.test.dependencies] diff --git a/tests/tools/test_startofday.py b/tests/tools/test_startofday.py new file mode 100644 index 0000000..b098883 --- /dev/null +++ b/tests/tools/test_startofday.py @@ -0,0 +1,71 @@ +import pytest +import datetime as dt +from portfolyo import tools, testing, dev + + +ERROR_SOD_DICT = {"hour": 6, "minute": 1} # error +SOD_DICTS = [ + {"hour": 0, "minute": 0}, + {"hour": 6, "minute": 0}, + {"hour": 15, "minute": 30}, + ERROR_SOD_DICT, +] + +SEED = 3 + + +STARTDATE_AND_FREQ = [ + ("2020-01-01", "H"), + ("2020-01-01", "D"), + ("2020-01-01", "MS"), + ("2020-03-28", "D"), + ("2020-03-01", "MS"), + ("2020-10-25", "D"), + ("2020-10-01", "MS"), +] + + +def create_start_of_day(hour, minute, returntype): + if returntype == "time": + return dt.time(hour=hour, minute=minute) + if returntype == "str": + return f"{hour:02}:{minute:02}:00" + if returntype == "timedelta": + return dt.timedelta(hours=hour, minutes=minute) + + +@pytest.mark.parametrize("startdate,freq", STARTDATE_AND_FREQ) +@pytest.mark.parametrize("sod_dict", SOD_DICTS) +@pytest.mark.parametrize("returntype", ["time", "str", "timedelta"]) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) +def test_get_startofday(startdate, freq, tz, sod_dict, returntype): + """Test if start-of-day can be correctly gotten from index.""" + i = dev.get_index(freq, tz, startdate, 10, dt.time(**sod_dict), _seed=SEED) + result = tools.startofday.get(i, returntype) + expected = create_start_of_day(**sod_dict, returntype=returntype) + assert result == expected + + +@pytest.mark.parametrize("startdate,freq", STARTDATE_AND_FREQ) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) +@pytest.mark.parametrize("sod_dict_in", SOD_DICTS) +@pytest.mark.parametrize("sod_dict_out", SOD_DICTS) +def test_set_startofday(startdate, freq, tz, sod_dict_in, sod_dict_out): + """Test if start of day can be correctly set to an index.""" + periods = {"H": 240, "D": 10, "MS": 3}[freq] + start_of_day_in = create_start_of_day(**sod_dict_in, returntype="time") + start_of_day_out = create_start_of_day(**sod_dict_out, returntype="time") + i = dev.get_index(freq, tz, startdate, periods, start_of_day_in, _seed=SEED) + if freq == "H" or sod_dict_out == ERROR_SOD_DICT: + with pytest.raises(ValueError): + _ = tools.startofday.set(i, start_of_day_out) + return + + result = tools.startofday.set(i, start_of_day_out) + if start_of_day_in == start_of_day_out: + expected = i + else: + expected = dev.get_index( + freq, tz, startdate, periods, start_of_day_out, _seed=SEED + ) + testing.assert_index_equal(result, expected) From a69d06f8961baf903d16f6ee1ee4280147e8941b Mon Sep 17 00:00:00 2001 From: rwijtvliet Date: Wed, 6 Dec 2023 00:12:20 +0100 Subject: [PATCH 2/8] reset (#67) * Better development functions for pfline (#63) * added more flexible and more complete way of getting pflines for testing purposes * additional argument to get negative values as well * start-of-day tools * start-of-day tools (#64) From b162857c035beeefe4cd8024167f2ee4ccfb4f12 Mon Sep 17 00:00:00 2001 From: rwijtvliet Date: Thu, 7 Dec 2023 14:23:15 +0100 Subject: [PATCH 3/8] v0.5.7 (#72) * better description of development process (#70) * Update README.rst (#71) * feat: bump version to latest release +1 (#69) --------- Co-authored-by: Stefan Keidel <1188614+stefankeidel@users.noreply.github.com> --- .gitignore | 2 ++ README.rst | 19 ++++++++++++++++--- create_release_branch.sh | 22 ++++++++++++++++++++++ pyproject.toml | 2 +- 4 files changed, 41 insertions(+), 4 deletions(-) create mode 100755 create_release_branch.sh diff --git a/.gitignore b/.gitignore index 6590164..70db76d 100644 --- a/.gitignore +++ b/.gitignore @@ -152,6 +152,8 @@ cython_debug/ .vscode/ +# pyenv +.python-version # OWN diff --git a/README.rst b/README.rst index e70a290..7734531 100644 --- a/README.rst +++ b/README.rst @@ -66,7 +66,20 @@ the commit hooks. .. code-block:: bash - $ pip install -r requirements-dev.txt - $ pre-commit install + poetry install --with=dev,test + pre-commit install -Feature branches are merged into the `develop` branch. This branch is merged into the `main` branch whenever a new stable release is published. \ No newline at end of file +Feature branches are merged into the ``develop`` branch via pull request. + +Publishing +---------- + +To publish a new release from ``develop``, create a new branch, increment the version number and push to github. For convenience, there is a ``create_release_branch.sh`` script that accomplishes the same, which takes one argument: + +.. code-block:: bash + + create_release_branch.sh major # or minor, or patch, or specific version number + +Then, from the github website, the release can be published by clicking the "tags" button. Be sure to select the correct branch. + +When done, merge the release branch into ``develop`` and ``main``, also via pull request, and delete it. diff --git a/create_release_branch.sh b/create_release_branch.sh new file mode 100755 index 0000000..c87b8f2 --- /dev/null +++ b/create_release_branch.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +set -e + +if [ $# -eq 0 ]; then + echo "please write the type of release you would like to perform (major, minor, patch, or a specific version)" + exit 1 +fi + +git fetch origin +git checkout develop +git pull origin develop + +poetry version $1 +version=$(poetry version --short) +message="Portfolyo Release $version" + +git checkout -b $version + +git add pyproject.toml +git commit -m "$message" +git push origin $version \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 673fce3..dde3885 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "portfolyo" -version = "0.5.4" +version = "0.5.7" description = "Analyse and manipulate timeseries related to power and gas offtake portfolios" authors = [ "Ruud Wijtvliet ", From 35b07040cda169fd16534bded64182bcec93b30f Mon Sep 17 00:00:00 2001 From: rwijtvliet Date: Thu, 1 Feb 2024 16:16:18 +0100 Subject: [PATCH 4/8] additional tests (#74) --- pyproject.toml | 2 +- tests/core/pfline/test_pfline_text.py | 13 +++++++++++++ tests/core/pfstate/test_pfstate_text.py | 9 +++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 tests/core/pfline/test_pfline_text.py create mode 100644 tests/core/pfstate/test_pfstate_text.py diff --git a/pyproject.toml b/pyproject.toml index b3cd8a4..a077092 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "portfolyo" -version = "0.5.8" +version = "0.5.9" description = "Analyse and manipulate timeseries related to power and gas offtake portfolios" authors = [ "Ruud Wijtvliet ", diff --git a/tests/core/pfline/test_pfline_text.py b/tests/core/pfline/test_pfline_text.py new file mode 100644 index 0000000..5f8c980 --- /dev/null +++ b/tests/core/pfline/test_pfline_text.py @@ -0,0 +1,13 @@ +"""Test if portfolio line can be printed.""" + +import pytest +import portfolyo as pf + + +@pytest.mark.parametrize("levels", [1, 2, 3]) +@pytest.mark.parametrize("kind", pf.Kind) +@pytest.mark.parametrize("flatten", [True, False]) +def test_pfline_print(levels: int, kind: pf.Kind, flatten: bool): + """Test if portfolio line can be printed.""" + pfl = pf.dev.get_pfline(kind=kind, nlevels=levels) + pfl.print(flatten) diff --git a/tests/core/pfstate/test_pfstate_text.py b/tests/core/pfstate/test_pfstate_text.py new file mode 100644 index 0000000..7a1f9e8 --- /dev/null +++ b/tests/core/pfstate/test_pfstate_text.py @@ -0,0 +1,9 @@ +"""Test if portfolio state can be printed.""" + +import portfolyo as pf + + +def test_pfstate_print(): + """Test if portfolio state can be printed.""" + pfs = pf.dev.get_pfstate() + pfs.print() From 5a3263bc1ee11a8259f02ca0397254ee1a0a53ce Mon Sep 17 00:00:00 2001 From: rwijtvliet Date: Thu, 1 Feb 2024 16:36:50 +0100 Subject: [PATCH 5/8] Portfolyo Release 0.5.10 (#75) --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index a077092..974f208 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "portfolyo" -version = "0.5.9" +version = "0.5.10" description = "Analyse and manipulate timeseries related to power and gas offtake portfolios" authors = [ "Ruud Wijtvliet ", From 31339030abb304c9aff217ef54059e1c17f6425d Mon Sep 17 00:00:00 2001 From: Alina Voilova <91426818+Pizza2Pizza@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:42:17 +0100 Subject: [PATCH 6/8] Slice (#78) * added slice property & tests * changed toml * fixed tz issue and added tz test for slicing * added test-cases with tz --------- Co-authored-by: Alina Voilova Co-authored-by: rwijtvliet --- docs/core/pfline.rst | 7 +- docs/tutorial/part3.ipynb | 1910 ++++++++++++----------- docs/tutorial/part4.ipynb | 556 +++---- portfolyo/core/ndframelike.py | 6 + portfolyo/core/pfline/classes.py | 2 + portfolyo/core/pfline/flat_methods.py | 24 + portfolyo/core/pfline/nested_methods.py | 17 + portfolyo/core/pfstate/pfstate.py | 18 + pyproject.toml | 1 + test-output.xml | 1 + tests/core/pfline/test_slice.py | 107 ++ tests/core/pfstate/test_slice_state.py | 76 + 12 files changed, 1500 insertions(+), 1225 deletions(-) create mode 100644 test-output.xml create mode 100644 tests/core/pfline/test_slice.py create mode 100644 tests/core/pfstate/test_slice_state.py diff --git a/docs/core/pfline.rst b/docs/core/pfline.rst index e3a8678..5a6756d 100644 --- a/docs/core/pfline.rst +++ b/docs/core/pfline.rst @@ -252,6 +252,8 @@ Index slice From ``pandas`` we know the ``.loc[]`` property which allows us to select a slice of the objects. This is implemented also for portfolio lines. Currently, it supports enering a slice of timestamps. It is a wrapper around the ``pandas.DataFrame.loc[]`` property, and therefore follows the same convention, with the end point being included in the result. +Another slicing method is implemented with the ``.slice[]`` property. The improvement to ``.loc[]`` is, that ``.slice[]`` uses the more common convention of excluding the end point. This has several advantages, which stem from the fact that, unlike when using ``.loc``, using ``left = pfl.slice[:a]`` and ``right = pfl.slice[a:]`` returns portfolio lines that are complements - every timestamp in the original portfolio line is found in either the left or the right slice. This is useful when e.g. concatenating portfolio lines (see below.) + .. exec_code:: # --- hide: start --- @@ -261,12 +263,13 @@ From ``pandas`` we know the ``.loc[]`` property which allows us to select a slic pfl = pf.PfLine(input_df) # --- hide: stop --- # continuation of previous code example - pfl.loc['2024':'2025'] # includes 2025 + pfl.slice['2024':'2026'] # excludes 2026; 2026 interpreted as timestamp 2026-01-01 00:00:00 # --- hide: start --- - print(pfl.loc['2024':'2025']) + print(pfl.slice['2024':'2026']) # --- hide: stop --- + Volume-only, price-only or revenue-only ======================================= diff --git a/docs/tutorial/part3.ipynb b/docs/tutorial/part3.ipynb index e71e8bf..1abbd36 100644 --- a/docs/tutorial/part3.ipynb +++ b/docs/tutorial/part3.ipynb @@ -1,948 +1,968 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Tutorial part 3\n", - "\n", - "In [part 1](part1.ipynb) and [part 2](part2.ipynb) we have learnt about portfolio lines. These are timeseries, or collections of timeseries, describing the volumes and/or prices during various delivery periods.\n", - "\n", - "In this part, we'll combine portfolio lines into a \"portfolio state\" (``PfState``) object. As we'll see, some of the methods and properties we know from the ``PfLine`` class also apply here.\n", - "\n", - "\n", - "## Example data\n", - "\n", - "Let's again use the mock functions to get some portfolio lines. (The parameter details here are not important, we just want some more-or-less realistic data). To change things up a bit from the previous tutorial parts, we'll look at about 80 days in the autumn of 2024, in quarterhourly (``\"15T\"``) resolution. And let's localize the data to a specific timezone:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import portfolyo as pf\n", - "import pandas as pd\n", - "\n", - "index = pd.date_range('2024-09-20', '2024-12-10', freq='15T', inclusive='left', tz='Europe/Berlin')\n", - "# Creating offtake portfolio line.\n", - "ts_offtake = -1 * pf.dev.w_offtake(index, avg=50)\n", - "offtake = pf.PfLine({'w': ts_offtake})\n", - "# Creating portfolio line with market prices (here: price-forward curve).\n", - "ts_prices = pf.dev.p_marketprices(index, avg=200)\n", - "prices = pf.PfLine({'p': ts_prices})\n", - "\n", - "# Creating portfolio line with sourced volume.\n", - "ts_sourced_power1, ts_sourced_price1 = pf.dev.wp_sourced(ts_offtake, 'QS', 0.3, p_avg=120)\n", - "sourced_quarters = pf.PfLine({'w': ts_sourced_power1, 'p': ts_sourced_price1})\n", - "ts_sourced_power2, ts_sourced_price2 = pf.dev.wp_sourced(ts_offtake, 'MS', 0.2, p_avg=150)\n", - "sourced_months = pf.PfLine({'w': ts_sourced_power2, 'p': ts_sourced_price2})\n", - "sourced = pf.PfLine({'quarter_products': sourced_quarters, 'month_products': sourced_months})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now use these portfolio lines to create a portfolio state.\n", - "\n", - "## Portfolio State\n", - "\n", - "The ``PfState`` class is used to hold information about offtake, market prices, and sourcing. Let's create one from the portfolio lines we just created:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "PfState object.\n", - ". Start: 2024-09-20 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", - ". End : 2024-12-10 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", - ". Freq : <15 * Minutes> (7780 datapoints)\n", - " w q p r\n", - " MW MWh Eur/MWh Eur\n", - "──────── offtake\n", - " 2024-09-20 00:00:00 +0200 -45.8 -11 \n", - " 2024-09-20 00:15:00 +0200 -44.4 -11 \n", - " .. .. .. .. ..\n", - " 2024-12-09 23:30:00 +0100 -60.5 -15 \n", - " 2024-12-09 23:45:00 +0100 -58.3 -15 \n", - "─●────── pnl_cost\n", - " │ 2024-09-20 00:00:00 +0200 45.8 11 136.54 1 564\n", - " │ 2024-09-20 00:15:00 +0200 44.4 11 135.21 1 500\n", - " │ .. .. .. .. ..\n", - " │ 2024-12-09 23:30:00 +0100 60.5 15 167.89 2 540\n", - " │ 2024-12-09 23:45:00 +0100 58.3 15 167.21 2 436\n", - " ├●───── sourced\n", - " ││ 2024-09-20 00:00:00 +0200 31.3 8 135.03 1 058\n", - " ││ 2024-09-20 00:15:00 +0200 31.3 8 135.03 1 058\n", - " ││ .. .. .. .. ..\n", - " ││ 2024-12-09 23:30:00 +0100 35.7 9 126.09 1 124\n", - " ││ 2024-12-09 23:45:00 +0100 35.7 9 126.09 1 124\n", - " │├───── quarter_products\n", - " ││ 2024-09-20 00:00:00 +0200 16.4 4 102.48 421\n", - " ││ 2024-09-20 00:15:00 +0200 16.4 4 102.48 421\n", - " ││ .. .. .. .. ..\n", - " ││ 2024-12-09 23:30:00 +0100 13.4 3 111.14 372\n", - " ││ 2024-12-09 23:45:00 +0100 13.4 3 111.14 372\n", - " │└───── month_products\n", - " │ 2024-09-20 00:00:00 +0200 14.9 4 170.85 637\n", - " │ 2024-09-20 00:15:00 +0200 14.9 4 170.85 637\n", - " │ .. .. .. .. ..\n", - " │ 2024-12-09 23:30:00 +0100 22.3 6 135.07 752\n", - " │ 2024-12-09 23:45:00 +0100 22.3 6 135.07 752\n", - " └────── unsourced\n", - " 2024-09-20 00:00:00 +0200 14.5 4 139.81 506\n", - " 2024-09-20 00:15:00 +0200 13.0 3 135.64 442\n", - " .. .. .. .. ..\n", - " 2024-12-09 23:30:00 +0100 24.8 6 227.88 1 416\n", - " 2024-12-09 23:45:00 +0100 22.6 6 232.05 1 312" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pfs = pf.PfState(offtake, prices, sourced)\n", - "\n", - "pfs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note from how these portfolio lines were created, that ``offtake`` has negative values. The sign conventions are discussed [here](../core/pfstate.rst#sign-conventions).\n", - "\n", - "This portfolio state contains values for every quarterhour in the specified time period. Let's see what features this class has, starting with two methods we already met when discussing the ``PfLine`` class.\n", - "\n", - "### Plotting\n", - "\n", - "Just as when working with portfolio lines, we can get a quick overview of the portfolio state with the ``.plot()`` method..." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "pfs.plot();" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "...and we can copy its data to the clipboard, or save it as an Excel workbook:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "pfs.to_clipboard()\n", - "pfs.to_excel('portfolio_state.xlsx')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Looking at the offtake, we can see the daily and weekly cycles, as well as a slow increase over the entire time period.\n", - "\n", - "This graph is a bit too detailed for most purposes, so let's look at the second method we know from ``PfLine``: resampling.\n", - "\n", - "### Resampling\n", - "\n", - "We might prefer to see hourly, daily, or monthly values instead of the quarterhourly values that are in ``pfs``. For this, we can resample the object with the ``.asfreq()`` method. In this code example, we also use the ``.print()`` method, which adds some helpful coloring to the output:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PfState object.\n", - ". Start: 2024-10-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", - ". End : 2024-12-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", - ". Freq : (2 datapoints)\n", - " w q p r\n", - " MW MWh Eur/MWh Eur\n", - "\u001b[1m\u001b[37m──────── offtake\n", - " \u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 -54.7 -40 744 \n", - " \u001b[1m\u001b[37m \u001b[0m2024-11-01 00:00:00 +0100 -59.4 -42 732 \n", - "\u001b[1m\u001b[37m─\u001b[1m\u001b[33m●\u001b[1m\u001b[37m────── pnl_cost\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 54.7 40 744 160.48 6 538 471\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-11-01 00:00:00 +0100 59.4 42 732 182.94 7 817 452\n", - " \u001b[1m\u001b[33m├\u001b[1m\u001b[36m●\u001b[1m\u001b[33m───── sourced\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│\u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 31.2 23 221 132.58 3 078 642\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│\u001b[1m\u001b[33m \u001b[0m2024-11-01 00:00:00 +0100 25.9 18 652 133.27 2 485 849\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m├───── quarter_products\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│ \u001b[1m\u001b[36m \u001b[0m2024-10-01 00:00:00 +0200 13.8 10 256 106.54 1 092 646\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│ \u001b[1m\u001b[36m \u001b[0m2024-11-01 00:00:00 +0100 13.7 9 897 106.78 1 056 810\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m└───── month_products\n", - " \u001b[1m\u001b[33m│ \u001b[1m\u001b[36m \u001b[0m2024-10-01 00:00:00 +0200 17.4 12 964 153.19 1 985 996\n", - " \u001b[1m\u001b[33m│ \u001b[1m\u001b[36m \u001b[0m2024-11-01 00:00:00 +0100 12.2 8 755 163.22 1 429 039\n", - " \u001b[1m\u001b[33m└────── unsourced\n", - " \u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 23.5 17 523 197.44 3 459 829\n", - " \u001b[1m\u001b[33m \u001b[0m2024-11-01 00:00:00 +0100 33.4 24 080 221.41 5 331 603\n" - ] - } - ], - "source": [ - "pfs_monthly = pfs.asfreq('MS')\n", - "pfs_monthly.print()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how the resampled output only contains those months, that are *entirely* included in the original data. ``pfl`` has data in September and December, but as these are not present in their entirety, they are dropped from ``pfl_monthly``.\n", - "\n", - "### On frequencies and unsourced prices\n", - "\n", - "There is one other important consequence of resampling: the unsourced prices are now *specific for this portfolio*. We can demonstrate this by creating a second portfolio state, using the *same price-forward curve* (but different offtake and sourced volume):" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "pfs2 = pf.PfState(offtake*1.5, prices, sourced*2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "At this shortest frequency, the unsourced prices are identical (namely, the price-forward curve). Let's create a dataframe with the prices to verify this:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
pfspfs2hpfc
2024-09-20 00:00:00+02:00139.80568207211454139.80568207211454139.80568207211454
2024-09-20 00:15:00+02:00135.63901540544785135.63901540544785135.63901540544785
2024-09-20 00:30:00+02:00131.47234873878116131.47234873878116131.47234873878116
2024-09-20 00:45:00+02:00128.13901540544785128.13901540544785128.13901540544785
2024-09-20 01:00:00+02:00124.80568207211451124.80568207211451124.80568207211451
............
2024-12-09 22:45:00+01:00217.88078474854294217.88078474854294217.88078474854294
2024-12-09 23:00:00+01:00221.2141180818763221.2141180818763221.2141180818763
2024-12-09 23:15:00+01:00224.54745141520962224.54745141520962224.54745141520962
2024-12-09 23:30:00+01:00227.88078474854294227.88078474854294227.88078474854294
2024-12-09 23:45:00+01:00232.0474514152096232.0474514152096232.0474514152096
\n", - "

7780 rows × 3 columns

\n", - "
" - ], - "text/plain": [ - " pfs pfs2 \\\n", - "2024-09-20 00:00:00+02:00 139.80568207211454 139.80568207211454 \n", - "2024-09-20 00:15:00+02:00 135.63901540544785 135.63901540544785 \n", - "2024-09-20 00:30:00+02:00 131.47234873878116 131.47234873878116 \n", - "2024-09-20 00:45:00+02:00 128.13901540544785 128.13901540544785 \n", - "2024-09-20 01:00:00+02:00 124.80568207211451 124.80568207211451 \n", - "... ... ... \n", - "2024-12-09 22:45:00+01:00 217.88078474854294 217.88078474854294 \n", - "2024-12-09 23:00:00+01:00 221.2141180818763 221.2141180818763 \n", - "2024-12-09 23:15:00+01:00 224.54745141520962 224.54745141520962 \n", - "2024-12-09 23:30:00+01:00 227.88078474854294 227.88078474854294 \n", - "2024-12-09 23:45:00+01:00 232.0474514152096 232.0474514152096 \n", - "\n", - " hpfc \n", - "2024-09-20 00:00:00+02:00 139.80568207211454 \n", - "2024-09-20 00:15:00+02:00 135.63901540544785 \n", - "2024-09-20 00:30:00+02:00 131.47234873878116 \n", - "2024-09-20 00:45:00+02:00 128.13901540544785 \n", - "2024-09-20 01:00:00+02:00 124.80568207211451 \n", - "... ... \n", - "2024-12-09 22:45:00+01:00 217.88078474854294 \n", - "2024-12-09 23:00:00+01:00 221.2141180818763 \n", - "2024-12-09 23:15:00+01:00 224.54745141520962 \n", - "2024-12-09 23:30:00+01:00 227.88078474854294 \n", - "2024-12-09 23:45:00+01:00 232.0474514152096 \n", - "\n", - "[7780 rows x 3 columns]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.DataFrame({'pfs': pfs.unsourcedprice.p, 'pfs2': pfs2.unsourcedprice.p, 'hpfc': prices.p})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "However, at every other frequency, they are not equal. When changing the frequency, a *volume-weighted* average is calculated for the unsourced prices - just like with every other price-and-volume timeseries. This makes that the unsourced prices apply only to the unsourced volume profile *of that portfolio*:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
pfspfs2hpfc
2024-10-01 00:00:00+02:00197.4437803760265192.11463549822653194.78888729464586
2024-11-01 00:00:00+01:00221.40989836363784217.79829542112196220.07479863376392
\n", - "
" - ], - "text/plain": [ - " pfs pfs2 \\\n", - "2024-10-01 00:00:00+02:00 197.4437803760265 192.11463549822653 \n", - "2024-11-01 00:00:00+01:00 221.40989836363784 217.79829542112196 \n", - "\n", - " hpfc \n", - "2024-10-01 00:00:00+02:00 194.78888729464586 \n", - "2024-11-01 00:00:00+01:00 220.07479863376392 " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.DataFrame({'pfs': pfs.asfreq('MS').unsourcedprice.p, 'pfs2': pfs2.asfreq('MS').unsourcedprice.p, 'hpfc': prices.asfreq('MS').p})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This has important consequences. \n", - "\n", - "For example, when doing a scenario analysis in which the unsourced volume is changed (e.g. \"what happens if the offtake increases by 50%?\"), we cannot expect the results to be correct *unless we are working at the original frequency*. In situations where it is clear that this error looms, a ``UserWarning`` is shown to alert the user (e.g. in the examples further below). For more information on unsourced volume, [see this section](../core/pfstate.rst#Unsourced-price) in the documentation on the `PfState` class.\n", - "\n", - "For this reason, we commonly work with our porfolio states at the frequency of the price-forward curve. Downsampling is only done to see the aggregated values for verification or reporting." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Components\n", - "\n", - "Now, let's look at the portfolio state ``pfs_monthly`` in a bit more detail, to learn more about the ``PfState`` class.\n", - "\n", - "The portfolio state is presented to us as a tree structure, with several branches. Each branch is a portfolio line. E.g, ``offtake`` and ``sourced`` are the portfolio lines we specified when creating the object. Also, the branch ``pnl_cost`` is the sum of ``sourced`` and ``unsourced``, with ``sourced`` being the sum of ``quarter_products`` and ``month_products``. \n", - "\n", - "The unsourced volume is found by comparing the offtake to what is already sourced. This volume is valued at the market prices in the forward curve.\n", - "\n", - "These portfolio lines can be obtained from the portfolio state by accessing them as attributes. E.g. ``.offtakevolume``, ``.sourced``, ``.unsourced``, or ``.pnl_cost``. The latter is the best estimate for what it will cost to procure the offtake:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "PfLine object with price and volume information.\n", - ". Start: 2024-10-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", - ". End : 2024-12-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", - ". Freq : (2 datapoints)\n", - ". Children: 'sourced' (price and volume), 'unsourced' (price and volume)\n", - " w q p r\n", - " MW MWh Eur/MWh Eur\n", - "\n", - "2024-10-01 00:00:00 +0200 54.7 40 744 160.48 6 538 471\n", - "2024-11-01 00:00:00 +0100 59.4 42 732 182.94 7 817 452" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pfs_monthly.pnl_cost" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Notice that this portfolio line has children, and as a reminder, we can \"drill into\" the object to get these nested portfolio line, e.g. with ``pfl_monthly.pnl_cost[\"sourced\"]``.\n", - "\n", - "There are some other components that are not explicitly shown:\n", - "\n", - "* We may be interested in how much of the offtake has already been sourced or unsourced. These fractions are available at the ``.sourcedfraction`` and ``.unsourcedfraction`` properties.\n", - "\n", - "* You may have noticed that ``unsourced`` is the inverse from what traders would call the \"open positions\" or \"portfolio positions\": if our portfolio is short, the unsourced volume is positive. For those that prefer this other perspective, it is available at ``.netposition``.\n", - "\n", - "### Export\n", - "\n", - "Just as with portfolio lines, we can create an excel file that contains all the information in a portfolio state with its ``.to_excel()`` method, and we can copy it to the clipboard with the ``.to_clipboard()`` method.\n", - "\n", - "### MtM\n", - "\n", - "We can evaluate the value of our sourcing contracts against the current forward curve (\"mark-to-market\") with the ``.mtm_of_sourced()`` method." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Analyses with portfolio states\n", - "\n", - "We'll now look at how we can do \"what-if\" analyses with portfolio state. The original portfolio state we will consider as the reference and store it in an appropriately named variable:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "ref = pfs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The monthly procurement prices of this portfolio are what interest us the most. As a reminder, we can find the procurement volumes and costs with:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "PfLine object with price and volume information.\n", - ". Start: 2024-10-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", - ". End : 2024-12-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", - ". Freq : (2 datapoints)\n", - ". Children: 'sourced' (price and volume), 'unsourced' (price and volume)\n", - " w q p r\n", - " MW MWh Eur/MWh Eur\n", - "\n", - "2024-10-01 00:00:00 +0200 54.7 40 744 160.48 6 538 471\n", - "2024-11-01 00:00:00 +0100 59.4 42 732 182.94 7 817 452" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cost_ref = ref.asfreq('MS').pnl_cost\n", - "cost_ref" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "(Or we could go one step further and focus on only the prices with ``ref.asfreq(\"MS\").pnl_cost.p``.)\n", - "\n", - "### Change in offtake\n", - "\n", - "Now, what would happen if the offtake were to increase by 25%? Qualitatively, this is not hard. An increase in the offtake increases the unsourced volume. And because the market prices are higher than what we pay for the sourced volume, this means that the procurement price will go up. \n", - "\n", - "How much? Let's see. First, we create a new portfolio state, from the reference, by setting the offtake to the new value. We can do this with the ``.set_offtake()`` method. After that, we can again see what the procurement volumes and costs are. (Note the ``UserWarning`` which was mentioned [above](#on-frequencies-and-unsourced-pricesE).)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "c:\\users\\ruud.wijtvliet\\ruud\\python\\dev\\portfolyo\\portfolyo\\core\\pfstate\\pfstate.py:199: UserWarning: This operation changes the unsourced volume. This causes inaccuracies in its price if the portfolio state has a frequency that is longer than the spot market.\n", - " warnings.warn(\n" - ] - }, - { - "data": { - "text/plain": [ - "PfLine object with price and volume information.\n", - ". Start: 2024-10-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", - ". End : 2024-12-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", - ". Freq : (2 datapoints)\n", - ". Children: 'sourced' (price and volume), 'unsourced' (price and volume)\n", - " w q p r\n", - " MW MWh Eur/MWh Eur\n", - "\n", - "2024-10-01 00:00:00 +0200 68.4 50 930 168.64 8 588 719\n", - "2024-11-01 00:00:00 +0100 74.2 53 416 191.54 10 231 182" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "higherofftake = ref.offtakevolume * 1.25\n", - "pfs_higherofftake = ref.set_offtakevolume(higherofftake)\n", - "cost_higherofftake = pfs_higherofftake.asfreq(\"MS\").pnl_cost\n", - "cost_higherofftake" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Comparing these two ``cost`` portfolio lines, we see that indeed the values for ``w`` and ``q`` have increased to 125% of the original values. Also, the procurement prices have increased. We can quickly calculate by how much:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2024-10-01 00:00:00+02:00 8.160879013401626\n", - "2024-11-01 00:00:00+01:00 8.599884206454362\n", - "Freq: MS, Name: p, dtype: pint[Eur/MWh]" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cost_higherofftake.p - cost_ref.p" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We could similarly create a portfolio states for situations with a market price drop of 40%. Or one which combines both effects:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "c:\\users\\ruud.wijtvliet\\ruud\\python\\dev\\portfolyo\\portfolyo\\core\\pfstate\\pfstate.py:199: UserWarning: This operation changes the unsourced volume. This causes inaccuracies in its price if the portfolio state has a frequency that is longer than the spot market.\n", - " warnings.warn(\n" - ] - } - ], - "source": [ - "lowerprices = ref.unsourcedprice * 0.6\n", - "pfs_lowerprices = ref.set_unsourcedprice(lowerprices)\n", - "pfs_lowerprices_higherofftake = ref.set_offtakevolume(higherofftake).set_unsourcedprice(lowerprices)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Hedging\n", - "\n", - "Hedging can reduce the sensitivity of our portfolio to changes in the market price. Given the current market price curve, we can calculate how much we'd need to source to obtain a fully hedged portfolio:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "needed = ref.hedge_of_unsourced(\"val\", \"MS\") # value hedge with month products" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's say we procure exactly that volume. We can add it to the sourced volume in our portfolio state:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "c:\\users\\ruud.wijtvliet\\ruud\\python\\dev\\portfolyo\\portfolyo\\core\\pfstate\\pfstate.py:209: UserWarning: This operation changes the unsourced volume. This causes inaccuracies in its price if the portfolio state has a frequency that is longer than the spot market.\n", - " warnings.warn(\n" - ] - } - ], - "source": [ - "hedged = ref.add_sourced(pf.PfLine({\"newvolume\": needed}))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "(We could have obtained the same result with the ``ref.source_unsourced()`` method.)\n", - "\n", - "The portfolio is now hedged at the month level. We can verify this by looking at the unsourced volume. In case of a volume hedge, the unsourced volume (``q`` and ``w``) is 0, even if its monetary value (``r``) is not; in case of a value hedge, it is the reverse:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "PfLine object with price and volume information.\n", - ". Start: 2024-10-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", - ". End : 2024-12-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", - ". Freq : (2 datapoints)\n", - " w q p r\n", - " MW MWh Eur/MWh Eur\n", - "\n", - "2024-10-01 00:00:00 +0200 -0.2 -173 0.00 -0\n", - "2024-11-01 00:00:00 +0100 -0.2 -134 0.00 -0" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "hedged.asfreq('MS').unsourced" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Because the market prices have not changed, the best-estimate procurement prices (at month level and longer) are also unchanged from before. (This is verified in the \"before\" columns of the dataframe further below.)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Market price change\n", - "\n", - "A hedged profile is less impacted by market price changes. To see that this is indeed the case, let's look at a scenario with an increase in the forward price curve by 40 Eur/MWh, for both portfolio states:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "newprices = prices + pf.Q_(40.0, 'Eur/MWh')\n", - "ref_higherprices = ref.set_unsourcedprice(newprices)\n", - "hedged_higherprices = hedged.set_unsourcedprice(newprices)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The reference portfolio has gotten a lot more expensive, whereas the procurement price for the hedged portfolio has not moved significantly:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
refhedged
beforeafterbeforeafter
unitEur/MWhEur/MWhEur/MWhEur/MWh
2024-10-01 00:00:00+02:00160.478106177.681366160.478106160.307936
2024-11-01 00:00:00+01:00182.939602205.480086182.939602182.814260
\n", - "
" - ], - "text/plain": [ - " ref hedged \n", - " before after before after\n", - "unit Eur/MWh Eur/MWh Eur/MWh Eur/MWh\n", - "2024-10-01 00:00:00+02:00 160.478106 177.681366 160.478106 160.307936\n", - "2024-11-01 00:00:00+01:00 182.939602 205.480086 182.939602 182.814260" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.DataFrame({\n", - " ('ref', 'before'): ref.pnl_cost.asfreq('MS').p, \n", - " ('ref', 'after'): ref_higherprices.pnl_cost.asfreq('MS').p, \n", - " ('hedged', 'before'): hedged.pnl_cost.asfreq('MS').p, \n", - " ('hedged', 'after'): hedged_higherprices.pnl_cost.asfreq('MS').p,\n", - "}).pint.dequantify()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For the observant reader: it may seem that the portfolio was not fully hedged after all, as a small change in the procurement price is seen. The reason is that each strategy (i.e., volume or value hedge) fully protects only against a specific price change (i.e., absolute or relative). A volume hedge does not *fully* hedge against an absolute price change such as the one we see here." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This tutorial is continued [in part 4](part4.ipynb)." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3.8.13 ('pf38')", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.13" - }, - "orig_nbformat": 4, - "vscode": { - "interpreter": { - "hash": "642a4be8010ca5d45039b988c1d8379a91572488c4d23a0b88e966c6713c7e45" - } - } + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Tutorial part 3\n", + "\n", + "In [part 1](part1.ipynb) and [part 2](part2.ipynb) we have learnt about portfolio lines. These are timeseries, or collections of timeseries, describing the volumes and/or prices during various delivery periods.\n", + "\n", + "In this part, we'll combine portfolio lines into a \"portfolio state\" (``PfState``) object. As we'll see, some of the methods and properties we know from the ``PfLine`` class also apply here.\n", + "\n", + "\n", + "## Example data\n", + "\n", + "Let's again use the mock functions to get some portfolio lines. (The parameter details here are not important, we just want some more-or-less realistic data). To change things up a bit from the previous tutorial parts, we'll look at about 80 days in the autumn of 2024, in quarterhourly (``\"15T\"``) resolution. And let's localize the data to a specific timezone:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import portfolyo as pf\n", + "import pandas as pd\n", + "\n", + "index = pd.date_range(\n", + " \"2024-09-20\", \"2024-12-10\", freq=\"15T\", inclusive=\"left\", tz=\"Europe/Berlin\"\n", + ")\n", + "# Creating offtake portfolio line.\n", + "ts_offtake = -1 * pf.dev.w_offtake(index, avg=50)\n", + "offtake = pf.PfLine({\"w\": ts_offtake})\n", + "# Creating portfolio line with market prices (here: price-forward curve).\n", + "ts_prices = pf.dev.p_marketprices(index, avg=200)\n", + "prices = pf.PfLine({\"p\": ts_prices})\n", + "\n", + "# Creating portfolio line with sourced volume.\n", + "ts_sourced_power1, ts_sourced_price1 = pf.dev.wp_sourced(\n", + " ts_offtake, \"QS\", 0.3, p_avg=120\n", + ")\n", + "sourced_quarters = pf.PfLine({\"w\": ts_sourced_power1, \"p\": ts_sourced_price1})\n", + "ts_sourced_power2, ts_sourced_price2 = pf.dev.wp_sourced(\n", + " ts_offtake, \"MS\", 0.2, p_avg=150\n", + ")\n", + "sourced_months = pf.PfLine({\"w\": ts_sourced_power2, \"p\": ts_sourced_price2})\n", + "sourced = pf.PfLine(\n", + " {\"quarter_products\": sourced_quarters, \"month_products\": sourced_months}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now use these portfolio lines to create a portfolio state.\n", + "\n", + "## Portfolio State\n", + "\n", + "The ``PfState`` class is used to hold information about offtake, market prices, and sourcing. Let's create one from the portfolio lines we just created:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PfState object.\n", + ". Start: 2024-09-20 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", + ". End : 2024-12-10 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", + ". Freq : <15 * Minutes> (7780 datapoints)\n", + " w q p r\n", + " MW MWh Eur/MWh Eur\n", + "──────── offtake\n", + " 2024-09-20 00:00:00 +0200 -45.8 -11 \n", + " 2024-09-20 00:15:00 +0200 -44.4 -11 \n", + " .. .. .. .. ..\n", + " 2024-12-09 23:30:00 +0100 -60.5 -15 \n", + " 2024-12-09 23:45:00 +0100 -58.3 -15 \n", + "─●────── pnl_cost\n", + " │ 2024-09-20 00:00:00 +0200 45.8 11 136.54 1 564\n", + " │ 2024-09-20 00:15:00 +0200 44.4 11 135.21 1 500\n", + " │ .. .. .. .. ..\n", + " │ 2024-12-09 23:30:00 +0100 60.5 15 167.89 2 540\n", + " │ 2024-12-09 23:45:00 +0100 58.3 15 167.21 2 436\n", + " ├●───── sourced\n", + " ││ 2024-09-20 00:00:00 +0200 31.3 8 135.03 1 058\n", + " ││ 2024-09-20 00:15:00 +0200 31.3 8 135.03 1 058\n", + " ││ .. .. .. .. ..\n", + " ││ 2024-12-09 23:30:00 +0100 35.7 9 126.09 1 124\n", + " ││ 2024-12-09 23:45:00 +0100 35.7 9 126.09 1 124\n", + " │├───── quarter_products\n", + " ││ 2024-09-20 00:00:00 +0200 16.4 4 102.48 421\n", + " ││ 2024-09-20 00:15:00 +0200 16.4 4 102.48 421\n", + " ││ .. .. .. .. ..\n", + " ││ 2024-12-09 23:30:00 +0100 13.4 3 111.14 372\n", + " ││ 2024-12-09 23:45:00 +0100 13.4 3 111.14 372\n", + " │└───── month_products\n", + " │ 2024-09-20 00:00:00 +0200 14.9 4 170.85 637\n", + " │ 2024-09-20 00:15:00 +0200 14.9 4 170.85 637\n", + " │ .. .. .. .. ..\n", + " │ 2024-12-09 23:30:00 +0100 22.3 6 135.07 752\n", + " │ 2024-12-09 23:45:00 +0100 22.3 6 135.07 752\n", + " └────── unsourced\n", + " 2024-09-20 00:00:00 +0200 14.5 4 139.81 506\n", + " 2024-09-20 00:15:00 +0200 13.0 3 135.64 442\n", + " .. .. .. .. ..\n", + " 2024-12-09 23:30:00 +0100 24.8 6 227.88 1 416\n", + " 2024-12-09 23:45:00 +0100 22.6 6 232.05 1 312" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pfs = pf.PfState(offtake, prices, sourced)\n", + "\n", + "pfs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note from how these portfolio lines were created, that ``offtake`` has negative values. The sign conventions are discussed [here](../core/pfstate.rst#sign-conventions).\n", + "\n", + "This portfolio state contains values for every quarterhour in the specified time period. Let's see what features this class has, starting with two methods we already met when discussing the ``PfLine`` class.\n", + "\n", + "### Plotting\n", + "\n", + "Just as when working with portfolio lines, we can get a quick overview of the portfolio state with the ``.plot()`` method..." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "pfs.plot();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "...and we can copy its data to the clipboard, or save it as an Excel workbook:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "pfs.to_clipboard()\n", + "pfs.to_excel(\"portfolio_state.xlsx\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Looking at the offtake, we can see the daily and weekly cycles, as well as a slow increase over the entire time period.\n", + "\n", + "This graph is a bit too detailed for most purposes, so let's look at the second method we know from ``PfLine``: resampling.\n", + "\n", + "### Resampling\n", + "\n", + "We might prefer to see hourly, daily, or monthly values instead of the quarterhourly values that are in ``pfs``. For this, we can resample the object with the ``.asfreq()`` method. In this code example, we also use the ``.print()`` method, which adds some helpful coloring to the output:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PfState object.\n", + ". Start: 2024-10-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", + ". End : 2024-12-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", + ". Freq : (2 datapoints)\n", + " w q p r\n", + " MW MWh Eur/MWh Eur\n", + "\u001b[1m\u001b[37m──────── offtake\n", + " \u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 -54.7 -40 744 \n", + " \u001b[1m\u001b[37m \u001b[0m2024-11-01 00:00:00 +0100 -59.4 -42 732 \n", + "\u001b[1m\u001b[37m─\u001b[1m\u001b[33m●\u001b[1m\u001b[37m────── pnl_cost\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 54.7 40 744 160.48 6 538 471\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-11-01 00:00:00 +0100 59.4 42 732 182.94 7 817 452\n", + " \u001b[1m\u001b[33m├\u001b[1m\u001b[36m●\u001b[1m\u001b[33m───── sourced\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│\u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 31.2 23 221 132.58 3 078 642\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│\u001b[1m\u001b[33m \u001b[0m2024-11-01 00:00:00 +0100 25.9 18 652 133.27 2 485 849\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m├───── quarter_products\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│ \u001b[1m\u001b[36m \u001b[0m2024-10-01 00:00:00 +0200 13.8 10 256 106.54 1 092 646\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│ \u001b[1m\u001b[36m \u001b[0m2024-11-01 00:00:00 +0100 13.7 9 897 106.78 1 056 810\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m└───── month_products\n", + " \u001b[1m\u001b[33m│ \u001b[1m\u001b[36m \u001b[0m2024-10-01 00:00:00 +0200 17.4 12 964 153.19 1 985 996\n", + " \u001b[1m\u001b[33m│ \u001b[1m\u001b[36m \u001b[0m2024-11-01 00:00:00 +0100 12.2 8 755 163.22 1 429 039\n", + " \u001b[1m\u001b[33m└────── unsourced\n", + " \u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 23.5 17 523 197.44 3 459 829\n", + " \u001b[1m\u001b[33m \u001b[0m2024-11-01 00:00:00 +0100 33.4 24 080 221.41 5 331 603\n" + ] + } + ], + "source": [ + "pfs_monthly = pfs.asfreq(\"MS\")\n", + "pfs_monthly.print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note how the resampled output only contains those months, that are *entirely* included in the original data. ``pfl`` has data in September and December, but as these are not present in their entirety, they are dropped from ``pfl_monthly``.\n", + "\n", + "### On frequencies and unsourced prices\n", + "\n", + "There is one other important consequence of resampling: the unsourced prices are now *specific for this portfolio*. We can demonstrate this by creating a second portfolio state, using the *same price-forward curve* (but different offtake and sourced volume):" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "pfs2 = pf.PfState(offtake * 1.5, prices, sourced * 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "At this shortest frequency, the unsourced prices are identical (namely, the price-forward curve). Let's create a dataframe with the prices to verify this:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pfspfs2hpfc
2024-09-20 00:00:00+02:00139.80568207211454139.80568207211454139.80568207211454
2024-09-20 00:15:00+02:00135.63901540544785135.63901540544785135.63901540544785
2024-09-20 00:30:00+02:00131.47234873878116131.47234873878116131.47234873878116
2024-09-20 00:45:00+02:00128.13901540544785128.13901540544785128.13901540544785
2024-09-20 01:00:00+02:00124.80568207211451124.80568207211451124.80568207211451
............
2024-12-09 22:45:00+01:00217.88078474854294217.88078474854294217.88078474854294
2024-12-09 23:00:00+01:00221.2141180818763221.2141180818763221.2141180818763
2024-12-09 23:15:00+01:00224.54745141520962224.54745141520962224.54745141520962
2024-12-09 23:30:00+01:00227.88078474854294227.88078474854294227.88078474854294
2024-12-09 23:45:00+01:00232.0474514152096232.0474514152096232.0474514152096
\n", + "

7780 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " pfs pfs2 \\\n", + "2024-09-20 00:00:00+02:00 139.80568207211454 139.80568207211454 \n", + "2024-09-20 00:15:00+02:00 135.63901540544785 135.63901540544785 \n", + "2024-09-20 00:30:00+02:00 131.47234873878116 131.47234873878116 \n", + "2024-09-20 00:45:00+02:00 128.13901540544785 128.13901540544785 \n", + "2024-09-20 01:00:00+02:00 124.80568207211451 124.80568207211451 \n", + "... ... ... \n", + "2024-12-09 22:45:00+01:00 217.88078474854294 217.88078474854294 \n", + "2024-12-09 23:00:00+01:00 221.2141180818763 221.2141180818763 \n", + "2024-12-09 23:15:00+01:00 224.54745141520962 224.54745141520962 \n", + "2024-12-09 23:30:00+01:00 227.88078474854294 227.88078474854294 \n", + "2024-12-09 23:45:00+01:00 232.0474514152096 232.0474514152096 \n", + "\n", + " hpfc \n", + "2024-09-20 00:00:00+02:00 139.80568207211454 \n", + "2024-09-20 00:15:00+02:00 135.63901540544785 \n", + "2024-09-20 00:30:00+02:00 131.47234873878116 \n", + "2024-09-20 00:45:00+02:00 128.13901540544785 \n", + "2024-09-20 01:00:00+02:00 124.80568207211451 \n", + "... ... \n", + "2024-12-09 22:45:00+01:00 217.88078474854294 \n", + "2024-12-09 23:00:00+01:00 221.2141180818763 \n", + "2024-12-09 23:15:00+01:00 224.54745141520962 \n", + "2024-12-09 23:30:00+01:00 227.88078474854294 \n", + "2024-12-09 23:45:00+01:00 232.0474514152096 \n", + "\n", + "[7780 rows x 3 columns]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.DataFrame(\n", + " {\"pfs\": pfs.unsourcedprice.p, \"pfs2\": pfs2.unsourcedprice.p, \"hpfc\": prices.p}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "However, at every other frequency, they are not equal. When changing the frequency, a *volume-weighted* average is calculated for the unsourced prices - just like with every other price-and-volume timeseries. This makes that the unsourced prices apply only to the unsourced volume profile *of that portfolio*:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pfspfs2hpfc
2024-10-01 00:00:00+02:00197.4437803760265192.11463549822653194.78888729464586
2024-11-01 00:00:00+01:00221.40989836363784217.79829542112196220.07479863376392
\n", + "
" + ], + "text/plain": [ + " pfs pfs2 \\\n", + "2024-10-01 00:00:00+02:00 197.4437803760265 192.11463549822653 \n", + "2024-11-01 00:00:00+01:00 221.40989836363784 217.79829542112196 \n", + "\n", + " hpfc \n", + "2024-10-01 00:00:00+02:00 194.78888729464586 \n", + "2024-11-01 00:00:00+01:00 220.07479863376392 " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.DataFrame(\n", + " {\n", + " \"pfs\": pfs.asfreq(\"MS\").unsourcedprice.p,\n", + " \"pfs2\": pfs2.asfreq(\"MS\").unsourcedprice.p,\n", + " \"hpfc\": prices.asfreq(\"MS\").p,\n", + " }\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This has important consequences. \n", + "\n", + "For example, when doing a scenario analysis in which the unsourced volume is changed (e.g. \"what happens if the offtake increases by 50%?\"), we cannot expect the results to be correct *unless we are working at the original frequency*. In situations where it is clear that this error looms, a ``UserWarning`` is shown to alert the user (e.g. in the examples further below). For more information on unsourced volume, [see this section](../core/pfstate.rst#Unsourced-price) in the documentation on the `PfState` class.\n", + "\n", + "For this reason, we commonly work with our porfolio states at the frequency of the price-forward curve. Downsampling is only done to see the aggregated values for verification or reporting." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Components\n", + "\n", + "Now, let's look at the portfolio state ``pfs_monthly`` in a bit more detail, to learn more about the ``PfState`` class.\n", + "\n", + "The portfolio state is presented to us as a tree structure, with several branches. Each branch is a portfolio line. E.g, ``offtake`` and ``sourced`` are the portfolio lines we specified when creating the object. Also, the branch ``pnl_cost`` is the sum of ``sourced`` and ``unsourced``, with ``sourced`` being the sum of ``quarter_products`` and ``month_products``. \n", + "\n", + "The unsourced volume is found by comparing the offtake to what is already sourced. This volume is valued at the market prices in the forward curve.\n", + "\n", + "These portfolio lines can be obtained from the portfolio state by accessing them as attributes. E.g. ``.offtakevolume``, ``.sourced``, ``.unsourced``, or ``.pnl_cost``. The latter is the best estimate for what it will cost to procure the offtake:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PfLine object with price and volume information.\n", + ". Start: 2024-10-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", + ". End : 2024-12-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", + ". Freq : (2 datapoints)\n", + ". Children: 'sourced' (price and volume), 'unsourced' (price and volume)\n", + " w q p r\n", + " MW MWh Eur/MWh Eur\n", + "\n", + "2024-10-01 00:00:00 +0200 54.7 40 744 160.48 6 538 471\n", + "2024-11-01 00:00:00 +0100 59.4 42 732 182.94 7 817 452" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pfs_monthly.pnl_cost" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notice that this portfolio line has children, and as a reminder, we can \"drill into\" the object to get these nested portfolio line, e.g. with ``pfl_monthly.pnl_cost[\"sourced\"]``.\n", + "\n", + "There are some other components that are not explicitly shown:\n", + "\n", + "* We may be interested in how much of the offtake has already been sourced or unsourced. These fractions are available at the ``.sourcedfraction`` and ``.unsourcedfraction`` properties.\n", + "\n", + "* You may have noticed that ``unsourced`` is the inverse from what traders would call the \"open positions\" or \"portfolio positions\": if our portfolio is short, the unsourced volume is positive. For those that prefer this other perspective, it is available at ``.netposition``.\n", + "\n", + "### Export\n", + "\n", + "Just as with portfolio lines, we can create an excel file that contains all the information in a portfolio state with its ``.to_excel()`` method, and we can copy it to the clipboard with the ``.to_clipboard()`` method.\n", + "\n", + "### MtM\n", + "\n", + "We can evaluate the value of our sourcing contracts against the current forward curve (\"mark-to-market\") with the ``.mtm_of_sourced()`` method." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Analyses with portfolio states\n", + "\n", + "We'll now look at how we can do \"what-if\" analyses with portfolio state. The original portfolio state we will consider as the reference and store it in an appropriately named variable:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "ref = pfs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The monthly procurement prices of this portfolio are what interest us the most. As a reminder, we can find the procurement volumes and costs with:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PfLine object with price and volume information.\n", + ". Start: 2024-10-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", + ". End : 2024-12-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", + ". Freq : (2 datapoints)\n", + ". Children: 'sourced' (price and volume), 'unsourced' (price and volume)\n", + " w q p r\n", + " MW MWh Eur/MWh Eur\n", + "\n", + "2024-10-01 00:00:00 +0200 54.7 40 744 160.48 6 538 471\n", + "2024-11-01 00:00:00 +0100 59.4 42 732 182.94 7 817 452" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cost_ref = ref.asfreq(\"MS\").pnl_cost\n", + "cost_ref" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "(Or we could go one step further and focus on only the prices with ``ref.asfreq(\"MS\").pnl_cost.p``.)\n", + "\n", + "### Change in offtake\n", + "\n", + "Now, what would happen if the offtake were to increase by 25%? Qualitatively, this is not hard. An increase in the offtake increases the unsourced volume. And because the market prices are higher than what we pay for the sourced volume, this means that the procurement price will go up. \n", + "\n", + "How much? Let's see. First, we create a new portfolio state, from the reference, by setting the offtake to the new value. We can do this with the ``.set_offtake()`` method. After that, we can again see what the procurement volumes and costs are. (Note the ``UserWarning`` which was mentioned [above](#on-frequencies-and-unsourced-pricesE).)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\users\\ruud.wijtvliet\\ruud\\python\\dev\\portfolyo\\portfolyo\\core\\pfstate\\pfstate.py:199: UserWarning: This operation changes the unsourced volume. This causes inaccuracies in its price if the portfolio state has a frequency that is longer than the spot market.\n", + " warnings.warn(\n" + ] }, - "nbformat": 4, - "nbformat_minor": 2 + { + "data": { + "text/plain": [ + "PfLine object with price and volume information.\n", + ". Start: 2024-10-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", + ". End : 2024-12-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", + ". Freq : (2 datapoints)\n", + ". Children: 'sourced' (price and volume), 'unsourced' (price and volume)\n", + " w q p r\n", + " MW MWh Eur/MWh Eur\n", + "\n", + "2024-10-01 00:00:00 +0200 68.4 50 930 168.64 8 588 719\n", + "2024-11-01 00:00:00 +0100 74.2 53 416 191.54 10 231 182" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "higherofftake = ref.offtakevolume * 1.25\n", + "pfs_higherofftake = ref.set_offtakevolume(higherofftake)\n", + "cost_higherofftake = pfs_higherofftake.asfreq(\"MS\").pnl_cost\n", + "cost_higherofftake" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Comparing these two ``cost`` portfolio lines, we see that indeed the values for ``w`` and ``q`` have increased to 125% of the original values. Also, the procurement prices have increased. We can quickly calculate by how much:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2024-10-01 00:00:00+02:00 8.160879013401626\n", + "2024-11-01 00:00:00+01:00 8.599884206454362\n", + "Freq: MS, Name: p, dtype: pint[Eur/MWh]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cost_higherofftake.p - cost_ref.p" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We could similarly create a portfolio states for situations with a market price drop of 40%. Or one which combines both effects:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\users\\ruud.wijtvliet\\ruud\\python\\dev\\portfolyo\\portfolyo\\core\\pfstate\\pfstate.py:199: UserWarning: This operation changes the unsourced volume. This causes inaccuracies in its price if the portfolio state has a frequency that is longer than the spot market.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "lowerprices = ref.unsourcedprice * 0.6\n", + "pfs_lowerprices = ref.set_unsourcedprice(lowerprices)\n", + "pfs_lowerprices_higherofftake = ref.set_offtakevolume(higherofftake).set_unsourcedprice(\n", + " lowerprices\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Hedging\n", + "\n", + "Hedging can reduce the sensitivity of our portfolio to changes in the market price. Given the current market price curve, we can calculate how much we'd need to source to obtain a fully hedged portfolio:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "needed = ref.hedge_of_unsourced(\"val\", \"MS\") # value hedge with month products" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's say we procure exactly that volume. We can add it to the sourced volume in our portfolio state:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\users\\ruud.wijtvliet\\ruud\\python\\dev\\portfolyo\\portfolyo\\core\\pfstate\\pfstate.py:209: UserWarning: This operation changes the unsourced volume. This causes inaccuracies in its price if the portfolio state has a frequency that is longer than the spot market.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "hedged = ref.add_sourced(pf.PfLine({\"newvolume\": needed}))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "(We could have obtained the same result with the ``ref.source_unsourced()`` method.)\n", + "\n", + "The portfolio is now hedged at the month level. We can verify this by looking at the unsourced volume. In case of a volume hedge, the unsourced volume (``q`` and ``w``) is 0, even if its monetary value (``r``) is not; in case of a value hedge, it is the reverse:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PfLine object with price and volume information.\n", + ". Start: 2024-10-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", + ". End : 2024-12-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", + ". Freq : (2 datapoints)\n", + " w q p r\n", + " MW MWh Eur/MWh Eur\n", + "\n", + "2024-10-01 00:00:00 +0200 -0.2 -173 0.00 -0\n", + "2024-11-01 00:00:00 +0100 -0.2 -134 0.00 -0" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hedged.asfreq(\"MS\").unsourced" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Because the market prices have not changed, the best-estimate procurement prices (at month level and longer) are also unchanged from before. (This is verified in the \"before\" columns of the dataframe further below.)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Market price change\n", + "\n", + "A hedged profile is less impacted by market price changes. To see that this is indeed the case, let's look at a scenario with an increase in the forward price curve by 40 Eur/MWh, for both portfolio states:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "newprices = prices + pf.Q_(40.0, \"Eur/MWh\")\n", + "ref_higherprices = ref.set_unsourcedprice(newprices)\n", + "hedged_higherprices = hedged.set_unsourcedprice(newprices)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The reference portfolio has gotten a lot more expensive, whereas the procurement price for the hedged portfolio has not moved significantly:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
refhedged
beforeafterbeforeafter
unitEur/MWhEur/MWhEur/MWhEur/MWh
2024-10-01 00:00:00+02:00160.478106177.681366160.478106160.307936
2024-11-01 00:00:00+01:00182.939602205.480086182.939602182.814260
\n", + "
" + ], + "text/plain": [ + " ref hedged \n", + " before after before after\n", + "unit Eur/MWh Eur/MWh Eur/MWh Eur/MWh\n", + "2024-10-01 00:00:00+02:00 160.478106 177.681366 160.478106 160.307936\n", + "2024-11-01 00:00:00+01:00 182.939602 205.480086 182.939602 182.814260" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.DataFrame(\n", + " {\n", + " (\"ref\", \"before\"): ref.pnl_cost.asfreq(\"MS\").p,\n", + " (\"ref\", \"after\"): ref_higherprices.pnl_cost.asfreq(\"MS\").p,\n", + " (\"hedged\", \"before\"): hedged.pnl_cost.asfreq(\"MS\").p,\n", + " (\"hedged\", \"after\"): hedged_higherprices.pnl_cost.asfreq(\"MS\").p,\n", + " }\n", + ").pint.dequantify()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For the observant reader: it may seem that the portfolio was not fully hedged after all, as a small change in the procurement price is seen. The reason is that each strategy (i.e., volume or value hedge) fully protects only against a specific price change (i.e., absolute or relative). A volume hedge does not *fully* hedge against an absolute price change such as the one we see here." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This tutorial is continued [in part 4](part4.ipynb)." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.8.13 ('pf38')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "642a4be8010ca5d45039b988c1d8379a91572488c4d23a0b88e966c6713c7e45" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 } diff --git a/docs/tutorial/part4.ipynb b/docs/tutorial/part4.ipynb index eee3669..0a323da 100644 --- a/docs/tutorial/part4.ipynb +++ b/docs/tutorial/part4.ipynb @@ -1,282 +1,282 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Tutorial part 4\n", - "\n", - "In [part 3](part3.ipynb) we have learnt about portfolio states and how to use them in scenario analyses. Here we learn how to export them and how to combine several ones.\n", - "\n", - "## Example data\n", - "\n", - "We start with a similar portfolio state as in the previous part:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PfState object.\n", - ". Start: 2024-09-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", - ". End : 2024-11-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", - ". Freq : (2 datapoints)\n", - " w q p r\n", - " MW MWh Eur/MWh Eur\n", - "\u001b[1m\u001b[37m──────── offtake\n", - " \u001b[1m\u001b[37m \u001b[0m2024-09-01 00:00:00 +0200 -49.4 -35 593 \n", - " \u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 -54.7 -40 748 \n", - "\u001b[1m\u001b[37m─\u001b[1m\u001b[33m●\u001b[1m\u001b[37m────── pnl_cost\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-09-01 00:00:00 +0200 49.4 35 593 147.61 5 253 964\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 54.7 40 748 163.85 6 676 561\n", - " \u001b[1m\u001b[33m├\u001b[1m\u001b[36m●\u001b[1m\u001b[33m───── sourced\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│\u001b[1m\u001b[33m \u001b[0m2024-09-01 00:00:00 +0200 28.9 20 844 123.03 2 564 413\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│\u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 26.0 19 389 132.10 2 561 236\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m├───── quarter_products\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│ \u001b[1m\u001b[36m \u001b[0m2024-09-01 00:00:00 +0200 13.8 9 943 103.24 1 026 519\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│ \u001b[1m\u001b[36m \u001b[0m2024-10-01 00:00:00 +0200 11.1 8 261 118.15 976 055\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m└───── month_products\n", - " \u001b[1m\u001b[33m│ \u001b[1m\u001b[36m \u001b[0m2024-09-01 00:00:00 +0200 15.1 10 901 141.07 1 537 894\n", - " \u001b[1m\u001b[33m│ \u001b[1m\u001b[36m \u001b[0m2024-10-01 00:00:00 +0200 14.9 11 128 142.45 1 585 180\n", - " \u001b[1m\u001b[33m└────── unsourced\n", - " \u001b[1m\u001b[33m \u001b[0m2024-09-01 00:00:00 +0200 20.5 14 749 182.36 2 689 551\n", - " \u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 28.7 21 358 192.68 4 115 325\n" - ] - } - ], - "source": [ - "import portfolyo as pf\n", - "import pandas as pd\n", - "\n", - "index = pd.date_range(\n", - " \"2024-09-01\", \"2024-11-01\", freq=\"15T\", inclusive=\"left\", tz=\"Europe/Berlin\"\n", - ")\n", - "# Creating portfolio line with market prices (here: price-forward curve).\n", - "ts_prices = pf.dev.p_marketprices(index, avg=200)\n", - "prices = pf.PfLine({\"p\": ts_prices})\n", - "\n", - "\n", - "# Creating offtake portfolio line.\n", - "ts_offtake = -1 * pf.dev.w_offtake(index, avg=50)\n", - "offtake = pf.PfLine({\"w\": ts_offtake})\n", - "\n", - "# Creating portfolio line with sourced volume.\n", - "ts_sourced_power1, ts_sourced_price1 = pf.dev.wp_sourced(\n", - " ts_offtake, \"QS\", 0.3, p_avg=120\n", - ")\n", - "sourced_quarters = pf.PfLine({\"w\": ts_sourced_power1, \"p\": ts_sourced_price1})\n", - "ts_sourced_power2, ts_sourced_price2 = pf.dev.wp_sourced(\n", - " ts_offtake, \"MS\", 0.2, p_avg=150\n", - ")\n", - "sourced_months = pf.PfLine({\"w\": ts_sourced_power2, \"p\": ts_sourced_price2})\n", - "sourced = pf.PfLine(\n", - " {\"quarter_products\": sourced_quarters, \"month_products\": sourced_months}\n", - ")\n", - "\n", - "# Create the portfolio state.\n", - "pfs1 = pf.PfState(offtake, prices, sourced).asfreq('MS')\n", - "\n", - "pfs1.print()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Arithmatic\n", - "\n", - "The final part about portfolio lines is the arithmatic that can be done with them.\n", - "\n", - "Let's create a second portfolio state:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PfState object.\n", - ". Start: 2024-09-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", - ". End : 2024-11-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", - ". Freq : (2 datapoints)\n", - " w q p r\n", - " MW MWh Eur/MWh Eur\n", - "\u001b[1m\u001b[37m──────── offtake\n", - " \u001b[1m\u001b[37m \u001b[0m2024-09-01 00:00:00 +0200 -98.9 -71 186 \n", - " \u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 -109.4 -81 495 \n", - "\u001b[1m\u001b[37m─\u001b[1m\u001b[33m●\u001b[1m\u001b[37m────── pnl_cost\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-09-01 00:00:00 +0200 98.9 71 186 118.77 8 454 414\n", - " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 109.4 81 495 131.98 10 755 857\n", - " \u001b[1m\u001b[33m├────── sourced\n", - " \u001b[1m\u001b[33m│ \u001b[1m\u001b[33m \u001b[0m2024-09-01 00:00:00 +0200 80.0 57 600 100.00 5 760 000\n", - " \u001b[1m\u001b[33m│ \u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 80.0 59 600 100.00 5 960 000\n", - " \u001b[1m\u001b[33m└────── unsourced\n", - " \u001b[1m\u001b[33m \u001b[0m2024-09-01 00:00:00 +0200 18.9 13 586 198.33 2 694 414\n", - " \u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 29.4 21 895 219.04 4 795 857\n" - ] - } - ], - "source": [ - "offtake2 = offtake * 2\n", - "sourced2 = pf.PfLine(pd.DataFrame({\"w\": 80, \"p\": 100}, index))\n", - "pfs2 = pf.PfState(offtake2, prices, sourced2).asfreq('MS')\n", - "pfs2.print()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that ``pfs1`` and ``pfs2`` have distinct unsourced prices at this month level, even though they were created using the same market prices on the quarter-hour level.\n", - "\n", - "### Addition and subtraction\n", - "\n", - "We can add these two portfolio states:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "c:\\users\\ruud.wijtvliet\\ruud\\python\\dev\\portfolyo\\portfolyo\\core\\pfline\\enable_arithmatic.py:82: PfLineFlattenedWarning: When adding a FlatPfLine and NestedPfLine, the NestedPfLine is flattened.\n", - " warnings.warn(\n" - ] - }, - { - "data": { - "text/plain": [ - "PfState object.\n", - ". Start: 2024-09-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", - ". End : 2024-11-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", - ". Freq : (2 datapoints)\n", - " w q p r\n", - " MW MWh Eur/MWh Eur\n", - "──────── offtake\n", - " 2024-09-01 00:00:00 +0200 -148.3 -106 778 \n", - " 2024-10-01 00:00:00 +0200 -164.1 -122 243 \n", - "─●────── pnl_cost\n", - " │ 2024-09-01 00:00:00 +0200 148.3 106 778 128.38 13 708 378\n", - " │ 2024-10-01 00:00:00 +0200 164.1 122 243 142.60 17 432 418\n", - " ├────── sourced\n", - " │ 2024-09-01 00:00:00 +0200 108.9 78 444 106.12 8 324 413\n", - " │ 2024-10-01 00:00:00 +0200 106.0 78 989 107.88 8 521 236\n", - " └────── unsourced\n", - " 2024-09-01 00:00:00 +0200 39.4 28 334 190.02 5 383 965\n", - " 2024-10-01 00:00:00 +0200 58.1 43 254 206.02 8 911 182" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pfs1 + pfs2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that the individual components are added together. The volumes (offtake, sourced, unsourced) are summed; the prices (sourced and unsourced) are the energy-weighted averaged. (Or, put differently, the *revenues* are also summed, and the prices are calculated from the volume-total and renevue-total.)\n", - "\n", - "Note also that the sourced volume of ``pfs1`` has been flattened, i.e., the values of its children are lost. This is because ``pfs2`` does not have any children. This behaviour is described [here](../core/pfline.rst#Arithmatic).\n", - "\n", - "Likewise we can subtract them with ``pfs1 - pfs2``:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "c:\\users\\ruud.wijtvliet\\ruud\\python\\dev\\portfolyo\\portfolyo\\core\\pfline\\enable_arithmatic.py:82: PfLineFlattenedWarning: When adding a FlatPfLine and NestedPfLine, the NestedPfLine is flattened.\n", - " warnings.warn(\n" - ] - }, - { - "data": { - "text/plain": [ - "PfState object.\n", - ". Start: 2024-09-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", - ". End : 2024-11-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", - ". Freq : (2 datapoints)\n", - " w q p r\n", - " MW MWh Eur/MWh Eur\n", - "──────── offtake\n", - " 2024-09-01 00:00:00 +0200 49.4 35 593 \n", - " 2024-10-01 00:00:00 +0200 54.7 40 748 \n", - "─●────── pnl_cost\n", - " │ 2024-09-01 00:00:00 +0200 -49.4 -35 593 89.92 -3 200 450\n", - " │ 2024-10-01 00:00:00 +0200 -54.7 -40 748 100.11 -4 079 296\n", - " ├────── sourced\n", - " │ 2024-09-01 00:00:00 +0200 -51.1 -36 756 86.94 -3 195 587\n", - " │ 2024-10-01 00:00:00 +0200 -54.0 -40 211 84.52 -3 398 764\n", - " └────── unsourced\n", - " 2024-09-01 00:00:00 +0200 1.6 1 163 -4.18 -4 863\n", - " 2024-10-01 00:00:00 +0200 -0.7 -537 1 267.81 -680 532" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pfs1 - pfs2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "That was it for this tutorial!" - ] - } + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Tutorial part 4\n", + "\n", + "In [part 3](part3.ipynb) we have learnt about portfolio states and how to use them in scenario analyses. Here we learn how to export them and how to combine several ones.\n", + "\n", + "## Example data\n", + "\n", + "We start with a similar portfolio state as in the previous part:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PfState object.\n", + ". Start: 2024-09-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", + ". End : 2024-11-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", + ". Freq : (2 datapoints)\n", + " w q p r\n", + " MW MWh Eur/MWh Eur\n", + "\u001b[1m\u001b[37m──────── offtake\n", + " \u001b[1m\u001b[37m \u001b[0m2024-09-01 00:00:00 +0200 -49.4 -35 593 \n", + " \u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 -54.7 -40 748 \n", + "\u001b[1m\u001b[37m─\u001b[1m\u001b[33m●\u001b[1m\u001b[37m────── pnl_cost\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-09-01 00:00:00 +0200 49.4 35 593 147.61 5 253 964\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 54.7 40 748 163.85 6 676 561\n", + " \u001b[1m\u001b[33m├\u001b[1m\u001b[36m●\u001b[1m\u001b[33m───── sourced\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│\u001b[1m\u001b[33m \u001b[0m2024-09-01 00:00:00 +0200 28.9 20 844 123.03 2 564 413\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│\u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 26.0 19 389 132.10 2 561 236\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m├───── quarter_products\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│ \u001b[1m\u001b[36m \u001b[0m2024-09-01 00:00:00 +0200 13.8 9 943 103.24 1 026 519\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m│ \u001b[1m\u001b[36m \u001b[0m2024-10-01 00:00:00 +0200 11.1 8 261 118.15 976 055\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[36m└───── month_products\n", + " \u001b[1m\u001b[33m│ \u001b[1m\u001b[36m \u001b[0m2024-09-01 00:00:00 +0200 15.1 10 901 141.07 1 537 894\n", + " \u001b[1m\u001b[33m│ \u001b[1m\u001b[36m \u001b[0m2024-10-01 00:00:00 +0200 14.9 11 128 142.45 1 585 180\n", + " \u001b[1m\u001b[33m└────── unsourced\n", + " \u001b[1m\u001b[33m \u001b[0m2024-09-01 00:00:00 +0200 20.5 14 749 182.36 2 689 551\n", + " \u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 28.7 21 358 192.68 4 115 325\n" + ] + } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3.8.13 ('pf38')", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.13" - }, - "orig_nbformat": 4, - "vscode": { - "interpreter": { - "hash": "642a4be8010ca5d45039b988c1d8379a91572488c4d23a0b88e966c6713c7e45" - } - } + "source": [ + "import portfolyo as pf\n", + "import pandas as pd\n", + "\n", + "index = pd.date_range(\n", + " \"2024-09-01\", \"2024-11-01\", freq=\"15T\", inclusive=\"left\", tz=\"Europe/Berlin\"\n", + ")\n", + "# Creating portfolio line with market prices (here: price-forward curve).\n", + "ts_prices = pf.dev.p_marketprices(index, avg=200)\n", + "prices = pf.PfLine({\"p\": ts_prices})\n", + "\n", + "\n", + "# Creating offtake portfolio line.\n", + "ts_offtake = -1 * pf.dev.w_offtake(index, avg=50)\n", + "offtake = pf.PfLine({\"w\": ts_offtake})\n", + "\n", + "# Creating portfolio line with sourced volume.\n", + "ts_sourced_power1, ts_sourced_price1 = pf.dev.wp_sourced(\n", + " ts_offtake, \"QS\", 0.3, p_avg=120\n", + ")\n", + "sourced_quarters = pf.PfLine({\"w\": ts_sourced_power1, \"p\": ts_sourced_price1})\n", + "ts_sourced_power2, ts_sourced_price2 = pf.dev.wp_sourced(\n", + " ts_offtake, \"MS\", 0.2, p_avg=150\n", + ")\n", + "sourced_months = pf.PfLine({\"w\": ts_sourced_power2, \"p\": ts_sourced_price2})\n", + "sourced = pf.PfLine(\n", + " {\"quarter_products\": sourced_quarters, \"month_products\": sourced_months}\n", + ")\n", + "\n", + "# Create the portfolio state.\n", + "pfs1 = pf.PfState(offtake, prices, sourced).asfreq(\"MS\")\n", + "\n", + "pfs1.print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Arithmatic\n", + "\n", + "The final part about portfolio lines is the arithmatic that can be done with them.\n", + "\n", + "Let's create a second portfolio state:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PfState object.\n", + ". Start: 2024-09-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", + ". End : 2024-11-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", + ". Freq : (2 datapoints)\n", + " w q p r\n", + " MW MWh Eur/MWh Eur\n", + "\u001b[1m\u001b[37m──────── offtake\n", + " \u001b[1m\u001b[37m \u001b[0m2024-09-01 00:00:00 +0200 -98.9 -71 186 \n", + " \u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 -109.4 -81 495 \n", + "\u001b[1m\u001b[37m─\u001b[1m\u001b[33m●\u001b[1m\u001b[37m────── pnl_cost\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-09-01 00:00:00 +0200 98.9 71 186 118.77 8 454 414\n", + " \u001b[1m\u001b[33m│\u001b[1m\u001b[37m \u001b[0m2024-10-01 00:00:00 +0200 109.4 81 495 131.98 10 755 857\n", + " \u001b[1m\u001b[33m├────── sourced\n", + " \u001b[1m\u001b[33m│ \u001b[1m\u001b[33m \u001b[0m2024-09-01 00:00:00 +0200 80.0 57 600 100.00 5 760 000\n", + " \u001b[1m\u001b[33m│ \u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 80.0 59 600 100.00 5 960 000\n", + " \u001b[1m\u001b[33m└────── unsourced\n", + " \u001b[1m\u001b[33m \u001b[0m2024-09-01 00:00:00 +0200 18.9 13 586 198.33 2 694 414\n", + " \u001b[1m\u001b[33m \u001b[0m2024-10-01 00:00:00 +0200 29.4 21 895 219.04 4 795 857\n" + ] + } + ], + "source": [ + "offtake2 = offtake * 2\n", + "sourced2 = pf.PfLine(pd.DataFrame({\"w\": 80, \"p\": 100}, index))\n", + "pfs2 = pf.PfState(offtake2, prices, sourced2).asfreq(\"MS\")\n", + "pfs2.print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that ``pfs1`` and ``pfs2`` have distinct unsourced prices at this month level, even though they were created using the same market prices on the quarter-hour level.\n", + "\n", + "### Addition and subtraction\n", + "\n", + "We can add these two portfolio states:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\users\\ruud.wijtvliet\\ruud\\python\\dev\\portfolyo\\portfolyo\\core\\pfline\\enable_arithmatic.py:82: PfLineFlattenedWarning: When adding a FlatPfLine and NestedPfLine, the NestedPfLine is flattened.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/plain": [ + "PfState object.\n", + ". Start: 2024-09-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", + ". End : 2024-11-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", + ". Freq : (2 datapoints)\n", + " w q p r\n", + " MW MWh Eur/MWh Eur\n", + "──────── offtake\n", + " 2024-09-01 00:00:00 +0200 -148.3 -106 778 \n", + " 2024-10-01 00:00:00 +0200 -164.1 -122 243 \n", + "─●────── pnl_cost\n", + " │ 2024-09-01 00:00:00 +0200 148.3 106 778 128.38 13 708 378\n", + " │ 2024-10-01 00:00:00 +0200 164.1 122 243 142.60 17 432 418\n", + " ├────── sourced\n", + " │ 2024-09-01 00:00:00 +0200 108.9 78 444 106.12 8 324 413\n", + " │ 2024-10-01 00:00:00 +0200 106.0 78 989 107.88 8 521 236\n", + " └────── unsourced\n", + " 2024-09-01 00:00:00 +0200 39.4 28 334 190.02 5 383 965\n", + " 2024-10-01 00:00:00 +0200 58.1 43 254 206.02 8 911 182" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pfs1 + pfs2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that the individual components are added together. The volumes (offtake, sourced, unsourced) are summed; the prices (sourced and unsourced) are the energy-weighted averaged. (Or, put differently, the *revenues* are also summed, and the prices are calculated from the volume-total and renevue-total.)\n", + "\n", + "Note also that the sourced volume of ``pfs1`` has been flattened, i.e., the values of its children are lost. This is because ``pfs2`` does not have any children. This behaviour is described [here](../core/pfline.rst#Arithmatic).\n", + "\n", + "Likewise we can subtract them with ``pfs1 - pfs2``:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\users\\ruud.wijtvliet\\ruud\\python\\dev\\portfolyo\\portfolyo\\core\\pfline\\enable_arithmatic.py:82: PfLineFlattenedWarning: When adding a FlatPfLine and NestedPfLine, the NestedPfLine is flattened.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/plain": [ + "PfState object.\n", + ". Start: 2024-09-01 00:00:00+02:00 (incl) . Timezone : Europe/Berlin \n", + ". End : 2024-11-01 00:00:00+01:00 (excl) . Start-of-day: 00:00:00 \n", + ". Freq : (2 datapoints)\n", + " w q p r\n", + " MW MWh Eur/MWh Eur\n", + "──────── offtake\n", + " 2024-09-01 00:00:00 +0200 49.4 35 593 \n", + " 2024-10-01 00:00:00 +0200 54.7 40 748 \n", + "─●────── pnl_cost\n", + " │ 2024-09-01 00:00:00 +0200 -49.4 -35 593 89.92 -3 200 450\n", + " │ 2024-10-01 00:00:00 +0200 -54.7 -40 748 100.11 -4 079 296\n", + " ├────── sourced\n", + " │ 2024-09-01 00:00:00 +0200 -51.1 -36 756 86.94 -3 195 587\n", + " │ 2024-10-01 00:00:00 +0200 -54.0 -40 211 84.52 -3 398 764\n", + " └────── unsourced\n", + " 2024-09-01 00:00:00 +0200 1.6 1 163 -4.18 -4 863\n", + " 2024-10-01 00:00:00 +0200 -0.7 -537 1 267.81 -680 532" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pfs1 - pfs2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That was it for this tutorial!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.8.13 ('pf38')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 }, - "nbformat": 4, - "nbformat_minor": 2 + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "642a4be8010ca5d45039b988c1d8379a91572488c4d23a0b88e966c6713c7e45" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 } \ No newline at end of file diff --git a/portfolyo/core/ndframelike.py b/portfolyo/core/ndframelike.py index 560a576..60f4aa0 100644 --- a/portfolyo/core/ndframelike.py +++ b/portfolyo/core/ndframelike.py @@ -42,6 +42,12 @@ def loc(self): a boolean array.)""" ... + @abc.abstractproperty + def slice(self): + """Create a new instance with a subset of the rows. + Different from loc since performs slicing with right-open interval.""" + ... + @abc.abstractmethod def dataframe( self, cols: Iterable[str] = None, has_units: bool = True, *args, **kwargs diff --git a/portfolyo/core/pfline/classes.py b/portfolyo/core/pfline/classes.py index 8c6dd0b..a2aa855 100644 --- a/portfolyo/core/pfline/classes.py +++ b/portfolyo/core/pfline/classes.py @@ -286,6 +286,7 @@ class FlatPfLine(PfLine): hedge_with = prices.Flat.hedge_with # map_to_year => on child classes loc = flat_methods.loc + slice = flat_methods.slice __getitem__ = flat_methods.__getitem__ # __bool__ => on child classes __eq__ = flat_methods.__eq__ @@ -300,6 +301,7 @@ class NestedPfLine(PfLine, children.ChildFunctionality): hedge_with = prices.Nested.hedge_with map_to_year = nested_methods.map_to_year loc = nested_methods.loc + slice = nested_methods.slice __bool__ = nested_methods.__bool__ __eq__ = nested_methods.__eq__ diff --git a/portfolyo/core/pfline/flat_methods.py b/portfolyo/core/pfline/flat_methods.py index 90a27e4..faae08f 100644 --- a/portfolyo/core/pfline/flat_methods.py +++ b/portfolyo/core/pfline/flat_methods.py @@ -3,6 +3,7 @@ from typing import TYPE_CHECKING, Any from ... import testing +import pandas as pd if TYPE_CHECKING: from .classes import FlatPfLine @@ -31,6 +32,11 @@ def loc(self: FlatPfLine) -> LocIndexer: return LocIndexer(self) +@property +def slice(self: FlatPfLine) -> SliceIndexer: + return SliceIndexer(self) + + class LocIndexer: """Helper class to obtain FlatPfLine instance, whose index is subset of original index.""" @@ -40,3 +46,21 @@ def __init__(self, pfl: FlatPfLine): def __getitem__(self, arg) -> FlatPfLine: newdf = self.pfl.df.loc[arg] return self.pfl.__class__(newdf) # use same (leaf) class + + +class SliceIndexer: + """Helper class to obtain FlatPfLine instance, whose index is subset of original index. + Exclude end point from the slice.""" + + def __init__(self, pfl: FlatPfLine): + self.pfl = pfl + + def __getitem__(self, arg) -> FlatPfLine: + mask = pd.Index([True] * len(self.pfl.df)) + if arg.start is not None: + mask &= self.pfl.index >= arg.start + if arg.stop is not None: + mask &= self.pfl.index < arg.stop + + newdf = self.pfl.df.loc[mask] + return self.pfl.__class__(newdf) # use same (leaf) class diff --git a/portfolyo/core/pfline/nested_methods.py b/portfolyo/core/pfline/nested_methods.py index dbe1c4b..33d37b1 100644 --- a/portfolyo/core/pfline/nested_methods.py +++ b/portfolyo/core/pfline/nested_methods.py @@ -37,6 +37,11 @@ def loc(self: NestedPfLine) -> LocIndexer: return LocIndexer(self) +@property +def slice(self: NestedPfLine) -> SliceIndexer: + return SliceIndexer(self) + + class LocIndexer: """Helper class to obtain NestedPfLine instance, whose index is subset of original index.""" @@ -46,3 +51,15 @@ def __init__(self, pfl: NestedPfLine): def __getitem__(self, arg) -> NestedPfLine: newchildren = {name: child.loc[arg] for name, child in self.pfl.items()} return self.pfl.__class__(newchildren) + + +class SliceIndexer: + """Helper class to obtain NestedPfLine instance, whose index is subset of original index. + Exclude end point from the slice.""" + + def __init__(self, pfl: NestedPfLine): + self.pfl = pfl + + def __getitem__(self, arg) -> NestedPfLine: + newchildren = {name: child.slice[arg] for name, child in self.pfl.items()} + return self.pfl.__class__(newchildren) diff --git a/portfolyo/core/pfstate/pfstate.py b/portfolyo/core/pfstate/pfstate.py index b90b79c..ed127a4 100644 --- a/portfolyo/core/pfstate/pfstate.py +++ b/portfolyo/core/pfstate/pfstate.py @@ -280,6 +280,10 @@ def __bool__(self): def loc(self) -> _LocIndexer: # from ABC return _LocIndexer(self) + @property + def slice(self) -> _SliceIndexer: # from ABC + return _SliceIndexer(self) + class _LocIndexer: """Helper class to obtain PfState instance, whose index is subset of original index.""" @@ -292,3 +296,17 @@ def __getitem__(self, arg) -> PfState: unsourcedprice = self.pfs.unsourcedprice.loc[arg] sourced = self.pfs.sourced.loc[arg] return PfState(offtakevolume, unsourcedprice, sourced) + + +class _SliceIndexer: + """Helper class to obtain PfState instance, whose index is subset of original index. + Exclude end index from the slice""" + + def __init__(self, pfs): + self.pfs = pfs + + def __getitem__(self, arg) -> PfState: + offtakevolume = self.pfs.offtake.volume.slice[arg] + unsourcedprice = self.pfs.unsourcedprice.slice[arg] + sourced = self.pfs.sourced.slice[arg] + return PfState(offtakevolume, unsourcedprice, sourced) diff --git a/pyproject.toml b/pyproject.toml index 974f208..d1ad723 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,6 +5,7 @@ description = "Analyse and manipulate timeseries related to power and gas offtak authors = [ "Ruud Wijtvliet ", "Sakshi Singh ", + "Alina Voilova ", ] license = "BSD-3" readme = "README.rst" diff --git a/test-output.xml b/test-output.xml new file mode 100644 index 0000000..5fc8557 --- /dev/null +++ b/test-output.xml @@ -0,0 +1 @@ +/Users/ruud.wijtvliet/python/lichtblyck/.venv/bin/pytest tests/tools/test_intersect.pytests/tools/test_intersect.py \ No newline at end of file diff --git a/tests/core/pfline/test_slice.py b/tests/core/pfline/test_slice.py new file mode 100644 index 0000000..b237542 --- /dev/null +++ b/tests/core/pfline/test_slice.py @@ -0,0 +1,107 @@ +"""Test if slice attributes works properly with portfolio line.""" + +import pytest +import pandas as pd +from portfolyo import dev + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize( + "slice_start", ["2021", "2022", "2022-01-02", "2022-05-23 14:34"] +) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +def test_flat_slice_start(slice_start: str, freq: str, tz: str): + index = pd.date_range("2020", "2024", freq=freq, inclusive="left", tz=tz) + pfl1 = dev.get_flatpfline(index) + assert pfl1.slice[slice_start:] == pfl1.loc[slice_start:] + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize( + "slice_end", + [ + # (, ) + ("2021", "2020"), + ("2022", "2021"), + ("2021-07", "2021-06"), + ("2022-01-02", "2022-01-01"), + ], +) +def test_flat_slice_end(slice_end: str, freq: str, tz: str): + index = pd.date_range("2020", "2024", freq=freq, inclusive="left", tz=tz) + pfl1 = dev.get_flatpfline(index) + assert pfl1.slice[: slice_end[0]] == pfl1.loc[: slice_end[1]] + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize( + "where", + ["2022", "2022-03", "2022-04-21", "2022-05-23 14:34"], +) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +def test_flat_slice_whole(where: str, freq: str, tz: str): + """Test that slicing splits the pfl in 2 non-overlapping pieces without gap + (i.e., ensure that each original timestamp is in exactly one of the resulting pieces.) + """ + index = pd.date_range("2020", "2024", freq=freq, inclusive="left", tz=tz) + pfl1 = dev.get_flatpfline(index) + left, right = pfl1.slice[:where], pfl1.slice[where:] + # Test that each timestamp is present at least once. + pd.testing.assert_index_equal(left.index.union(right.index), index) + # Test that no timestamp is present twice. + assert len(left.index.intersection(right.index)) == 0 + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize( + "slice_start", + [ + "2021", + "2022", + "2022-01-02", + "2022-01-02 14:30", + ], +) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +def test_nested_slice_start(slice_start: str, freq: str, tz: str): + index = pd.date_range("2020", "2024", freq=freq, inclusive="left", tz=tz) + pfl1 = dev.get_nestedpfline(index) + assert pfl1.slice[slice_start:] == pfl1.loc[slice_start:] + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize( + "slice_end", + [ + # (, ) + ("2021", "2020"), + ("2022", "2021"), + ("2021-07", "2021-06"), + ("2022-01-02", "2022-01-01"), + ], +) +def test_nested_slice_end(slice_end: str, freq: str, tz: str): + index = pd.date_range("2020", "2024", freq=freq, inclusive="left", tz=tz) + pfl1 = dev.get_nestedpfline(index) + assert pfl1.slice[: slice_end[0]] == pfl1.loc[: slice_end[1]] + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize( + "where", + ["2022", "2022-03", "2022-04-21", "2022-05-23 14:34"], +) +def test_nested_slice_whole(where: str, freq: str, tz: str): + """Test that slicing splits the pfl in 2 non-overlapping pieces without gap + (i.e., ensure that each original timestamp is in exactly one of the resulting pieces.) + """ + index = pd.date_range("2020", "2024", freq=freq, inclusive="left", tz=tz) + pfl1 = dev.get_nestedpfline(index) + left, right = pfl1.slice[:where], pfl1.slice[where:] + # Test that each timestamp is present at least once. + pd.testing.assert_index_equal(left.index.union(right.index), index) + # Test that no timestamp is present twice. + assert len(left.index.intersection(right.index)) == 0 diff --git a/tests/core/pfstate/test_slice_state.py b/tests/core/pfstate/test_slice_state.py new file mode 100644 index 0000000..39c9069 --- /dev/null +++ b/tests/core/pfstate/test_slice_state.py @@ -0,0 +1,76 @@ +"""Test if slice attributes works properly with portfolio state.""" + +import pytest +import pandas as pd +from portfolyo import dev + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize("slice_start", ["2021", "2022", "2022-01-02"]) +@pytest.mark.parametrize( + "slice_end", + [ + # (, ) + ("2021", "2020"), + ("2022", "2021"), + ("2022-01-02", "2022-01-01"), + ], +) +def test_slice_state(slice_start, slice_end, freq): + index = pd.date_range("2020", "2024", freq=freq) + pfs = dev.get_pfstate(index) + + pfs_to_concat = [pfs.slice[: slice_end[0]], pfs.slice[slice_start:]] + pfs_to_concat2 = [pfs.loc[: slice_end[1]], pfs.loc[slice_start:]] + assert pfs_to_concat == pfs_to_concat2 + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize( + "slice_start", + [ + "2021", + "2022", + "2022-01-02", + "2022-01-02 14:00", + ], +) +def test_state_slice_start(slice_start, freq): + index = pd.date_range("2020", "2024", freq=freq, inclusive="left") + pfs = dev.get_pfstate(index) + assert pfs.slice[slice_start:] == pfs.loc[slice_start:] + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize( + "slice_end", + [ + # (, ) + ("2021", "2020"), + ("2022", "2021"), + ("2021-07", "2021-06"), + ("2022-01-02", "2022-01-01"), + ], +) +def test_state_slice_end(slice_end, freq): + index = pd.date_range("2020", "2024", freq=freq, inclusive="left") + pfs = dev.get_pfstate(index) + assert pfs.slice[: slice_end[0]] == pfs.loc[: slice_end[1]] + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize( + "where", + ["2022", "2022-03", "2022-04-21", "2022-05-23 14:34"], +) +def test_state_slice_whole(where: str, freq: str): + """Test that slicing splits the pfl in 2 non-overlapping pieces without gap + (i.e., ensure that each original timestamp is in exactly one of the resulting pieces.) + """ + index = pd.date_range("2020", "2024", freq=freq, inclusive="left") + pfs = dev.get_pfstate(index) + left, right = pfs.slice[:where], pfs.slice[where:] + # Test that each timestamp is present at least once. + pd.testing.assert_index_equal(left.index.union(right.index), index) + # Test that no timestamp is present twice. + assert len(left.index.intersection(right.index)) == 0 From 47901d6d77cca1248238f1b7fc4c451d3583c2e6 Mon Sep 17 00:00:00 2001 From: Alina Voilova <91426818+Pizza2Pizza@users.noreply.github.com> Date: Mon, 8 Apr 2024 16:04:41 +0200 Subject: [PATCH 7/8] Standardise sod (#82) * refactoring and additional assertion on start-of-day * fixed test and assertion * fixed? * fixed some * not working * fixed some things * tests for slice * final test for slice for 15T * docs * try to fix docs * another try to fix * poetry shell * fixing 2.0 * fixing 2.1 * fixing 3.0 * fixing 4.0 * fixing 5.0 * fixing 6.0 * fixng 7.0 * fixng 8.0 * fixing 11 * fixing 12 * fixing 13 * fixng 14 * fixing 15 * fixing 16 * fixing 17 * deleted python 3.0 from tests * deleted hmtl folder * changed toml * updated lock file --------- Co-authored-by: rwijtvliet Co-authored-by: Alina Voilova --- .github/workflows/ci-on-pullreq.yaml | 2 +- .readthedocs.yml | 12 +- docs/savefig/fig_hedge.png | Bin 32520 -> 32613 bytes docs/savefig/fig_offtake.png | Bin 64560 -> 64383 bytes poetry.lock | 1679 ++++++++++--------- portfolyo/core/pfline/flat_methods.py | 15 + portfolyo/dev/develop.py | 36 +- portfolyo/tools/freq.py | 7 +- portfolyo/tools/standardize.py | 139 +- portfolyo/tools/startofday.py | 58 +- portfolyo/tools/trim.py | 2 +- pyproject.toml | 6 +- test-output.xml | 2 +- tests/core/pfline/test_flat.py | 9 +- tests/core/pfline/test_pfline_init.py | 30 + tests/core/pfline/test_slice.py | 117 +- tests/core/pfstate/test_pfstate_init.py | 21 +- tests/core/pfstate/test_slice_state.py | 109 +- tests/core/test-output.xml | 1961 +++++++++++++++++++++++ tests/dev/test_develop.py | 122 +- tests/tools/test_right.py | 75 +- tests/tools/test_standardize.py | 61 +- tests/tools/test_startofday.py | 416 ++++- 23 files changed, 3729 insertions(+), 1150 deletions(-) create mode 100644 tests/core/test-output.xml diff --git a/.github/workflows/ci-on-pullreq.yaml b/.github/workflows/ci-on-pullreq.yaml index 88659e8..3096bda 100644 --- a/.github/workflows/ci-on-pullreq.yaml +++ b/.github/workflows/ci-on-pullreq.yaml @@ -9,7 +9,7 @@ jobs: fail-fast: true matrix: os: ["ubuntu-latest", "macos-latest", "windows-latest"] - python-version: ["3.9", "3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12"] steps: - name: Checkout source diff --git a/.readthedocs.yml b/.readthedocs.yml index d4e0ea0..fa67133 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -5,16 +5,16 @@ build: tools: python: "3.10" jobs: - post_create_environment: - # Install poetry - # https://python-poetry.org/docs/#installing-manually + + post_install: - pip install poetry # Tell poetry to not use a virtual environment - - poetry config virtualenvs.create false - post_install: # Install dependencies with 'docs' dependency group # https://python-poetry.org/docs/managing-dependencies/#dependency-groups - - poetry install --with docs + - poetry export -f requirements.txt --without-hashes --without-urls --with docs -o requirements.txt + - pip install -r requirements.txt + #- pip list + sphinx: configuration: docs/conf.py diff --git a/docs/savefig/fig_hedge.png b/docs/savefig/fig_hedge.png index a487121b74282eeee336c33dbb7494db14f1bc4e..c898c477d788411da4e25d083a6e39c94ae702e1 100644 GIT binary patch literal 32613 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�*$ktTxQ^= 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

a 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 Vk=vL?7Y1JUm9_2`DL(t>zX3sh$}Io@ diff --git a/poetry.lock b/poetry.lock index 582f065..75f72d5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,25 +1,25 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. [[package]] name = "alabaster" -version = "0.7.13" -description = "A configurable sidebar-enabled Sphinx theme" +version = "0.7.16" +description = "A light, configurable Sphinx theme" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" files = [ - {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, - {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, + {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, + {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, ] [[package]] name = "appnope" -version = "0.1.3" +version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, ] [[package]] @@ -42,82 +42,87 @@ test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] [[package]] name = "attrs" -version = "23.1.0" +version = "23.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] +dev = ["attrs[tests]", "pre-commit"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "babel" -version = "2.13.1" +version = "2.14.0" description = "Internationalization utilities" optional = false python-versions = ">=3.7" files = [ - {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"}, - {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, + {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, + {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, ] -[package.dependencies] -setuptools = {version = "*", markers = "python_version >= \"3.12\""} - [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "beautifulsoup4" -version = "4.12.2" +version = "4.12.3" description = "Screen-scraping library" optional = false python-versions = ">=3.6.0" files = [ - {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, - {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, ] [package.dependencies] soupsieve = ">1.2" [package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] [[package]] name = "black" -version = "23.11.0" +version = "23.12.1" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-23.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dbea0bb8575c6b6303cc65017b46351dc5953eea5c0a59d7b7e3a2d2f433a911"}, - {file = "black-23.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:412f56bab20ac85927f3a959230331de5614aecda1ede14b373083f62ec24e6f"}, - {file = "black-23.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d136ef5b418c81660ad847efe0e55c58c8208b77a57a28a503a5f345ccf01394"}, - {file = "black-23.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:6c1cac07e64433f646a9a838cdc00c9768b3c362805afc3fce341af0e6a9ae9f"}, - {file = "black-23.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cf57719e581cfd48c4efe28543fea3d139c6b6f1238b3f0102a9c73992cbb479"}, - {file = "black-23.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:698c1e0d5c43354ec5d6f4d914d0d553a9ada56c85415700b81dc90125aac244"}, - {file = "black-23.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:760415ccc20f9e8747084169110ef75d545f3b0932ee21368f63ac0fee86b221"}, - {file = "black-23.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:58e5f4d08a205b11800332920e285bd25e1a75c54953e05502052738fe16b3b5"}, - {file = "black-23.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:45aa1d4675964946e53ab81aeec7a37613c1cb71647b5394779e6efb79d6d187"}, - {file = "black-23.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c44b7211a3a0570cc097e81135faa5f261264f4dfaa22bd5ee2875a4e773bd6"}, - {file = "black-23.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a9acad1451632021ee0d146c8765782a0c3846e0e0ea46659d7c4f89d9b212b"}, - {file = "black-23.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:fc7f6a44d52747e65a02558e1d807c82df1d66ffa80a601862040a43ec2e3142"}, - {file = "black-23.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7f622b6822f02bfaf2a5cd31fdb7cd86fcf33dab6ced5185c35f5db98260b055"}, - {file = "black-23.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:250d7e60f323fcfc8ea6c800d5eba12f7967400eb6c2d21ae85ad31c204fb1f4"}, - {file = "black-23.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5133f5507007ba08d8b7b263c7aa0f931af5ba88a29beacc4b2dc23fcefe9c06"}, - {file = "black-23.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:421f3e44aa67138ab1b9bfbc22ee3780b22fa5b291e4db8ab7eee95200726b07"}, - {file = "black-23.11.0-py3-none-any.whl", hash = "sha256:54caaa703227c6e0c87b76326d0862184729a69b73d3b7305b6288e1d830067e"}, - {file = "black-23.11.0.tar.gz", hash = "sha256:4c68855825ff432d197229846f971bc4d6666ce90492e5b02013bcaca4d9ab05"}, + {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"}, + {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"}, + {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"}, + {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"}, + {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"}, + {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"}, + {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"}, + {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"}, + {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"}, + {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"}, + {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"}, + {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"}, + {file = "black-23.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f"}, + {file = "black-23.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d"}, + {file = "black-23.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a"}, + {file = "black-23.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e"}, + {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"}, + {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"}, + {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"}, + {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"}, + {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"}, + {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"}, ] [package.dependencies] @@ -131,7 +136,7 @@ typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] +d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] @@ -155,13 +160,13 @@ css = ["tinycss2 (>=1.1.0,<1.3)"] [[package]] name = "certifi" -version = "2023.11.17" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, - {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] @@ -380,13 +385,13 @@ files = [ [[package]] name = "comm" -version = "0.2.0" +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.0-py3-none-any.whl", hash = "sha256:2da8d9ebb8dd7bfc247adaff99f24dce705638a8042b85cb995066793e391001"}, - {file = "comm-0.2.0.tar.gz", hash = "sha256:a517ea2ca28931c7007a7a99c562a0fa5883cfb48963140cf642c41c948498be"}, + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, ] [package.dependencies] @@ -397,126 +402,126 @@ test = ["pytest"] [[package]] name = "contourpy" -version = "1.2.0" +version = "1.2.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.9" files = [ - {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"}, - {file = "contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa"}, - {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9"}, - {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab"}, - {file = "contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488"}, - {file = "contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41"}, - {file = "contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727"}, - {file = "contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686"}, - {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286"}, - {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95"}, - {file = "contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6"}, - {file = "contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de"}, - {file = "contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0"}, - {file = "contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0"}, - {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0"}, - {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431"}, - {file = "contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f"}, - {file = "contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9"}, - {file = "contourpy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc"}, - {file = "contourpy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5"}, - {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e"}, - {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808"}, - {file = "contourpy-1.2.0-cp39-cp39-win32.whl", hash = "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4"}, - {file = "contourpy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956"}, - {file = "contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a"}, + {file = "contourpy-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040"}, + {file = "contourpy-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b"}, + {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd"}, + {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619"}, + {file = "contourpy-1.2.1-cp310-cp310-win32.whl", hash = "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8"}, + {file = "contourpy-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9"}, + {file = "contourpy-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5"}, + {file = "contourpy-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df"}, + {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205"}, + {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8"}, + {file = "contourpy-1.2.1-cp311-cp311-win32.whl", hash = "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec"}, + {file = "contourpy-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922"}, + {file = "contourpy-1.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc"}, + {file = "contourpy-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b"}, + {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce"}, + {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4"}, + {file = "contourpy-1.2.1-cp312-cp312-win32.whl", hash = "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f"}, + {file = "contourpy-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce"}, + {file = "contourpy-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b"}, + {file = "contourpy-1.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445"}, + {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02"}, + {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083"}, + {file = "contourpy-1.2.1-cp39-cp39-win32.whl", hash = "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba"}, + {file = "contourpy-1.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f"}, + {file = "contourpy-1.2.1.tar.gz", hash = "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c"}, ] [package.dependencies] -numpy = ">=1.20,<2.0" +numpy = ">=1.20" [package.extras] bokeh = ["bokeh", "selenium"] docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pillow"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.8.0)", "types-Pillow"] test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.3.2" +version = "7.4.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, - {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, - {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, - {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, - {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, - {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, - {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, - {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, - {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, - {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, - {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, - {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, - {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, - {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, + {file = "coverage-7.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2"}, + {file = "coverage-7.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c"}, + {file = "coverage-7.4.4-cp310-cp310-win32.whl", hash = "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d"}, + {file = "coverage-7.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b"}, + {file = "coverage-7.4.4-cp311-cp311-win32.whl", hash = "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286"}, + {file = "coverage-7.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9"}, + {file = "coverage-7.4.4-cp312-cp312-win32.whl", hash = "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0"}, + {file = "coverage-7.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c"}, + {file = "coverage-7.4.4-cp38-cp38-win32.whl", hash = "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e"}, + {file = "coverage-7.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade"}, + {file = "coverage-7.4.4-cp39-cp39-win32.whl", hash = "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57"}, + {file = "coverage-7.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c"}, + {file = "coverage-7.4.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677"}, + {file = "coverage-7.4.4.tar.gz", hash = "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49"}, ] [package.dependencies] @@ -542,29 +547,33 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "debugpy" -version = "1.8.0" +version = "1.8.1" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb"}, - {file = "debugpy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada"}, - {file = "debugpy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:a8b7a2fd27cd9f3553ac112f356ad4ca93338feadd8910277aff71ab24d8775f"}, - {file = "debugpy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5d9de202f5d42e62f932507ee8b21e30d49aae7e46d5b1dd5c908db1d7068637"}, - {file = "debugpy-1.8.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:ef54404365fae8d45cf450d0544ee40cefbcb9cb85ea7afe89a963c27028261e"}, - {file = "debugpy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60009b132c91951354f54363f8ebdf7457aeb150e84abba5ae251b8e9f29a8a6"}, - {file = "debugpy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:8cd0197141eb9e8a4566794550cfdcdb8b3db0818bdf8c49a8e8f8053e56e38b"}, - {file = "debugpy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:a64093656c4c64dc6a438e11d59369875d200bd5abb8f9b26c1f5f723622e153"}, - {file = "debugpy-1.8.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:b05a6b503ed520ad58c8dc682749113d2fd9f41ffd45daec16e558ca884008cd"}, - {file = "debugpy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c6fb41c98ec51dd010d7ed650accfd07a87fe5e93eca9d5f584d0578f28f35f"}, - {file = "debugpy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:46ab6780159eeabb43c1495d9c84cf85d62975e48b6ec21ee10c95767c0590aa"}, - {file = "debugpy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:bdc5ef99d14b9c0fcb35351b4fbfc06ac0ee576aeab6b2511702e5a648a2e595"}, - {file = "debugpy-1.8.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:61eab4a4c8b6125d41a34bad4e5fe3d2cc145caecd63c3fe953be4cc53e65bf8"}, - {file = "debugpy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:125b9a637e013f9faac0a3d6a82bd17c8b5d2c875fb6b7e2772c5aba6d082332"}, - {file = "debugpy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:57161629133113c97b387382045649a2b985a348f0c9366e22217c87b68b73c6"}, - {file = "debugpy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:e3412f9faa9ade82aa64a50b602544efcba848c91384e9f93497a458767e6926"}, - {file = "debugpy-1.8.0-py2.py3-none-any.whl", hash = "sha256:9c9b0ac1ce2a42888199df1a1906e45e6f3c9555497643a85e0bf2406e3ffbc4"}, - {file = "debugpy-1.8.0.zip", hash = "sha256:12af2c55b419521e33d5fb21bd022df0b5eb267c3e178f1d374a63a2a6bdccd0"}, + {file = "debugpy-1.8.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741"}, + {file = "debugpy-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e"}, + {file = "debugpy-1.8.1-cp310-cp310-win32.whl", hash = "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0"}, + {file = "debugpy-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd"}, + {file = "debugpy-1.8.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb"}, + {file = "debugpy-1.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099"}, + {file = "debugpy-1.8.1-cp311-cp311-win32.whl", hash = "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146"}, + {file = "debugpy-1.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8"}, + {file = "debugpy-1.8.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539"}, + {file = "debugpy-1.8.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace"}, + {file = "debugpy-1.8.1-cp312-cp312-win32.whl", hash = "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0"}, + {file = "debugpy-1.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98"}, + {file = "debugpy-1.8.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:7a3afa222f6fd3d9dfecd52729bc2e12c93e22a7491405a0ecbf9e1d32d45b39"}, + {file = "debugpy-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d915a18f0597ef685e88bb35e5d7ab968964b7befefe1aaea1eb5b2640b586c7"}, + {file = "debugpy-1.8.1-cp38-cp38-win32.whl", hash = "sha256:92116039b5500633cc8d44ecc187abe2dfa9b90f7a82bbf81d079fcdd506bae9"}, + {file = "debugpy-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:e38beb7992b5afd9d5244e96ad5fa9135e94993b0c551ceebf3fe1a5d9beb234"}, + {file = "debugpy-1.8.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42"}, + {file = "debugpy-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703"}, + {file = "debugpy-1.8.1-cp39-cp39-win32.whl", hash = "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23"}, + {file = "debugpy-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3"}, + {file = "debugpy-1.8.1-py2.py3-none-any.whl", hash = "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242"}, + {file = "debugpy-1.8.1.zip", hash = "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42"}, ] [[package]] @@ -591,13 +600,13 @@ files = [ [[package]] name = "distlib" -version = "0.3.7" +version = "0.3.8" description = "Distribution utilities" optional = false python-versions = "*" files = [ - {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, - {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, ] [[package]] @@ -652,13 +661,13 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "fastjsonschema" -version = "2.19.0" +version = "2.19.1" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" files = [ - {file = "fastjsonschema-2.19.0-py3-none-any.whl", hash = "sha256:b9fd1a2dd6971dbc7fee280a95bd199ae0dd9ce22beb91cc75e9c1c528a5170e"}, - {file = "fastjsonschema-2.19.0.tar.gz", hash = "sha256:e25df6647e1bc4a26070b700897b07b542ec898dd4f1f6ea013e7f6a88417225"}, + {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, + {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, ] [package.extras] @@ -666,18 +675,18 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "filelock" -version = "3.13.1" +version = "3.13.3" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, - {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, + {file = "filelock-3.13.3-py3-none-any.whl", hash = "sha256:5ffa845303983e7a0b7ae17636509bc97997d58afeafa72fb141a17b152284cb"}, + {file = "filelock-3.13.3.tar.gz", hash = "sha256:a79895a25bbefdf55d1a2a0a80968f7dbb28edcd6d4234a0afb3f37ecde4b546"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] typing = ["typing-extensions (>=4.8)"] [[package]] @@ -698,60 +707,60 @@ pyflakes = ">=3.1.0,<3.2.0" [[package]] name = "fonttools" -version = "4.45.0" +version = "4.51.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.45.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18138744540413eb2ebeff6ce8b9d617926f1ed08da5d1676f99f1966988264e"}, - {file = "fonttools-4.45.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b3d240933045b9dbbe6e8c1e28ffe89be72c9be927b6e572e55be5e2b2604f7"}, - {file = "fonttools-4.45.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5853263505f407b69c0d1cbf3ed1c30f985b9505523989b20aa18a5231d4a08a"}, - {file = "fonttools-4.45.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c21f306f1e71146cf7587916d6de5e9c4bf26057aad602a6c7fad4b6e05bf1f"}, - {file = "fonttools-4.45.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1bb4f01018b9f4e2d7b07c2bf79e2ef498acb6f99321b72b5c44b1333481f569"}, - {file = "fonttools-4.45.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d0e6603c3b00604574d84fabbcf9dee81efa7c89d38ed4dcbf4e6c654e1ebb99"}, - {file = "fonttools-4.45.0-cp310-cp310-win32.whl", hash = "sha256:c3e676e50a0713c9a1e46185b806967d3c012643d1936ca814eb9ab62027c090"}, - {file = "fonttools-4.45.0-cp310-cp310-win_amd64.whl", hash = "sha256:e819f14d315024750b1ad2842da605051444b944cd983ea987359ace5213bcb9"}, - {file = "fonttools-4.45.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a6d68b97b967a3361e0ddf14425e4fe030c9f19462b445ce0b190c4a6834eb46"}, - {file = "fonttools-4.45.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:619227c7b9088add4d4e5959bf0fa3c29a71c191baa8b989bf532645876b2168"}, - {file = "fonttools-4.45.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cafe001811ad1ac2a5d357fc99c490357d758569f69511d14da0311c02814e15"}, - {file = "fonttools-4.45.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:756c6f4324fd4bb4d7517462d7237ff65e45da7a002f9e6e08a48c25a11bf073"}, - {file = "fonttools-4.45.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ecc97628be1bf7fa93463e1e791915da66de51df8e655a5a6c846fd9b8ceaa98"}, - {file = "fonttools-4.45.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:636177ffc4479bc824a356c00a3c9a74a2ce591fa6057109321e0a0ffd126e40"}, - {file = "fonttools-4.45.0-cp311-cp311-win32.whl", hash = "sha256:cac462dbd9058778c89bc608ac29ba93ab3fbc37f305d260aa2d771cfb0fa694"}, - {file = "fonttools-4.45.0-cp311-cp311-win_amd64.whl", hash = "sha256:2bd3f33a5d5630cc20cf3f8631074cac6eafdb2aa3ac8745966c3b4bf93656b4"}, - {file = "fonttools-4.45.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5b3da7791a58c97763d1704c2b76a9d654b8f2ef233e64248960bd2c6e669fe4"}, - {file = "fonttools-4.45.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4fbc3d8acb578ba0932fcabc01a962f23b0dd254ab103dd0606128fff0175095"}, - {file = "fonttools-4.45.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f69e07ebfd89d96485349dc10bd81a027fc0e927f988fa31bd9cd06359e06ed"}, - {file = "fonttools-4.45.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b122fe802839bfc8f9603233e5fcbdc98b5e27876f7945b426adfea983918a7b"}, - {file = "fonttools-4.45.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8f8736e885700ae22970519b8f5c7f4c2f29c6e9459d05c649c4e99012c20b23"}, - {file = "fonttools-4.45.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:70f047ba37c6aac3d331b71bb784373e251bd86678da72526edc8585e79418e1"}, - {file = "fonttools-4.45.0-cp312-cp312-win32.whl", hash = "sha256:fdb43f68bce545f494fed1bfb60d2c32b53f410758919112923c2d600cb9a24c"}, - {file = "fonttools-4.45.0-cp312-cp312-win_amd64.whl", hash = "sha256:102a7ca8700a078265c002c29d2ae498edeb14b636375ceec2425b561ce08037"}, - {file = "fonttools-4.45.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4b154cbf93515e4eb477f5cf99de79b46c17229781f321907940bdbabbd64708"}, - {file = "fonttools-4.45.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f546a1b676622638a12c721d89cfb513ad7189548eadac885cdd555e35021557"}, - {file = "fonttools-4.45.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c5a0612049e0d06b467c3a0837d9efe37934acab64ba922f00e1d07c1555a7"}, - {file = "fonttools-4.45.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f27166d00e0cd3ea49461b053f55e75676f1109e5483170a14d70c397d082a4c"}, - {file = "fonttools-4.45.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:980ba4e673439db22a00501fac087957ce0731351b042816f6c02df81cadc612"}, - {file = "fonttools-4.45.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:83b70b99f3f55b046cb51ca20fc15702567710233b2cd757a79e1916c25a25f8"}, - {file = "fonttools-4.45.0-cp38-cp38-win32.whl", hash = "sha256:fe8ad943f62bf16273154ebcdf855c44a3b46eac36abea338c209209439b4eb6"}, - {file = "fonttools-4.45.0-cp38-cp38-win_amd64.whl", hash = "sha256:6fb1fdcee2b36e012283805ef0380e4508dbb504950b1c94d0343f8dbbad7d7e"}, - {file = "fonttools-4.45.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5bbcb75ffcea64543ab8203e132e2019b226f59a4a6958637e78c21f9ca560ff"}, - {file = "fonttools-4.45.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ade07953b35ebf66c445a5e02f28ecd038ea588dc7673c555afe319b6e3c5168"}, - {file = "fonttools-4.45.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54ac8be3f693062fc08550213edd40db8f4fe1dd095a1246ed18e887fc254d76"}, - {file = "fonttools-4.45.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc991712aaea9d545b13ec480aaf2ebd12ccdea180fce864dd9863f5134f5a06"}, - {file = "fonttools-4.45.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:420139743e21d832de230757fb7b0c285d8024d602af8064d9506fa055bb62ae"}, - {file = "fonttools-4.45.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:58da830a52c05f18a7cc8a279a8bdddf2e45cdc685b360699653fb3405557459"}, - {file = "fonttools-4.45.0-cp39-cp39-win32.whl", hash = "sha256:715e18f67f0587a16476c7f62b8ff9a165ddceb8c2a262fb08df9f71c7790f0e"}, - {file = "fonttools-4.45.0-cp39-cp39-win_amd64.whl", hash = "sha256:dd26fda8c879558216458a801c1dba52f35dca0e96640fd9c75e86b6574cf1c3"}, - {file = "fonttools-4.45.0-py3-none-any.whl", hash = "sha256:835cf5d0e1b37bbed1d64c286611cc4da9ff19df952400f191ba9142b3cb97f6"}, - {file = "fonttools-4.45.0.tar.gz", hash = "sha256:c1c79d7d4093396892575115c214b24f09e68997cb5c0ab2d99bfdaff74c64b6"}, + {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:84d7751f4468dd8cdd03ddada18b8b0857a5beec80bce9f435742abc9a851a74"}, + {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8b4850fa2ef2cfbc1d1f689bc159ef0f45d8d83298c1425838095bf53ef46308"}, + {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5b48a1121117047d82695d276c2af2ee3a24ffe0f502ed581acc2673ecf1037"}, + {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:180194c7fe60c989bb627d7ed5011f2bef1c4d36ecf3ec64daec8302f1ae0716"}, + {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:96a48e137c36be55e68845fc4284533bda2980f8d6f835e26bca79d7e2006438"}, + {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:806e7912c32a657fa39d2d6eb1d3012d35f841387c8fc6cf349ed70b7c340039"}, + {file = "fonttools-4.51.0-cp310-cp310-win32.whl", hash = "sha256:32b17504696f605e9e960647c5f64b35704782a502cc26a37b800b4d69ff3c77"}, + {file = "fonttools-4.51.0-cp310-cp310-win_amd64.whl", hash = "sha256:c7e91abdfae1b5c9e3a543f48ce96013f9a08c6c9668f1e6be0beabf0a569c1b"}, + {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a8feca65bab31479d795b0d16c9a9852902e3a3c0630678efb0b2b7941ea9c74"}, + {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ac27f436e8af7779f0bb4d5425aa3535270494d3bc5459ed27de3f03151e4c2"}, + {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e19bd9e9964a09cd2433a4b100ca7f34e34731e0758e13ba9a1ed6e5468cc0f"}, + {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2b92381f37b39ba2fc98c3a45a9d6383bfc9916a87d66ccb6553f7bdd129097"}, + {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5f6bc991d1610f5c3bbe997b0233cbc234b8e82fa99fc0b2932dc1ca5e5afec0"}, + {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9696fe9f3f0c32e9a321d5268208a7cc9205a52f99b89479d1b035ed54c923f1"}, + {file = "fonttools-4.51.0-cp311-cp311-win32.whl", hash = "sha256:3bee3f3bd9fa1d5ee616ccfd13b27ca605c2b4270e45715bd2883e9504735034"}, + {file = "fonttools-4.51.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f08c901d3866a8905363619e3741c33f0a83a680d92a9f0e575985c2634fcc1"}, + {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4060acc2bfa2d8e98117828a238889f13b6f69d59f4f2d5857eece5277b829ba"}, + {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1250e818b5f8a679ad79660855528120a8f0288f8f30ec88b83db51515411fcc"}, + {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76f1777d8b3386479ffb4a282e74318e730014d86ce60f016908d9801af9ca2a"}, + {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b5ad456813d93b9c4b7ee55302208db2b45324315129d85275c01f5cb7e61a2"}, + {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:68b3fb7775a923be73e739f92f7e8a72725fd333eab24834041365d2278c3671"}, + {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8e2f1a4499e3b5ee82c19b5ee57f0294673125c65b0a1ff3764ea1f9db2f9ef5"}, + {file = "fonttools-4.51.0-cp312-cp312-win32.whl", hash = "sha256:278e50f6b003c6aed19bae2242b364e575bcb16304b53f2b64f6551b9c000e15"}, + {file = "fonttools-4.51.0-cp312-cp312-win_amd64.whl", hash = "sha256:b3c61423f22165541b9403ee39874dcae84cd57a9078b82e1dce8cb06b07fa2e"}, + {file = "fonttools-4.51.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1621ee57da887c17312acc4b0e7ac30d3a4fb0fec6174b2e3754a74c26bbed1e"}, + {file = "fonttools-4.51.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d9298be7a05bb4801f558522adbe2feea1b0b103d5294ebf24a92dd49b78e5"}, + {file = "fonttools-4.51.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee1af4be1c5afe4c96ca23badd368d8dc75f611887fb0c0dac9f71ee5d6f110e"}, + {file = "fonttools-4.51.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c18b49adc721a7d0b8dfe7c3130c89b8704baf599fb396396d07d4aa69b824a1"}, + {file = "fonttools-4.51.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de7c29bdbdd35811f14493ffd2534b88f0ce1b9065316433b22d63ca1cd21f14"}, + {file = "fonttools-4.51.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cadf4e12a608ef1d13e039864f484c8a968840afa0258b0b843a0556497ea9ed"}, + {file = "fonttools-4.51.0-cp38-cp38-win32.whl", hash = "sha256:aefa011207ed36cd280babfaa8510b8176f1a77261833e895a9d96e57e44802f"}, + {file = "fonttools-4.51.0-cp38-cp38-win_amd64.whl", hash = "sha256:865a58b6e60b0938874af0968cd0553bcd88e0b2cb6e588727117bd099eef836"}, + {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:60a3409c9112aec02d5fb546f557bca6efa773dcb32ac147c6baf5f742e6258b"}, + {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7e89853d8bea103c8e3514b9f9dc86b5b4120afb4583b57eb10dfa5afbe0936"}, + {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56fc244f2585d6c00b9bcc59e6593e646cf095a96fe68d62cd4da53dd1287b55"}, + {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d145976194a5242fdd22df18a1b451481a88071feadf251221af110ca8f00ce"}, + {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5b8cab0c137ca229433570151b5c1fc6af212680b58b15abd797dcdd9dd5051"}, + {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:54dcf21a2f2d06ded676e3c3f9f74b2bafded3a8ff12f0983160b13e9f2fb4a7"}, + {file = "fonttools-4.51.0-cp39-cp39-win32.whl", hash = "sha256:0118ef998a0699a96c7b28457f15546815015a2710a1b23a7bf6c1be60c01636"}, + {file = "fonttools-4.51.0-cp39-cp39-win_amd64.whl", hash = "sha256:599bdb75e220241cedc6faebfafedd7670335d2e29620d207dd0378a4e9ccc5a"}, + {file = "fonttools-4.51.0-py3-none-any.whl", hash = "sha256:15c94eeef6b095831067f72c825eb0e2d48bb4cea0647c1b05c981ecba2bf39f"}, + {file = "fonttools-4.51.0.tar.gz", hash = "sha256:dc0673361331566d7a663d7ce0f6fdcbfbdc1f59c6e3ed1165ad7202ca183c68"}, ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "scipy"] -lxml = ["lxml (>=4.0,<5)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] @@ -777,13 +786,13 @@ python-dateutil = "*" [[package]] name = "identify" -version = "2.5.32" +version = "2.5.35" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.32-py2.py3-none-any.whl", hash = "sha256:0b7656ef6cba81664b783352c73f8c24b39cf82f926f78f4550eda928e5e0545"}, - {file = "identify-2.5.32.tar.gz", hash = "sha256:5d9979348ec1a21c768ae07e0a652924538e8bce67313a73cb0f681cf08ba407"}, + {file = "identify-2.5.35-py2.py3-none-any.whl", hash = "sha256:c4de0081837b211594f8e877a6b4fad7ca32bbfc1a9307fdd61c28bfe923f13e"}, + {file = "identify-2.5.35.tar.gz", hash = "sha256:10a7ca245cfcd756a554a7288159f72ff105ad233c7c4b9c6f0f4d108f5f6791"}, ] [package.extras] @@ -791,13 +800,13 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.4" +version = "3.6" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, ] [[package]] @@ -830,24 +839,6 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker perf = ["ipython"] testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] -[[package]] -name = "importlib-resources" -version = "6.1.1" -description = "Read resources from Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, - {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, -] - -[package.dependencies] -zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} - -[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 = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] - [[package]] name = "iniconfig" version = "2.0.0" @@ -872,13 +863,13 @@ files = [ [[package]] name = "ipykernel" -version = "6.26.0" +version = "6.29.4" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.26.0-py3-none-any.whl", hash = "sha256:3ba3dc97424b87b31bb46586b5167b3161b32d7820b9201a9e698c71e271602c"}, - {file = "ipykernel-6.26.0.tar.gz", hash = "sha256:553856658eb8430bbe9653ea041a41bff63e9606fc4628873fc92a6cf3abd404"}, + {file = "ipykernel-6.29.4-py3-none-any.whl", hash = "sha256:1181e653d95c6808039c509ef8e67c4126b3b3af7781496c7cbfb5ed938a27da"}, + {file = "ipykernel-6.29.4.tar.gz", hash = "sha256:3d44070060f9475ac2092b760123fadf105d2e2493c24848b6691a7c4f42af5c"}, ] [package.dependencies] @@ -892,7 +883,7 @@ matplotlib-inline = ">=0.1" nest-asyncio = "*" packaging = "*" psutil = "*" -pyzmq = ">=20" +pyzmq = ">=24" tornado = ">=6.1" traitlets = ">=5.4.0" @@ -901,45 +892,45 @@ cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] pyqt5 = ["pyqt5"] pyside6 = ["pyside6"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] [[package]] name = "ipython" -version = "8.17.2" +version = "8.23.0" description = "IPython: Productive Interactive Computing" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "ipython-8.17.2-py3-none-any.whl", hash = "sha256:1e4d1d666a023e3c93585ba0d8e962867f7a111af322efff6b9c58062b3e5444"}, - {file = "ipython-8.17.2.tar.gz", hash = "sha256:126bb57e1895594bb0d91ea3090bbd39384f6fe87c3d57fd558d0670f50339bb"}, + {file = "ipython-8.23.0-py3-none-any.whl", hash = "sha256:07232af52a5ba146dc3372c7bf52a0f890a23edf38d77caef8d53f9cdc2584c1"}, + {file = "ipython-8.23.0.tar.gz", hash = "sha256:7468edaf4f6de3e1b912e57f66c241e6fd3c7099f2ec2136e239e142e800274d"}, ] [package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt-toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack-data = "*" -traitlets = ">=5" -typing-extensions = {version = "*", markers = "python_version < \"3.10\""} +traitlets = ">=5.13.0" +typing-extensions = {version = "*", markers = "python_version < \"3.12\""} [package.extras] -all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] black = ["black"] -doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "stack-data", "typing-extensions"] kernel = ["ipykernel"] +matplotlib = ["matplotlib"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] +test = ["pickleshare", "pytest (<8)", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] [[package]] name = "jedi" @@ -962,13 +953,13 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.3" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, ] [package.dependencies] @@ -979,13 +970,13 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jsonschema" -version = "4.20.0" +version = "4.21.1" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.20.0-py3-none-any.whl", hash = "sha256:ed6231f0429ecf966f5bc8dfef245998220549cbbcf140f913b7464c52c3b6b3"}, - {file = "jsonschema-4.20.0.tar.gz", hash = "sha256:4f614fd46d8d61258610998997743ec5492a648b33cf478c1ddc23ed4598a5fa"}, + {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, + {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, ] [package.dependencies] @@ -1000,13 +991,13 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "jsonschema-specifications" -version = "2023.11.1" +version = "2023.12.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema_specifications-2023.11.1-py3-none-any.whl", hash = "sha256:f596778ab612b3fd29f72ea0d990393d0540a5aab18bf0407a46632eab540779"}, - {file = "jsonschema_specifications-2023.11.1.tar.gz", hash = "sha256:c9b234904ffe02f079bf91b14d79987faa685fd4b39c377a0996954c0090b9ca"}, + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, ] [package.dependencies] @@ -1014,17 +1005,16 @@ 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] -importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" @@ -1037,13 +1027,13 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt [[package]] name = "jupyter-core" -version = "5.5.0" +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.5.0-py3-none-any.whl", hash = "sha256:e11e02cd8ae0a9de5c6c44abf5727df9f2581055afe00b22183f621ba3585805"}, - {file = "jupyter_core-5.5.0.tar.gz", hash = "sha256:880b86053bf298a8724994f95e99b99130659022a4f7f45f563084b6223861d3"}, + {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] @@ -1053,17 +1043,17 @@ 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" -version = "0.2.2" +version = "0.3.0" description = "Pygments theme using JupyterLab CSS variables" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jupyterlab_pygments-0.2.2-py2.py3-none-any.whl", hash = "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f"}, - {file = "jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"}, + {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, + {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, ] [[package]] @@ -1196,117 +1186,116 @@ tornado = {version = "*", markers = "python_version > \"2.7\""} [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] name = "matplotlib" -version = "3.8.2" +version = "3.8.4" description = "Python plotting package" optional = false python-versions = ">=3.9" files = [ - {file = "matplotlib-3.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7"}, - {file = "matplotlib-3.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367"}, - {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18"}, - {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31"}, - {file = "matplotlib-3.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a"}, - {file = "matplotlib-3.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a"}, - {file = "matplotlib-3.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63"}, - {file = "matplotlib-3.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8"}, - {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6"}, - {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788"}, - {file = "matplotlib-3.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0"}, - {file = "matplotlib-3.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717"}, - {file = "matplotlib-3.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627"}, - {file = "matplotlib-3.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4"}, - {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d"}, - {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331"}, - {file = "matplotlib-3.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213"}, - {file = "matplotlib-3.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630"}, - {file = "matplotlib-3.8.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:deaed9ad4da0b1aea77fe0aa0cebb9ef611c70b3177be936a95e5d01fa05094f"}, - {file = "matplotlib-3.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:172f4d0fbac3383d39164c6caafd3255ce6fa58f08fc392513a0b1d3b89c4f89"}, - {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7d36c2209d9136cd8e02fab1c0ddc185ce79bc914c45054a9f514e44c787917"}, - {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5864bdd7da445e4e5e011b199bb67168cdad10b501750367c496420f2ad00843"}, - {file = "matplotlib-3.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ef8345b48e95cee45ff25192ed1f4857273117917a4dcd48e3905619bcd9c9b8"}, - {file = "matplotlib-3.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:7c48d9e221b637c017232e3760ed30b4e8d5dfd081daf327e829bf2a72c731b4"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aa11b3c6928a1e496c1a79917d51d4cd5d04f8a2e75f21df4949eeefdf697f4b"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1095fecf99eeb7384dabad4bf44b965f929a5f6079654b681193edf7169ec20"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bddfb1db89bfaa855912261c805bd0e10218923cc262b9159a49c29a7a1c1afa"}, - {file = "matplotlib-3.8.2.tar.gz", hash = "sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1"}, + {file = "matplotlib-3.8.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:abc9d838f93583650c35eca41cfcec65b2e7cb50fd486da6f0c49b5e1ed23014"}, + {file = "matplotlib-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f65c9f002d281a6e904976007b2d46a1ee2bcea3a68a8c12dda24709ddc9106"}, + {file = "matplotlib-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce1edd9f5383b504dbc26eeea404ed0a00656c526638129028b758fd43fc5f10"}, + {file = "matplotlib-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd79298550cba13a43c340581a3ec9c707bd895a6a061a78fa2524660482fc0"}, + {file = "matplotlib-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:90df07db7b599fe7035d2f74ab7e438b656528c68ba6bb59b7dc46af39ee48ef"}, + {file = "matplotlib-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:ac24233e8f2939ac4fd2919eed1e9c0871eac8057666070e94cbf0b33dd9c338"}, + {file = "matplotlib-3.8.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:72f9322712e4562e792b2961971891b9fbbb0e525011e09ea0d1f416c4645661"}, + {file = "matplotlib-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:232ce322bfd020a434caaffbd9a95333f7c2491e59cfc014041d95e38ab90d1c"}, + {file = "matplotlib-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6addbd5b488aedb7f9bc19f91cd87ea476206f45d7116fcfe3d31416702a82fa"}, + {file = "matplotlib-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc4ccdc64e3039fc303defd119658148f2349239871db72cd74e2eeaa9b80b71"}, + {file = "matplotlib-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b7a2a253d3b36d90c8993b4620183b55665a429da8357a4f621e78cd48b2b30b"}, + {file = "matplotlib-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:8080d5081a86e690d7688ffa542532e87f224c38a6ed71f8fbed34dd1d9fedae"}, + {file = "matplotlib-3.8.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6485ac1f2e84676cff22e693eaa4fbed50ef5dc37173ce1f023daef4687df616"}, + {file = "matplotlib-3.8.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c89ee9314ef48c72fe92ce55c4e95f2f39d70208f9f1d9db4e64079420d8d732"}, + {file = "matplotlib-3.8.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50bac6e4d77e4262c4340d7a985c30912054745ec99756ce213bfbc3cb3808eb"}, + {file = "matplotlib-3.8.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f51c4c869d4b60d769f7b4406eec39596648d9d70246428745a681c327a8ad30"}, + {file = "matplotlib-3.8.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b12ba985837e4899b762b81f5b2845bd1a28f4fdd1a126d9ace64e9c4eb2fb25"}, + {file = "matplotlib-3.8.4-cp312-cp312-win_amd64.whl", hash = "sha256:7a6769f58ce51791b4cb8b4d7642489df347697cd3e23d88266aaaee93b41d9a"}, + {file = "matplotlib-3.8.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:843cbde2f0946dadd8c5c11c6d91847abd18ec76859dc319362a0964493f0ba6"}, + {file = "matplotlib-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c13f041a7178f9780fb61cc3a2b10423d5e125480e4be51beaf62b172413b67"}, + {file = "matplotlib-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb44f53af0a62dc80bba4443d9b27f2fde6acfdac281d95bc872dc148a6509cc"}, + {file = "matplotlib-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:606e3b90897554c989b1e38a258c626d46c873523de432b1462f295db13de6f9"}, + {file = "matplotlib-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9bb0189011785ea794ee827b68777db3ca3f93f3e339ea4d920315a0e5a78d54"}, + {file = "matplotlib-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:6209e5c9aaccc056e63b547a8152661324404dd92340a6e479b3a7f24b42a5d0"}, + {file = "matplotlib-3.8.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c7064120a59ce6f64103c9cefba8ffe6fba87f2c61d67c401186423c9a20fd35"}, + {file = "matplotlib-3.8.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0e47eda4eb2614300fc7bb4657fced3e83d6334d03da2173b09e447418d499f"}, + {file = "matplotlib-3.8.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:493e9f6aa5819156b58fce42b296ea31969f2aab71c5b680b4ea7a3cb5c07d94"}, + {file = "matplotlib-3.8.4.tar.gz", hash = "sha256:8aac397d5e9ec158960e31c381c5ffc52ddd52bd9a47717e2a694038167dffea"}, ] [package.dependencies] contourpy = ">=1.0.1" cycler = ">=0.10" fonttools = ">=4.22.0" -importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} kiwisolver = ">=1.3.1" -numpy = ">=1.21,<2" +numpy = ">=1.21" packaging = ">=20.0" pillow = ">=8" pyparsing = ">=2.3.1" @@ -1361,13 +1350,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] @@ -1379,24 +1368,23 @@ 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" -version = "7.11.0" -description = "Converting Jupyter Notebooks" +version = "7.16.3" +description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." optional = false python-versions = ">=3.8" files = [ - {file = "nbconvert-7.11.0-py3-none-any.whl", hash = "sha256:d1d417b7f34a4e38887f8da5bdfd12372adf3b80f995d57556cb0972c68909fe"}, - {file = "nbconvert-7.11.0.tar.gz", hash = "sha256:abedc01cf543177ffde0bfc2a69726d5a478f6af10a332fc1bf29fcb4f0cf000"}, + {file = "nbconvert-7.16.3-py3-none-any.whl", hash = "sha256:ddeff14beeeedf3dd0bc506623e41e4507e551736de59df69a91f86700292b3b"}, + {file = "nbconvert-7.16.3.tar.gz", hash = "sha256:a6733b78ce3d47c3f85e504998495b07e6ea9cf9bf6ec1c98dda63ec6ad19142"}, ] [package.dependencies] beautifulsoup4 = "*" bleach = "!=5.0.0" defusedxml = "*" -importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} jinja2 = ">=3.0" jupyter-core = ">=4.7" jupyterlab-pygments = "*" @@ -1416,24 +1404,24 @@ docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sp qtpdf = ["nbconvert[qtpng]"] qtpng = ["pyqtwebengine (>=5.15)"] serve = ["tornado (>=6.1)"] -test = ["flaky", "ipykernel", "ipywidgets (>=7)", "pytest"] +test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] webpdf = ["playwright"] [[package]] name = "nbformat" -version = "5.9.2" +version = "5.10.4" 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.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, + {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, ] [package.dependencies] -fastjsonschema = "*" +fastjsonschema = ">=2.15" jsonschema = ">=2.6" -jupyter-core = "*" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" traitlets = ">=5.1" [package.extras] @@ -1461,13 +1449,13 @@ traitlets = ">=5" [[package]] name = "nest-asyncio" -version = "1.5.8" +version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" files = [ - {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"}, - {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"}, + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, ] [[package]] @@ -1486,63 +1474,62 @@ setuptools = "*" [[package]] name = "numpy" -version = "1.26.2" +version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f"}, - {file = "numpy-1.26.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440"}, - {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75"}, - {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00"}, - {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe"}, - {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523"}, - {file = "numpy-1.26.2-cp310-cp310-win32.whl", hash = "sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9"}, - {file = "numpy-1.26.2-cp310-cp310-win_amd64.whl", hash = "sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919"}, - {file = "numpy-1.26.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841"}, - {file = "numpy-1.26.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1"}, - {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a"}, - {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b"}, - {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7"}, - {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8"}, - {file = "numpy-1.26.2-cp311-cp311-win32.whl", hash = "sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186"}, - {file = "numpy-1.26.2-cp311-cp311-win_amd64.whl", hash = "sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d"}, - {file = "numpy-1.26.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0"}, - {file = "numpy-1.26.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75"}, - {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7"}, - {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6"}, - {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6"}, - {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec"}, - {file = "numpy-1.26.2-cp312-cp312-win32.whl", hash = "sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167"}, - {file = "numpy-1.26.2-cp312-cp312-win_amd64.whl", hash = "sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e"}, - {file = "numpy-1.26.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef"}, - {file = "numpy-1.26.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2"}, - {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3"}, - {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818"}, - {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210"}, - {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36"}, - {file = "numpy-1.26.2-cp39-cp39-win32.whl", hash = "sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80"}, - {file = "numpy-1.26.2-cp39-cp39-win_amd64.whl", hash = "sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060"}, - {file = "numpy-1.26.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79"}, - {file = "numpy-1.26.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d"}, - {file = "numpy-1.26.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841"}, - {file = "numpy-1.26.2.tar.gz", hash = "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] name = "numpydoc" -version = "1.6.0" +version = "1.7.0" description = "Sphinx extension to support docstrings in Numpy format" optional = false python-versions = ">=3.8" files = [ - {file = "numpydoc-1.6.0-py3-none-any.whl", hash = "sha256:b6ddaa654a52bdf967763c1e773be41f1c3ae3da39ee0de973f2680048acafaa"}, - {file = "numpydoc-1.6.0.tar.gz", hash = "sha256:ae7a5380f0a06373c3afe16ccd15bd79bc6b07f2704cbc6f1e7ecc94b4f5fc0d"}, + {file = "numpydoc-1.7.0-py3-none-any.whl", hash = "sha256:5a56419d931310d79a06cfc2a126d1558700feeb9b4f3d8dcae1a8134be829c9"}, + {file = "numpydoc-1.7.0.tar.gz", hash = "sha256:866e5ae5b6509dcf873fc6381120f5c31acf13b135636c1a81d68c166a95f921"}, ] [package.dependencies] -Jinja2 = ">=2.10" -sphinx = ">=5" +sphinx = ">=6" tabulate = ">=0.8.10" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} @@ -1567,13 +1554,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]] @@ -1612,7 +1599,6 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.20.3", markers = "python_version < \"3.10\""}, {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, {version = ">=1.21.0", markers = "python_version >= \"3.10\" and python_version < \"3.11\""}, ] @@ -1659,50 +1645,50 @@ ply = "*" [[package]] name = "pandocfilters" -version = "1.5.0" +version = "1.5.1" description = "Utilities for writing pandoc filters in python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, - {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, + {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, + {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, ] [[package]] name = "parso" -version = "0.8.3" +version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" files = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, ] [package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] [[package]] name = "pathspec" -version = "0.11.2" +version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] name = "pexpect" -version = "4.8.0" +version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, ] [package.dependencies] @@ -1710,70 +1696,89 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "10.1.0" +version = "10.3.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "Pillow-10.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106"}, - {file = "Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db"}, - {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f"}, - {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818"}, - {file = "Pillow-10.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57"}, - {file = "Pillow-10.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7"}, - {file = "Pillow-10.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061"}, - {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262"}, - {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992"}, - {file = "Pillow-10.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a"}, - {file = "Pillow-10.1.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b"}, - {file = "Pillow-10.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651"}, - {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b"}, - {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f"}, - {file = "Pillow-10.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996"}, - {file = "Pillow-10.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793"}, - {file = "Pillow-10.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d"}, - {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80"}, - {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212"}, - {file = "Pillow-10.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14"}, - {file = "Pillow-10.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099"}, - {file = "Pillow-10.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd"}, - {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28"}, - {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2"}, - {file = "Pillow-10.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f"}, - {file = "Pillow-10.1.0.tar.gz", hash = "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, + {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, + {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, + {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, + {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, + {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, + {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, + {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, + {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, + {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, + {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, + {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, + {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, + {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, + {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, + {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] [[package]] name = "pint" @@ -1806,28 +1811,28 @@ test = ["codecov", "coveralls", "nbval", "pyarrow", "pytest", "pytest-cov", "pyt [[package]] name = "platformdirs" -version = "3.11.0" +version = "4.2.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, - {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] [[package]] name = "pluggy" -version = "1.3.0" +version = "1.4.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, ] [package.extras] @@ -1866,13 +1871,13 @@ files = [ [[package]] name = "pre-commit" -version = "3.5.0" +version = "3.7.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pre_commit-3.5.0-py2.py3-none-any.whl", hash = "sha256:841dc9aef25daba9a0238cd27984041fa0467b4199fc4852e27950664919f660"}, - {file = "pre_commit-3.5.0.tar.gz", hash = "sha256:5804465c675b659b0862f07907f96295d490822a450c4c40e747d0b1c6ebcb32"}, + {file = "pre_commit-3.7.0-py2.py3-none-any.whl", hash = "sha256:5eae9e10c2b5ac51577c3452ec0a490455c45a0533f7960f993a0d01e59decab"}, + {file = "pre_commit-3.7.0.tar.gz", hash = "sha256:e209d61b8acdcf742404408531f0c37d49d2c734fd7cff2d6076083d191cb060"}, ] [package.dependencies] @@ -1884,13 +1889,13 @@ virtualenv = ">=20.10.0" [[package]] name = "prompt-toolkit" -version = "3.0.41" +version = "3.0.43" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.41-py3-none-any.whl", hash = "sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2"}, - {file = "prompt_toolkit-3.0.41.tar.gz", hash = "sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0"}, + {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, ] [package.dependencies] @@ -1898,27 +1903,27 @@ wcwidth = "*" [[package]] name = "psutil" -version = "5.9.6" +version = "5.9.8" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "psutil-5.9.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d"}, - {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c"}, - {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28"}, - {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017"}, - {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c"}, - {file = "psutil-5.9.6-cp27-none-win32.whl", hash = "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9"}, - {file = "psutil-5.9.6-cp27-none-win_amd64.whl", hash = "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac"}, - {file = "psutil-5.9.6-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a"}, - {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c"}, - {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4"}, - {file = "psutil-5.9.6-cp36-cp36m-win32.whl", hash = "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602"}, - {file = "psutil-5.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa"}, - {file = "psutil-5.9.6-cp37-abi3-win32.whl", hash = "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c"}, - {file = "psutil-5.9.6-cp37-abi3-win_amd64.whl", hash = "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a"}, - {file = "psutil-5.9.6-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57"}, - {file = "psutil-5.9.6.tar.gz", hash = "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a"}, + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, ] [package.extras] @@ -1962,13 +1967,13 @@ files = [ [[package]] name = "pycparser" -version = "2.21" +version = "2.22" description = "C parser in Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] @@ -1984,13 +1989,13 @@ files = [ [[package]] name = "pygments" -version = "2.17.1" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ - {file = "pygments-2.17.1-py3-none-any.whl", hash = "sha256:1b37f1b1e1bff2af52ecaf28cc601e2ef7077000b227a0675da25aef85784bc4"}, - {file = "pygments-2.17.1.tar.gz", hash = "sha256:e45a0e74bf9c530f564ca81b8952343be986a29f6afe7f5ad95c5f06b7bdf5e8"}, + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] @@ -1999,13 +2004,13 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyparsing" -version = "3.1.1" +version = "3.1.2" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, - {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, ] [package.extras] @@ -2013,13 +2018,13 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.4.3" +version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"}, - {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"}, + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, ] [package.dependencies] @@ -2053,13 +2058,13 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] [package.dependencies] @@ -2067,13 +2072,13 @@ six = ">=1.5" [[package]] name = "pytz" -version = "2023.3.post1" +version = "2024.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, - {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, ] [[package]] @@ -2160,104 +2165,104 @@ files = [ [[package]] name = "pyzmq" -version = "25.1.1" +version = "25.1.2" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.6" files = [ - {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:381469297409c5adf9a0e884c5eb5186ed33137badcbbb0560b86e910a2f1e76"}, - {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:955215ed0604dac5b01907424dfa28b40f2b2292d6493445dd34d0dfa72586a8"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:985bbb1316192b98f32e25e7b9958088431d853ac63aca1d2c236f40afb17c83"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afea96f64efa98df4da6958bae37f1cbea7932c35878b185e5982821bc883369"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76705c9325d72a81155bb6ab48d4312e0032bf045fb0754889133200f7a0d849"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77a41c26205d2353a4c94d02be51d6cbdf63c06fbc1295ea57dad7e2d3381b71"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:12720a53e61c3b99d87262294e2b375c915fea93c31fc2336898c26d7aed34cd"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:57459b68e5cd85b0be8184382cefd91959cafe79ae019e6b1ae6e2ba8a12cda7"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:292fe3fc5ad4a75bc8df0dfaee7d0babe8b1f4ceb596437213821f761b4589f9"}, - {file = "pyzmq-25.1.1-cp310-cp310-win32.whl", hash = "sha256:35b5ab8c28978fbbb86ea54958cd89f5176ce747c1fb3d87356cf698048a7790"}, - {file = "pyzmq-25.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:11baebdd5fc5b475d484195e49bae2dc64b94a5208f7c89954e9e354fc609d8f"}, - {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:d20a0ddb3e989e8807d83225a27e5c2eb2260eaa851532086e9e0fa0d5287d83"}, - {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e1c1be77bc5fb77d923850f82e55a928f8638f64a61f00ff18a67c7404faf008"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d89528b4943d27029a2818f847c10c2cecc79fa9590f3cb1860459a5be7933eb"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90f26dc6d5f241ba358bef79be9ce06de58d477ca8485e3291675436d3827cf8"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2b92812bd214018e50b6380ea3ac0c8bb01ac07fcc14c5f86a5bb25e74026e9"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f957ce63d13c28730f7fd6b72333814221c84ca2421298f66e5143f81c9f91f"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:047a640f5c9c6ade7b1cc6680a0e28c9dd5a0825135acbd3569cc96ea00b2505"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7f7e58effd14b641c5e4dec8c7dab02fb67a13df90329e61c869b9cc607ef752"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c2910967e6ab16bf6fbeb1f771c89a7050947221ae12a5b0b60f3bca2ee19bca"}, - {file = "pyzmq-25.1.1-cp311-cp311-win32.whl", hash = "sha256:76c1c8efb3ca3a1818b837aea423ff8a07bbf7aafe9f2f6582b61a0458b1a329"}, - {file = "pyzmq-25.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:44e58a0554b21fc662f2712814a746635ed668d0fbc98b7cb9d74cb798d202e6"}, - {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e1ffa1c924e8c72778b9ccd386a7067cddf626884fd8277f503c48bb5f51c762"}, - {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1af379b33ef33757224da93e9da62e6471cf4a66d10078cf32bae8127d3d0d4a"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cff084c6933680d1f8b2f3b4ff5bbb88538a4aac00d199ac13f49d0698727ecb"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2400a94f7dd9cb20cd012951a0cbf8249e3d554c63a9c0cdfd5cbb6c01d2dec"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d81f1ddae3858b8299d1da72dd7d19dd36aab654c19671aa8a7e7fb02f6638a"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:255ca2b219f9e5a3a9ef3081512e1358bd4760ce77828e1028b818ff5610b87b"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a882ac0a351288dd18ecae3326b8a49d10c61a68b01419f3a0b9a306190baf69"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:724c292bb26365659fc434e9567b3f1adbdb5e8d640c936ed901f49e03e5d32e"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ca1ed0bb2d850aa8471387882247c68f1e62a4af0ce9c8a1dbe0d2bf69e41fb"}, - {file = "pyzmq-25.1.1-cp312-cp312-win32.whl", hash = "sha256:b3451108ab861040754fa5208bca4a5496c65875710f76789a9ad27c801a0075"}, - {file = "pyzmq-25.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eadbefd5e92ef8a345f0525b5cfd01cf4e4cc651a2cffb8f23c0dd184975d787"}, - {file = "pyzmq-25.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:db0b2af416ba735c6304c47f75d348f498b92952f5e3e8bff449336d2728795d"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c133e93b405eb0d36fa430c94185bdd13c36204a8635470cccc200723c13bb"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:273bc3959bcbff3f48606b28229b4721716598d76b5aaea2b4a9d0ab454ec062"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cbc8df5c6a88ba5ae385d8930da02201165408dde8d8322072e3e5ddd4f68e22"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:18d43df3f2302d836f2a56f17e5663e398416e9dd74b205b179065e61f1a6edf"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:73461eed88a88c866656e08f89299720a38cb4e9d34ae6bf5df6f71102570f2e"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:34c850ce7976d19ebe7b9d4b9bb8c9dfc7aac336c0958e2651b88cbd46682123"}, - {file = "pyzmq-25.1.1-cp36-cp36m-win32.whl", hash = "sha256:d2045d6d9439a0078f2a34b57c7b18c4a6aef0bee37f22e4ec9f32456c852c71"}, - {file = "pyzmq-25.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:458dea649f2f02a0b244ae6aef8dc29325a2810aa26b07af8374dc2a9faf57e3"}, - {file = "pyzmq-25.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cff25c5b315e63b07a36f0c2bab32c58eafbe57d0dce61b614ef4c76058c115"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1579413ae492b05de5a6174574f8c44c2b9b122a42015c5292afa4be2507f28"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3d0a409d3b28607cc427aa5c30a6f1e4452cc44e311f843e05edb28ab5e36da0"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21eb4e609a154a57c520e3d5bfa0d97e49b6872ea057b7c85257b11e78068222"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:034239843541ef7a1aee0c7b2cb7f6aafffb005ede965ae9cbd49d5ff4ff73cf"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f8115e303280ba09f3898194791a153862cbf9eef722ad8f7f741987ee2a97c7"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a5d26fe8f32f137e784f768143728438877d69a586ddeaad898558dc971a5ae"}, - {file = "pyzmq-25.1.1-cp37-cp37m-win32.whl", hash = "sha256:f32260e556a983bc5c7ed588d04c942c9a8f9c2e99213fec11a031e316874c7e"}, - {file = "pyzmq-25.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf34e43c531bbb510ae7e8f5b2b1f2a8ab93219510e2b287a944432fad135f3"}, - {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:87e34f31ca8f168c56d6fbf99692cc8d3b445abb5bfd08c229ae992d7547a92a"}, - {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c9c6c9b2c2f80747a98f34ef491c4d7b1a8d4853937bb1492774992a120f475d"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5619f3f5a4db5dbb572b095ea3cb5cc035335159d9da950830c9c4db2fbb6995"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a34d2395073ef862b4032343cf0c32a712f3ab49d7ec4f42c9661e0294d106f"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0e6b78220aba09815cd1f3a32b9c7cb3e02cb846d1cfc526b6595f6046618"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3669cf8ee3520c2f13b2e0351c41fea919852b220988d2049249db10046a7afb"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2d163a18819277e49911f7461567bda923461c50b19d169a062536fffe7cd9d2"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:df27ffddff4190667d40de7beba4a950b5ce78fe28a7dcc41d6f8a700a80a3c0"}, - {file = "pyzmq-25.1.1-cp38-cp38-win32.whl", hash = "sha256:a382372898a07479bd34bda781008e4a954ed8750f17891e794521c3e21c2e1c"}, - {file = "pyzmq-25.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:52533489f28d62eb1258a965f2aba28a82aa747202c8fa5a1c7a43b5db0e85c1"}, - {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:03b3f49b57264909aacd0741892f2aecf2f51fb053e7d8ac6767f6c700832f45"}, - {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:330f9e188d0d89080cde66dc7470f57d1926ff2fb5576227f14d5be7ab30b9fa"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2ca57a5be0389f2a65e6d3bb2962a971688cbdd30b4c0bd188c99e39c234f414"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d457aed310f2670f59cc5b57dcfced452aeeed77f9da2b9763616bd57e4dbaae"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56d748ea50215abef7030c72b60dd723ed5b5c7e65e7bc2504e77843631c1a6"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f03d3f0d01cb5a018debeb412441996a517b11c5c17ab2001aa0597c6d6882c"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:820c4a08195a681252f46926de10e29b6bbf3e17b30037bd4250d72dd3ddaab8"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17ef5f01d25b67ca8f98120d5fa1d21efe9611604e8eb03a5147360f517dd1e2"}, - {file = "pyzmq-25.1.1-cp39-cp39-win32.whl", hash = "sha256:04ccbed567171579ec2cebb9c8a3e30801723c575601f9a990ab25bcac6b51e2"}, - {file = "pyzmq-25.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e61f091c3ba0c3578411ef505992d356a812fb200643eab27f4f70eed34a29ef"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ade6d25bb29c4555d718ac6d1443a7386595528c33d6b133b258f65f963bb0f6"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c95ddd4f6e9fca4e9e3afaa4f9df8552f0ba5d1004e89ef0a68e1f1f9807c7"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48e466162a24daf86f6b5ca72444d2bf39a5e58da5f96370078be67c67adc978"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc719161780932c4e11aaebb203be3d6acc6b38d2f26c0f523b5b59d2fc1996"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ccf825981640b8c34ae54231b7ed00271822ea1c6d8ba1090ebd4943759abf5"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2f20ce161ebdb0091a10c9ca0372e023ce24980d0e1f810f519da6f79c60800"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:deee9ca4727f53464daf089536e68b13e6104e84a37820a88b0a057b97bba2d2"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa8d6cdc8b8aa19ceb319aaa2b660cdaccc533ec477eeb1309e2a291eaacc43a"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019e59ef5c5256a2c7378f2fb8560fc2a9ff1d315755204295b2eab96b254d0a"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b9af3757495c1ee3b5c4e945c1df7be95562277c6e5bccc20a39aec50f826cd0"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:548d6482dc8aadbe7e79d1b5806585c8120bafa1ef841167bc9090522b610fa6"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:057e824b2aae50accc0f9a0570998adc021b372478a921506fddd6c02e60308e"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2243700cc5548cff20963f0ca92d3e5e436394375ab8a354bbea2b12911b20b0"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79986f3b4af059777111409ee517da24a529bdbd46da578b33f25580adcff728"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:11d58723d44d6ed4dd677c5615b2ffb19d5c426636345567d6af82be4dff8a55"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:49d238cf4b69652257db66d0c623cd3e09b5d2e9576b56bc067a396133a00d4a"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fedbdc753827cf014c01dbbee9c3be17e5a208dcd1bf8641ce2cd29580d1f0d4"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc16ac425cc927d0a57d242589f87ee093884ea4804c05a13834d07c20db203c"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11c1d2aed9079c6b0c9550a7257a836b4a637feb334904610f06d70eb44c56d2"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e8a701123029cc240cea61dd2d16ad57cab4691804143ce80ecd9286b464d180"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61706a6b6c24bdece85ff177fec393545a3191eeda35b07aaa1458a027ad1304"}, - {file = "pyzmq-25.1.1.tar.gz", hash = "sha256:259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23"}, + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:e624c789359f1a16f83f35e2c705d07663ff2b4d4479bad35621178d8f0f6ea4"}, + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49151b0efece79f6a79d41a461d78535356136ee70084a1c22532fc6383f4ad0"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9a5f194cf730f2b24d6af1f833c14c10f41023da46a7f736f48b6d35061e76e"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faf79a302f834d9e8304fafdc11d0d042266667ac45209afa57e5efc998e3872"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f51a7b4ead28d3fca8dda53216314a553b0f7a91ee8fc46a72b402a78c3e43d"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0ddd6d71d4ef17ba5a87becf7ddf01b371eaba553c603477679ae817a8d84d75"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:246747b88917e4867e2367b005fc8eefbb4a54b7db363d6c92f89d69abfff4b6"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:00c48ae2fd81e2a50c3485de1b9d5c7c57cd85dc8ec55683eac16846e57ac979"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a68d491fc20762b630e5db2191dd07ff89834086740f70e978bb2ef2668be08"}, + {file = "pyzmq-25.1.2-cp310-cp310-win32.whl", hash = "sha256:09dfe949e83087da88c4a76767df04b22304a682d6154de2c572625c62ad6886"}, + {file = "pyzmq-25.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:fa99973d2ed20417744fca0073390ad65ce225b546febb0580358e36aa90dba6"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:82544e0e2d0c1811482d37eef297020a040c32e0687c1f6fc23a75b75db8062c"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:01171fc48542348cd1a360a4b6c3e7d8f46cdcf53a8d40f84db6707a6768acc1"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc69c96735ab501419c432110016329bf0dea8898ce16fab97c6d9106dc0b348"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e124e6b1dd3dfbeb695435dff0e383256655bb18082e094a8dd1f6293114642"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7598d2ba821caa37a0f9d54c25164a4fa351ce019d64d0b44b45540950458840"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d1299d7e964c13607efd148ca1f07dcbf27c3ab9e125d1d0ae1d580a1682399d"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4e6f689880d5ad87918430957297c975203a082d9a036cc426648fcbedae769b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cc69949484171cc961e6ecd4a8911b9ce7a0d1f738fcae717177c231bf77437b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9880078f683466b7f567b8624bfc16cad65077be046b6e8abb53bed4eeb82dd3"}, + {file = "pyzmq-25.1.2-cp311-cp311-win32.whl", hash = "sha256:4e5837af3e5aaa99a091302df5ee001149baff06ad22b722d34e30df5f0d9097"}, + {file = "pyzmq-25.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:25c2dbb97d38b5ac9fd15586e048ec5eb1e38f3d47fe7d92167b0c77bb3584e9"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:11e70516688190e9c2db14fcf93c04192b02d457b582a1f6190b154691b4c93a"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:313c3794d650d1fccaaab2df942af9f2c01d6217c846177cfcbc693c7410839e"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b3cbba2f47062b85fe0ef9de5b987612140a9ba3a9c6d2543c6dec9f7c2ab27"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc31baa0c32a2ca660784d5af3b9487e13b61b3032cb01a115fce6588e1bed30"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c9087b109070c5ab0b383079fa1b5f797f8d43e9a66c07a4b8b8bdecfd88ee"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f8429b17cbb746c3e043cb986328da023657e79d5ed258b711c06a70c2ea7537"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5074adeacede5f810b7ef39607ee59d94e948b4fd954495bdb072f8c54558181"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7ae8f354b895cbd85212da245f1a5ad8159e7840e37d78b476bb4f4c3f32a9fe"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b264bf2cc96b5bc43ce0e852be995e400376bd87ceb363822e2cb1964fcdc737"}, + {file = "pyzmq-25.1.2-cp312-cp312-win32.whl", hash = "sha256:02bbc1a87b76e04fd780b45e7f695471ae6de747769e540da909173d50ff8e2d"}, + {file = "pyzmq-25.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:ced111c2e81506abd1dc142e6cd7b68dd53747b3b7ae5edbea4578c5eeff96b7"}, + {file = "pyzmq-25.1.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7b6d09a8962a91151f0976008eb7b29b433a560fde056ec7a3db9ec8f1075438"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967668420f36878a3c9ecb5ab33c9d0ff8d054f9c0233d995a6d25b0e95e1b6b"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5edac3f57c7ddaacdb4d40f6ef2f9e299471fc38d112f4bc6d60ab9365445fb0"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0dabfb10ef897f3b7e101cacba1437bd3a5032ee667b7ead32bbcdd1a8422fe7"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2c6441e0398c2baacfe5ba30c937d274cfc2dc5b55e82e3749e333aabffde561"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:16b726c1f6c2e7625706549f9dbe9b06004dfbec30dbed4bf50cbdfc73e5b32a"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:a86c2dd76ef71a773e70551a07318b8e52379f58dafa7ae1e0a4be78efd1ff16"}, + {file = "pyzmq-25.1.2-cp36-cp36m-win32.whl", hash = "sha256:359f7f74b5d3c65dae137f33eb2bcfa7ad9ebefd1cab85c935f063f1dbb245cc"}, + {file = "pyzmq-25.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:55875492f820d0eb3417b51d96fea549cde77893ae3790fd25491c5754ea2f68"}, + {file = "pyzmq-25.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8c8a419dfb02e91b453615c69568442e897aaf77561ee0064d789705ff37a92"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8807c87fa893527ae8a524c15fc505d9950d5e856f03dae5921b5e9aa3b8783b"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5e319ed7d6b8f5fad9b76daa0a68497bc6f129858ad956331a5835785761e003"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3c53687dde4d9d473c587ae80cc328e5b102b517447456184b485587ebd18b62"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9add2e5b33d2cd765ad96d5eb734a5e795a0755f7fc49aa04f76d7ddda73fd70"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e690145a8c0c273c28d3b89d6fb32c45e0d9605b2293c10e650265bf5c11cfec"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:00a06faa7165634f0cac1abb27e54d7a0b3b44eb9994530b8ec73cf52e15353b"}, + {file = "pyzmq-25.1.2-cp37-cp37m-win32.whl", hash = "sha256:0f97bc2f1f13cb16905a5f3e1fbdf100e712d841482b2237484360f8bc4cb3d7"}, + {file = "pyzmq-25.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6cc0020b74b2e410287e5942e1e10886ff81ac77789eb20bec13f7ae681f0fdd"}, + {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:bef02cfcbded83473bdd86dd8d3729cd82b2e569b75844fb4ea08fee3c26ae41"}, + {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e10a4b5a4b1192d74853cc71a5e9fd022594573926c2a3a4802020360aa719d8"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8c5f80e578427d4695adac6fdf4370c14a2feafdc8cb35549c219b90652536ae"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5dde6751e857910c1339890f3524de74007958557593b9e7e8c5f01cd919f8a7"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea1608dd169da230a0ad602d5b1ebd39807ac96cae1845c3ceed39af08a5c6df"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0f513130c4c361201da9bc69df25a086487250e16b5571ead521b31ff6b02220"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:019744b99da30330798bb37df33549d59d380c78e516e3bab9c9b84f87a9592f"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2e2713ef44be5d52dd8b8e2023d706bf66cb22072e97fc71b168e01d25192755"}, + {file = "pyzmq-25.1.2-cp38-cp38-win32.whl", hash = "sha256:07cd61a20a535524906595e09344505a9bd46f1da7a07e504b315d41cd42eb07"}, + {file = "pyzmq-25.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb7e49a17fb8c77d3119d41a4523e432eb0c6932187c37deb6fbb00cc3028088"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:94504ff66f278ab4b7e03e4cba7e7e400cb73bfa9d3d71f58d8972a8dc67e7a6"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dd0d50bbf9dca1d0bdea219ae6b40f713a3fb477c06ca3714f208fd69e16fd8"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:004ff469d21e86f0ef0369717351073e0e577428e514c47c8480770d5e24a565"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c0b5ca88a8928147b7b1e2dfa09f3b6c256bc1135a1338536cbc9ea13d3b7add"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9a79f1d2495b167119d02be7448bfba57fad2a4207c4f68abc0bab4b92925b"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:518efd91c3d8ac9f9b4f7dd0e2b7b8bf1a4fe82a308009016b07eaa48681af82"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1ec23bd7b3a893ae676d0e54ad47d18064e6c5ae1fadc2f195143fb27373f7f6"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db36c27baed588a5a8346b971477b718fdc66cf5b80cbfbd914b4d6d355e44e2"}, + {file = "pyzmq-25.1.2-cp39-cp39-win32.whl", hash = "sha256:39b1067f13aba39d794a24761e385e2eddc26295826530a8c7b6c6c341584289"}, + {file = "pyzmq-25.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:8e9f3fabc445d0ce320ea2c59a75fe3ea591fdbdeebec5db6de530dd4b09412e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a8c1d566344aee826b74e472e16edae0a02e2a044f14f7c24e123002dcff1c05"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759cfd391a0996345ba94b6a5110fca9c557ad4166d86a6e81ea526c376a01e8"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c61e346ac34b74028ede1c6b4bcecf649d69b707b3ff9dc0fab453821b04d1e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb8fc1f8d69b411b8ec0b5f1ffbcaf14c1db95b6bccea21d83610987435f1a4"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3c00c9b7d1ca8165c610437ca0c92e7b5607b2f9076f4eb4b095c85d6e680a1d"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:df0c7a16ebb94452d2909b9a7b3337940e9a87a824c4fc1c7c36bb4404cb0cde"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:45999e7f7ed5c390f2e87ece7f6c56bf979fb213550229e711e45ecc7d42ccb8"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ac170e9e048b40c605358667aca3d94e98f604a18c44bdb4c102e67070f3ac9b"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1b604734bec94f05f81b360a272fc824334267426ae9905ff32dc2be433ab96"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a793ac733e3d895d96f865f1806f160696422554e46d30105807fdc9841b9f7d"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0806175f2ae5ad4b835ecd87f5f85583316b69f17e97786f7443baaf54b9bb98"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ef12e259e7bc317c7597d4f6ef59b97b913e162d83b421dd0db3d6410f17a244"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea253b368eb41116011add00f8d5726762320b1bda892f744c91997b65754d73"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b9b1f2ad6498445a941d9a4fee096d387fee436e45cc660e72e768d3d8ee611"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8b14c75979ce932c53b79976a395cb2a8cd3aaf14aef75e8c2cb55a330b9b49d"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:889370d5174a741a62566c003ee8ddba4b04c3f09a97b8000092b7ca83ec9c49"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18fff090441a40ffda8a7f4f18f03dc56ae73f148f1832e109f9bffa85df15"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99a6b36f95c98839ad98f8c553d8507644c880cf1e0a57fe5e3a3f3969040882"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4345c9a27f4310afbb9c01750e9461ff33d6fb74cd2456b107525bbeebcb5be3"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3516e0b6224cf6e43e341d56da15fd33bdc37fa0c06af4f029f7d7dfceceabbc"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:146b9b1f29ead41255387fb07be56dc29639262c0f7344f570eecdcd8d683314"}, + {file = "pyzmq-25.1.2.tar.gz", hash = "sha256:93f1aa311e8bb912e34f004cf186407a4e90eec4f0ecc0efd26056bf7eda0226"}, ] [package.dependencies] @@ -2265,13 +2270,13 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "referencing" -version = "0.31.0" +version = "0.34.0" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.31.0-py3-none-any.whl", hash = "sha256:381b11e53dd93babb55696c71cf42aef2d36b8a150c49bf0bc301e36d536c882"}, - {file = "referencing-0.31.0.tar.gz", hash = "sha256:cc28f2c88fbe7b961a7817a0abc034c09a1e36358f82fedb4ffdf29a25398863"}, + {file = "referencing-0.34.0-py3-none-any.whl", hash = "sha256:d53ae300ceddd3169f1ffa9caf2cb7b769e92657e4fafb23d34b93679116dfd4"}, + {file = "referencing-0.34.0.tar.gz", hash = "sha256:5773bd84ef41799a5a8ca72dc34590c041eb01bf9aa02632b4a973fb0181a844"}, ] [package.dependencies] @@ -2301,127 +2306,127 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rpds-py" -version = "0.13.1" +version = "0.18.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.13.1-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:83feb0f682d75a09ddc11aa37ba5c07dd9b824b22915207f6176ea458474ff75"}, - {file = "rpds_py-0.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fa84bbe22ffa108f91631935c28a623001e335d66e393438258501e618fb0dde"}, - {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e04f8c76b8d5c70695b4e8f1d0b391d8ef91df00ef488c6c1ffb910176459bc6"}, - {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:032c242a595629aacace44128f9795110513ad27217b091e834edec2fb09e800"}, - {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91276caef95556faeb4b8f09fe4439670d3d6206fee78d47ddb6e6de837f0b4d"}, - {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d22f2cb82e0b40e427a74a93c9a4231335bbc548aed79955dde0b64ea7f88146"}, - {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c9e2794329ef070844ff9bfc012004aeddc0468dc26970953709723f76c8a5"}, - {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c797ea56f36c6f248656f0223b11307fdf4a1886f3555eba371f34152b07677f"}, - {file = "rpds_py-0.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:82dbcd6463e580bcfb7561cece35046aaabeac5a9ddb775020160b14e6c58a5d"}, - {file = "rpds_py-0.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:736817dbbbd030a69a1faf5413a319976c9c8ba8cdcfa98c022d3b6b2e01eca6"}, - {file = "rpds_py-0.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1f36a1e80ef4ed1996445698fd91e0d3e54738bf597c9995118b92da537d7a28"}, - {file = "rpds_py-0.13.1-cp310-none-win32.whl", hash = "sha256:4f13d3f6585bd07657a603780e99beda96a36c86acaba841f131e81393958336"}, - {file = "rpds_py-0.13.1-cp310-none-win_amd64.whl", hash = "sha256:545e94c84575057d3d5c62634611858dac859702b1519b6ffc58eca7fb1adfcf"}, - {file = "rpds_py-0.13.1-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:6bfe72b249264cc1ff2f3629be240d7d2fdc778d9d298087cdec8524c91cd11f"}, - {file = "rpds_py-0.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edc91c50e17f5cd945d821f0f1af830522dba0c10267c3aab186dc3dbaab8def"}, - {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2eca04a365be380ca1f8fa48b334462e19e3382c0bb7386444d8ca43aa01c481"}, - {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3e3ac5b602fea378243f993d8b707189f9061e55ebb4e56cb9fdef8166060f28"}, - {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dfb5d2ab183c0efe5e7b8917e4eaa2e837aacafad8a69b89aa6bc81550eed857"}, - {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d9793d46d3e6522ae58e9321032827c9c0df1e56cbe5d3de965facb311aed6aa"}, - {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cd935c0220d012a27c20135c140f9cdcbc6249d5954345c81bfb714071b985c"}, - {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:37b08df45f02ff1866043b95096cbe91ac99de05936dd09d6611987a82a3306a"}, - {file = "rpds_py-0.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad666a904212aa9a6c77da7dce9d5170008cda76b7776e6731928b3f8a0d40fa"}, - {file = "rpds_py-0.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8a6ad8429340e0a4de89353447c6441329def3632e7b2293a7d6e873217d3c2b"}, - {file = "rpds_py-0.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7c40851b659d958c5245c1236e34f0d065cc53dca8d978b49a032c8e0adfda6e"}, - {file = "rpds_py-0.13.1-cp311-none-win32.whl", hash = "sha256:4145172ab59b6c27695db6d78d040795f635cba732cead19c78cede74800949a"}, - {file = "rpds_py-0.13.1-cp311-none-win_amd64.whl", hash = "sha256:46a07a258bda12270de02b34c4884f200f864bba3dcd6e3a37fef36a168b859d"}, - {file = "rpds_py-0.13.1-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:ba4432301ad7eeb1b00848cf46fae0e5fecfd18a8cb5fdcf856c67985f79ecc7"}, - {file = "rpds_py-0.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d22e0660de24bd8e9ac82f4230a22a5fe4e397265709289d61d5fb333839ba50"}, - {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76a8374b294e4ccb39ccaf11d39a0537ed107534139c00b4393ca3b542cc66e5"}, - {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7d152ec7bb431040af2500e01436c9aa0d993f243346f0594a15755016bf0be1"}, - {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74a2044b870df7c9360bb3ce7e12f9ddf8e72e49cd3a353a1528cbf166ad2383"}, - {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:960e7e460fda2d0af18c75585bbe0c99f90b8f09963844618a621b804f8c3abe"}, - {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37f79f4f1f06cc96151f4a187528c3fd4a7e1065538a4af9eb68c642365957f7"}, - {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cd4ea56c9542ad0091dfdef3e8572ae7a746e1e91eb56c9e08b8d0808b40f1d1"}, - {file = "rpds_py-0.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0290712eb5603a725769b5d857f7cf15cf6ca93dda3128065bbafe6fdb709beb"}, - {file = "rpds_py-0.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0b70c1f800059c92479dc94dda41288fd6607f741f9b1b8f89a21a86428f6383"}, - {file = "rpds_py-0.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3dd5fb7737224e1497c886fb3ca681c15d9c00c76171f53b3c3cc8d16ccfa7fb"}, - {file = "rpds_py-0.13.1-cp312-none-win32.whl", hash = "sha256:74be3b215a5695690a0f1a9f68b1d1c93f8caad52e23242fcb8ba56aaf060281"}, - {file = "rpds_py-0.13.1-cp312-none-win_amd64.whl", hash = "sha256:f47eef55297799956464efc00c74ae55c48a7b68236856d56183fe1ddf866205"}, - {file = "rpds_py-0.13.1-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:e4a45ba34f904062c63049a760790c6a2fa7a4cc4bd160d8af243b12371aaa05"}, - {file = "rpds_py-0.13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:20147996376be452cd82cd6c17701daba69a849dc143270fa10fe067bb34562a"}, - {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b9535aa22ab023704cfc6533e968f7e420affe802d85e956d8a7b4c0b0b5ea"}, - {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d4fa1eeb9bea6d9b64ac91ec51ee94cc4fc744955df5be393e1c923c920db2b0"}, - {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b2415d5a7b7ee96aa3a54d4775c1fec140476a17ee12353806297e900eaeddc"}, - {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:577d40a72550eac1386b77b43836151cb61ff6700adacda2ad4d883ca5a0b6f2"}, - {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af2d1648eb625a460eee07d3e1ea3a4a6e84a1fb3a107f6a8e95ac19f7dcce67"}, - {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5b769396eb358d6b55dbf78f3f7ca631ca1b2fe02136faad5af74f0111b4b6b7"}, - {file = "rpds_py-0.13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:249c8e0055ca597707d71c5ad85fd2a1c8fdb99386a8c6c257e1b47b67a9bec1"}, - {file = "rpds_py-0.13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:fe30ef31172bdcf946502a945faad110e8fff88c32c4bec9a593df0280e64d8a"}, - {file = "rpds_py-0.13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2647192facf63be9ed2d7a49ceb07efe01dc6cfb083bd2cc53c418437400cb99"}, - {file = "rpds_py-0.13.1-cp38-none-win32.whl", hash = "sha256:4011d5c854aa804c833331d38a2b6f6f2fe58a90c9f615afdb7aa7cf9d31f721"}, - {file = "rpds_py-0.13.1-cp38-none-win_amd64.whl", hash = "sha256:7cfae77da92a20f56cf89739a557b76e5c6edc094f6ad5c090b9e15fbbfcd1a4"}, - {file = "rpds_py-0.13.1-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:e9be1f7c5f9673616f875299339984da9447a40e3aea927750c843d6e5e2e029"}, - {file = "rpds_py-0.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:839676475ac2ccd1532d36af3d10d290a2ca149b702ed464131e450a767550df"}, - {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a90031658805c63fe488f8e9e7a88b260ea121ba3ee9cdabcece9c9ddb50da39"}, - {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ba9fbc5d6e36bfeb5292530321cc56c4ef3f98048647fabd8f57543c34174ec"}, - {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:08832078767545c5ee12561ce980714e1e4c6619b5b1e9a10248de60cddfa1fd"}, - {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19f5aa7f5078d35ed8e344bcba40f35bc95f9176dddb33fc4f2084e04289fa63"}, - {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80080972e1d000ad0341c7cc58b6855c80bd887675f92871221451d13a975072"}, - {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ee352691c4434eb1c01802e9daa5edcc1007ff15023a320e2693fed6a661b"}, - {file = "rpds_py-0.13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d20da6b4c7aa9ee75ad0730beaba15d65157f5beeaca54a038bb968f92bf3ce3"}, - {file = "rpds_py-0.13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:faa12a9f34671a30ea6bb027f04ec4e1fb8fa3fb3ed030893e729d4d0f3a9791"}, - {file = "rpds_py-0.13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7cf241dbb50ea71c2e628ab2a32b5bfcd36e199152fc44e5c1edb0b773f1583e"}, - {file = "rpds_py-0.13.1-cp39-none-win32.whl", hash = "sha256:dab979662da1c9fbb464e310c0b06cb5f1d174d09a462553af78f0bfb3e01920"}, - {file = "rpds_py-0.13.1-cp39-none-win_amd64.whl", hash = "sha256:a2b3c79586636f1fa69a7bd59c87c15fca80c0d34b5c003d57f2f326e5276575"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:5967fa631d0ed9f8511dede08bc943a9727c949d05d1efac4ac82b2938024fb7"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8308a8d49d1354278d5c068c888a58d7158a419b2e4d87c7839ed3641498790c"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0580faeb9def6d0beb7aa666294d5604e569c4e24111ada423cf9936768d95c"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2da81c1492291c1a90987d76a47c7b2d310661bf7c93a9de0511e27b796a8b46"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c9a1dc5e898ce30e2f9c0aa57181cddd4532b22b7780549441d6429d22d3b58"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4ae6f423cb7d1c6256b7482025ace2825728f53b7ac58bcd574de6ee9d242c2"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc3179e0815827cf963e634095ae5715ee73a5af61defbc8d6ca79f1bdae1d1d"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0d9f8930092558fd15c9e07198625efb698f7cc00b3dc311c83eeec2540226a8"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d1d388d2f5f5a6065cf83c54dd12112b7389095669ff395e632003ae8999c6b8"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:08b335fb0c45f0a9e2478a9ece6a1bfb00b6f4c4780f9be3cf36479c5d8dd374"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:d11afdc5992bbd7af60ed5eb519873690d921425299f51d80aa3099ed49f2bcc"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:8c1f6c8df23be165eb0cb78f305483d00c6827a191e3a38394c658d5b9c80bbd"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:528e2afaa56d815d2601b857644aeb395afe7e59212ab0659906dc29ae68d9a6"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df2af1180b8eeececf4f819d22cc0668bfadadfd038b19a90bd2fb2ee419ec6f"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:88956c993a20201744282362e3fd30962a9d86dc4f1dcf2bdb31fab27821b61f"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee70ee5f4144a45a9e6169000b5b525d82673d5dab9f7587eccc92794814e7ac"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5fd099acaee2325f01281a130a39da08d885e4dedf01b84bf156ec2737d78fe"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9656a09653b18b80764647d585750df2dff8928e03a706763ab40ec8c4872acc"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ba239bb37663b2b4cd08e703e79e13321512dccd8e5f0e9451d9e53a6b8509a"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:3f55ae773abd96b1de25fc5c3fb356f491bd19116f8f854ba705beffc1ddc3c5"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:f4b15a163448ec79241fb2f1bc5a8ae1a4a304f7a48d948d208a2935b26bf8a5"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:1a3b2583c86bbfbf417304eeb13400ce7f8725376dc7d3efbf35dc5d7052ad48"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:f1059ca9a51c936c9a8d46fbc2c9a6b4c15ab3f13a97f1ad32f024b39666ba85"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f55601fb58f92e4f4f1d05d80c24cb77505dc42103ddfd63ddfdc51d3da46fa2"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcfd5f91b882eedf8d9601bd21261d6ce0e61a8c66a7152d1f5df08d3f643ab1"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6574f619e8734140d96c59bfa8a6a6e7a3336820ccd1bfd95ffa610673b650a2"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a4b9d3f5c48bbe8d9e3758e498b3c34863f2c9b1ac57a4e6310183740e59c980"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdd6f8738e1f1d9df5b1603bb03cb30e442710e5672262b95d0f9fcb4edb0dab"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8c2bf286e5d755a075e5e97ba56b3de08cccdad6b323ab0b21cc98875176b03"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3d4b390ee70ca9263b331ccfaf9819ee20e90dfd0201a295e23eb64a005dbef"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:db8d0f0ad92f74feb61c4e4a71f1d573ef37c22ef4dc19cab93e501bfdad8cbd"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:2abd669a39be69cdfe145927c7eb53a875b157740bf1e2d49e9619fc6f43362e"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:2c173f529666bab8e3f948b74c6d91afa22ea147e6ebae49a48229d9020a47c4"}, - {file = "rpds_py-0.13.1.tar.gz", hash = "sha256:264f3a5906c62b9df3a00ad35f6da1987d321a053895bd85f9d5c708de5c0fbf"}, + {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, + {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88"}, + {file = "rpds_py-0.18.0-cp310-none-win32.whl", hash = "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337"}, + {file = "rpds_py-0.18.0-cp310-none-win_amd64.whl", hash = "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836"}, + {file = "rpds_py-0.18.0-cp311-none-win32.whl", hash = "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1"}, + {file = "rpds_py-0.18.0-cp311-none-win_amd64.whl", hash = "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7"}, + {file = "rpds_py-0.18.0-cp312-none-win32.whl", hash = "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98"}, + {file = "rpds_py-0.18.0-cp312-none-win_amd64.whl", hash = "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec"}, + {file = "rpds_py-0.18.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e"}, + {file = "rpds_py-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594"}, + {file = "rpds_py-0.18.0-cp38-none-win32.whl", hash = "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e"}, + {file = "rpds_py-0.18.0-cp38-none-win_amd64.whl", hash = "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20"}, + {file = "rpds_py-0.18.0-cp39-none-win32.whl", hash = "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7"}, + {file = "rpds_py-0.18.0-cp39-none-win_amd64.whl", hash = "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f"}, + {file = "rpds_py-0.18.0.tar.gz", hash = "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d"}, ] [[package]] name = "setuptools" -version = "69.0.1" +version = "69.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.0.1-py3-none-any.whl", hash = "sha256:6875bbd06382d857b1b90cd07cee6a2df701a164f241095706b5192bc56c5c62"}, - {file = "setuptools-69.0.1.tar.gz", hash = "sha256:f25195d54deb649832182d6455bffba7ac3d8fe71d35185e738d2198a4310044"}, + {file = "setuptools-69.2.0-py3-none-any.whl", hash = "sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c"}, + {file = "setuptools-69.2.0.tar.gz", hash = "sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" @@ -2473,7 +2478,6 @@ babel = ">=2.9" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} docutils = ">=0.18.1,<0.21" imagesize = ">=1.3" -importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} Jinja2 = ">=3.0" packaging = ">=21.0" Pygments = ">=2.14" @@ -2530,13 +2534,13 @@ rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"] [[package]] name = "sphinx-exec-code" -version = "0.10" +version = "0.12" description = "Execute code blocks in Sphinx and display the output" optional = false python-versions = "*" files = [ - {file = "sphinx-exec-code-0.10.tar.gz", hash = "sha256:a5b8e207548cd3944b61315c8df5f3fab6732341b53dc056e6efd0358cc0bdb1"}, - {file = "sphinx_exec_code-0.10-py3-none-any.whl", hash = "sha256:2597460a7062bfd8ef1b108a8cec1dc10250d56a19034830b038ac653dee1902"}, + {file = "sphinx-exec-code-0.12.tar.gz", hash = "sha256:6b964eaa3d170d8a44e4db698b25e64c03a65681392f45a8f4a51c09f0ee70c9"}, + {file = "sphinx_exec_code-0.12-py3-none-any.whl", hash = "sha256:a4133e05147a2ef2d256bfb69872c3803aa566eacf88a28ae991f549527d3c72"}, ] [[package]] @@ -2560,56 +2564,50 @@ dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.7" +version = "1.0.8" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_applehelp-1.0.7-py3-none-any.whl", hash = "sha256:094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d"}, - {file = "sphinxcontrib_applehelp-1.0.7.tar.gz", hash = "sha256:39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa"}, + {file = "sphinxcontrib_applehelp-1.0.8-py3-none-any.whl", hash = "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"}, + {file = "sphinxcontrib_applehelp-1.0.8.tar.gz", hash = "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.5" +version = "1.0.6" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_devhelp-1.0.5-py3-none-any.whl", hash = "sha256:fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f"}, - {file = "sphinxcontrib_devhelp-1.0.5.tar.gz", hash = "sha256:63b41e0d38207ca40ebbeabcf4d8e51f76c03e78cd61abe118cf4435c73d4212"}, + {file = "sphinxcontrib_devhelp-1.0.6-py3-none-any.whl", hash = "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f"}, + {file = "sphinxcontrib_devhelp-1.0.6.tar.gz", hash = "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.4" +version = "2.0.5" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl", hash = "sha256:8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9"}, - {file = "sphinxcontrib_htmlhelp-2.0.4.tar.gz", hash = "sha256:6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a"}, + {file = "sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"}, + {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["html5lib", "pytest"] [[package]] @@ -2642,38 +2640,34 @@ test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.6" +version = "1.0.7" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_qthelp-1.0.6-py3-none-any.whl", hash = "sha256:bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4"}, - {file = "sphinxcontrib_qthelp-1.0.6.tar.gz", hash = "sha256:62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d"}, + {file = "sphinxcontrib_qthelp-1.0.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"}, + {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.9" +version = "1.1.10" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl", hash = "sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1"}, - {file = "sphinxcontrib_serializinghtml-1.1.9.tar.gz", hash = "sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54"}, + {file = "sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl", hash = "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7"}, + {file = "sphinxcontrib_serializinghtml-1.1.10.tar.gz", hash = "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] @@ -2740,92 +2734,93 @@ files = [ [[package]] name = "tornado" -version = "6.3.3" +version = "6.4" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">= 3.8" files = [ - {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, - {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, - {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, - {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, - {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, + {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, + {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, + {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, ] [[package]] name = "traitlets" -version = "5.13.0" +version = "5.14.2" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.13.0-py3-none-any.whl", hash = "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619"}, - {file = "traitlets-5.13.0.tar.gz", hash = "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5"}, + {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.6.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 = "typing-extensions" -version = "4.8.0" +version = "4.11.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, - {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, + {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, + {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, ] [[package]] name = "tzdata" -version = "2023.3" +version = "2024.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, - {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] [[package]] name = "urllib3" -version = "2.1.0" +version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, - {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, + {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)"] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.24.6" +version = "20.25.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.6-py3-none-any.whl", hash = "sha256:520d056652454c5098a00c0f073611ccbea4c79089331f60bf9d7ba247bb7381"}, - {file = "virtualenv-20.24.6.tar.gz", hash = "sha256:02ece4f56fbf939dbbc33c0715159951d6bf14aaf5457b092e4548e1382455af"}, + {file = "virtualenv-20.25.1-py3-none-any.whl", hash = "sha256:961c026ac520bac5f69acb8ea063e8a4f071bcc9457b9c1f28f6b085c511583a"}, + {file = "virtualenv-20.25.1.tar.gz", hash = "sha256:e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197"}, ] [package.dependencies] distlib = ">=0.3.7,<1" filelock = ">=3.12.2,<4" -platformdirs = ">=3.9.1,<4" +platformdirs = ">=3.9.1,<5" [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] @@ -2833,13 +2828,13 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "wcwidth" -version = "0.2.11" +version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.11-py2.py3-none-any.whl", hash = "sha256:c4b153acf29f1f0d7fb1b00d097cce82b73de7a2016321c8d7ca71bd76dd848b"}, - {file = "wcwidth-0.2.11.tar.gz", hash = "sha256:25eb3ecbec328cdb945f56f2a7cfe784bdf7a73a8197398c7a7c65e7fe93e9ae"}, + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] [[package]] @@ -2855,20 +2850,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.9" -content-hash = "cc0cdc76ab8b5f234e70e625215e81e9936fdf1b69afc7403abd9436ace0f73a" +python-versions = ">=3.10" +content-hash = "9b3f92591fdf8db7b05f07db841b4055a7874c200a012dec326b021af6f5e95a" diff --git a/portfolyo/core/pfline/flat_methods.py b/portfolyo/core/pfline/flat_methods.py index faae08f..5511f02 100644 --- a/portfolyo/core/pfline/flat_methods.py +++ b/portfolyo/core/pfline/flat_methods.py @@ -2,6 +2,8 @@ from typing import TYPE_CHECKING, Any +from portfolyo import tools + from ... import testing import pandas as pd @@ -45,6 +47,13 @@ def __init__(self, pfl: FlatPfLine): def __getitem__(self, arg) -> FlatPfLine: newdf = self.pfl.df.loc[arg] + try: + tools.standardize.assert_frame_standardized(newdf) + except AssertionError as e: + raise ValueError( + "Timeseries not in expected form. See ``portfolyo.standardize()`` for more information." + ) from e + return self.pfl.__class__(newdf) # use same (leaf) class @@ -63,4 +72,10 @@ def __getitem__(self, arg) -> FlatPfLine: mask &= self.pfl.index < arg.stop newdf = self.pfl.df.loc[mask] + try: + tools.standardize.assert_frame_standardized(newdf) + except AssertionError as e: + raise ValueError( + "Timeseries not in expected form. See ``portfolyo.standardize()`` for more information." + ) from e return self.pfl.__class__(newdf) # use same (leaf) class diff --git a/portfolyo/dev/develop.py b/portfolyo/dev/develop.py index 5c7f426..fb59837 100644 --- a/portfolyo/dev/develop.py +++ b/portfolyo/dev/develop.py @@ -3,7 +3,7 @@ """ import datetime as dt -from typing import Dict, Union, Callable, Tuple +from typing import Callable, Dict, Tuple, Union import numpy as np import pandas as pd @@ -28,30 +28,42 @@ def get_index( _seed: int = None, ) -> pd.DatetimeIndex: """Get index.""" + # Prepare values. if _seed: np.random.seed(_seed) if not periods: standard_len = INDEX_LEN.get(freq, 10) periods = np.random.randint(standard_len // 2, standard_len * 2) - if tools.freq.up_or_down(freq, "H") <= 0 and tz is None: - # Shorten index to not include timestamp that do not exist in Europe/Berlin. - periods = min(periods, 4000) if not startdate: - a, m, d = 2020, 1, 1 - a += np.random.randint(-4, 4) if _seed else (periods % 20 - 10) + a, m, d = 2016, 1, 1 # earliest possible + a += np.random.randint(0, 8) if _seed else (periods % 8) if tools.freq.up_or_down(freq, "MS") <= 0: m += np.random.randint(0, 12) if _seed else (periods % 12) if tools.freq.up_or_down(freq, "D") <= 0: d += np.random.randint(0, 28) if _seed else (periods % 28) - if tools.freq.up_or_down(freq, "H") <= 0 and tz is None: - # Start index after DST-start to not include timestamps that do not exist in Europe/Berlin. - m, d = 4, 2 startdate = f"{a}-{m}-{d}" if not start_of_day: start_of_day = dt.time(hour=0, minute=0) - starttime = f"{start_of_day.hour:02}:{start_of_day.minute:02}:00" - start = f"{startdate} {starttime}" - return pd.date_range(start, freq=freq, periods=periods, tz=tz) + # Create index. + start = tools.stamp.create(startdate, tz, start_of_day) + i = pd.date_range(start, periods=periods, freq=freq) # tz included in start + # Some checks. + if tools.freq.up_or_down(freq, "H") <= 0: + i = _shorten_index_if_necessary(i, start_of_day) + return i + + +def _shorten_index_if_necessary(i, start_of_day) -> pd.DatetimeIndex: + """Shorten index with (quarter)hourly values if necessary to ensure that an integer + number of calendar days is included.""" + if (i[-1] - i[0]).total_seconds() < 23 * 3600: + raise ValueError("Index must contain at least one full day") + # Must ensure that index is integer number of days. + for _ in range(0, 100): # max 100 quarterhours in a day (@ end of DST) + if tools.right.stamp(i[-1], i.freq).time() == start_of_day: + return i + i = i[:-1] + raise ValueError("Can't find timestamp to end index on.") def get_value( diff --git a/portfolyo/tools/freq.py b/portfolyo/tools/freq.py index 61fa4f2..302f367 100644 --- a/portfolyo/tools/freq.py +++ b/portfolyo/tools/freq.py @@ -230,7 +230,7 @@ def set_to_index( Parameters ---------- i : pd.DatetimeIndex - wanted : str, optional + wanted : str, optional (default: None) Frequency to set. If none provided, try to infer. strict : bool, optional (default: False) If True, raise ValueError if a valid frequency is not found. @@ -293,6 +293,5 @@ def set_to_frame( "The data does not have a datetime index and can therefore not have a frequency." ) - fr = fr.copy() - fr.index = set_to_index(fr.index, wanted, strict) - return fr + i = set_to_index(fr.index, wanted, strict) + return fr.set_axis(i, axis=0) diff --git a/portfolyo/tools/standardize.py b/portfolyo/tools/standardize.py index 93f32db..24925f4 100644 --- a/portfolyo/tools/standardize.py +++ b/portfolyo/tools/standardize.py @@ -8,20 +8,18 @@ from pytz import AmbiguousTimeError, NonExistentTimeError from . import freq as tools_freq +from . import right as tools_right from . import righttoleft as tools_righttoleft from . import tzone as tools_tzone -# TODO: remove 'Europe/Berlin' as default for ``tz``, use None instead. def frame( fr: Union[pd.Series, pd.DataFrame], force: str = None, bound: str = "left", *, - tz: str = "Europe/Berlin", + tz: str = None, floating: bool = True, - index_col: str = None, - force_freq: str = None, ) -> Union[pd.Series, pd.DataFrame]: """Standardize a series or dataframe. @@ -29,23 +27,29 @@ def frame( ---------- fr : pd.Series or pd.DataFrame force : {'aware', 'agnostic'}, optional (default: None) - Force ``fr`` to be timezone aware or timezone agnostic. If None: keep index - as-is. + Force returned frame to be timezone aware or timezone agnostic. Timezone aware + means that the index has a timezone, like UTC or Europe/Berlin. Timezone agnostic + means that the index shows wall time with 24h days without DST. If None: keep + timezone as-is. bound : {'left', 'right'}, optional (default: 'left') - If 'left' ('right'), specifies that input timestamps are left-(right-)bound. + If 'right', specifies that input timestamps are right-bound, and will change to + left-bound. tz : str, optional (default: None) - The timezone in which to interpret non-localized values. If ``force`` == - 'aware': also the timezone to localize to. Ignored if ``force`` is None. + Timezone. Timezone to convert the values into and/or to interpret values in. + - If ``force`` is None, this argument is ignored. + - If the index is timezone agnostic and ``force`` is 'aware', the frame values + are interpreted as being in this timezone. E.g., if 'Europe/Berlin', the final + Sunday in March already has 23h; all that's needed is to set the timezone. + - If the index is timezone agnostic and ``force`` is 'agnostic', the same is + done, but followed with a conversion to timezone-agnostic frame. + - If the index is timezone aware and ``force`` is 'aware', the values are + converted to timezone ``tz``. See parameter ``floating``. + - If the index is timezone aware and ``force`` is 'agnostic', this argument is + ignored. floating : bool, optional (default: True) If ``force`` == 'aware': how to convert to ``tz`` if ``fr`` has other timezone. Keep local time (``floating`` == True) or keep universal time (``floating`` == False). Ignored if ``force`` == 'agnostic' or None. - index_col : str, optional - Column to create the timestamp from. Use existing index if none specified. - Ignored if ``fr`` is not a DataFrame. - force_freq : str, optional - If a frequency cannot be inferred from the data (e.g. due to gaps), it is - resampled at this frequency. Default: raise Exception. Returns ------- @@ -57,21 +61,16 @@ def frame( ----- It is assumed that we are dealing with "time-averable" data, such as values in [MW] or [Eur/MWh]. This is especially important when converting daily (and longer) values - between a tz-agnostic context and a tz-aware context with DST-transitions. + between a tz-agnostic context and a tz-aware context with DST-transitions. The value + on a 23-hour day is used as-is when convertintg to a 24-hour day. See also -------- ``portfolyo.force_aware`` ``portfolyo.force_agnostic`` """ - kwargs = {"tz": tz, "floating": floating, "force_freq": force_freq} - # Set index. - if index_col and isinstance(fr, pd.DataFrame): - fr = fr.set_index(index_col) - else: - fr = fr.copy() # don't change passed-in fr - fr.index = pd.DatetimeIndex(fr.index) # turn / try to turn into datetime + fr = fr.set_axis(pd.DatetimeIndex(fr.index)) # turn / try to turn into datetime # We want to cover 2 additional cases for convenience sake: # a. The user passes a frame that still needs to be localized (--> freq unknown) @@ -85,14 +84,7 @@ def frame( # The data may be right-bound. if bound == "right": # right -> left - for how in ["A", "B"]: - try: - fr_left = fr.set_axis(tools_righttoleft.index(fr.index, how)) - return frame(fr_left, force, "left", **kwargs) - except ValueError as e: - if how == "B": - raise ValueError("Cannot make this frame left-bound.") from e - pass + return _fix_rightbound(fr, force, tz, floating) # Now the data is left-bound. # If the frequency is not found, and it is tz-naive, the index may need to be localized. @@ -106,46 +98,23 @@ def frame( else: # Could be localized. Again remove localization if force == 'agnostic' or None. force_to = force or "agnostic" - return frame(fr_aware, force_to, "left", **kwargs) + return frame(fr_aware, force_to, "left", tz=tz, floating=floating) # All options to infer frequency have been exhausted. One may or may not have been found. # Does the user want to force a frequency? - if not freq_input and force_freq: - # No freq has been found, but user specifies which freq it should be. - fr_withfreq = fr.asfreq(force_freq) - return frame(fr_withfreq, force, "left", tz=tz, floating=floating) - - elif not freq_input and not force_freq: + if not freq_input: # No freq has been bound, and user specifies no freq either. raise ValueError( - "A frequency could not be inferred for this data. Force a frequency (by passing the" - " ``force_freq`` parameter), or localize the data in advance (with ``fr.tz_localize()``)." - ) - - elif freq_input and force_freq and force_freq != freq_input: - # Freq has been found, but user specifies it should be a different freq. - raise ValueError( - f"This data seems to have a frequency {freq_input}, which is different from the frequency" - f" the user wants to force on it {force_freq}. Note that the ``force_freq`` parameter is" - " for filling gaps in the input data. It should not be used for resampling! If the" - " data has e.g. daily values but you want monthly values, use ``force_freq='D'``, and" - " pass the return value to one of the functions in the ``portfolyo.tools.changefreq`` module." + "A frequency could not be inferred for this data. This can be because there are" + " gaps in the data (use ``fr.asfreq()`` to replace gaps with NaN), or because" + " the index must be localized (with ``fr.tz_localize()``)." ) - # Now the data has frequency set. It is tz-aware (possibly with wrong tz) or tz-agnostic. + # Now the data has frequency set. It is tz-aware (possibly with wrong tz) or tz-agnostic. # Fix timezone. - if force == "aware": - fr = tools_tzone.force_aware(fr, tz, floating=floating) - elif force == "agnostic" or force == "naive": - fr = tools_tzone.force_agnostic(fr) - elif force is None: # don't try to fix timezone. - pass - else: - raise ValueError( - f"Parameter ``force`` must be one of 'aware', 'agnostic'; got {force}." - ) + fr = _fix_timezone(fr, force, tz, floating) # Check if index is OK; otherwise raise error. try: @@ -154,9 +123,36 @@ def frame( raise ValueError("Could not standardize this frame") from e # Standardize index name. - fr.index.name = "ts_left" + fr = _standardize_index_name(fr) # After standardizing timezone, the frequency should have been set. - return tools_freq.set_to_frame(fr, freq_input, strict=force_freq) + return tools_freq.set_to_frame(fr, freq_input, strict=True) + + +def _fix_rightbound(fr, force, tz, floating): + for how in ["A", "B"]: + try: + i_left = tools_righttoleft.index(fr.index, how) + fr_left = fr.set_axis(i_left) + return frame(fr_left, force, "left", tz=tz, floating=floating) + except ValueError: + pass + raise ValueError("Cannot make this frame left-bound.") + + +def _fix_timezone(fr, force, tz, floating): + if force is None: + return fr + elif force == "aware": + return tools_tzone.force_aware(fr, tz, floating=floating) + elif force == "agnostic" or force == "naive": + return tools_tzone.force_agnostic(fr) + raise ValueError( + f"Parameter ``force`` must be None, 'aware' or 'agnostic'; got {force}." + ) + + +def _standardize_index_name(fr: Union[pd.Series, pd.DataFrame]): + return fr.rename_axis(index="ts_left") def assert_frame_standardized(fr: Union[pd.Series, pd.DataFrame]): @@ -189,7 +185,7 @@ def assert_index_standardized(i: pd.DatetimeIndex, __right: bool = False): if i[0].minute != startminute: err = ("right-bound", "15 min past the") if __right else ("", "at a full") raise AssertionError( - f"An index with {err[0]} quarterhourly values must start {err[1]} hour; found {i[0]}." + f"The first element in an index with {err[0]} quarterhourly values must be {err[1]} hour; found {i[0]}." ) if any(not_ok := [ts.minute not in (0, 15, 30, 45) for ts in i]): @@ -205,7 +201,20 @@ def assert_index_standardized(i: pd.DatetimeIndex, __right: bool = False): ) # Check time-of-day. - if tools_freq.up_or_down(freq, "D") >= 0: + if tools_freq.up_or_down(freq, "H") <= 0: # hour or shorter + if not __right: + start = i[0] + end = tools_right.stamp(i[-1], i.freq) + else: + start = tools_righttoleft.index(i)[0] + end = i[-1] + if start.time() != end.time(): + raise AssertionError( + "An index must contain full days. For hourly-or-shorter values, this means " + f"that the start time of the first period ({start}) must equal the end time of the " + f"last period ({end}), which is not the case." + ) + else: # days or longer if not len(times := set(i.time)) == 1: raise AssertionError( "In an index with daily-or-longer values, all timestamps (all periods) should" diff --git a/portfolyo/tools/startofday.py b/portfolyo/tools/startofday.py index 14c6af9..2cc3415 100644 --- a/portfolyo/tools/startofday.py +++ b/portfolyo/tools/startofday.py @@ -2,11 +2,13 @@ Tools to get/set start-of-day. """ +import datetime as dt +from typing import Union import pandas as pd + from . import freq as tools_freq -import datetime as dt -from typing import Union +from . import right as tools_right def get( @@ -25,7 +27,7 @@ def get( Returns ------- - Union[dt.time, str] + Union[dt.time, str, dt.timedelta] """ start_of_day = i[0].time() if returntype == "time": @@ -39,31 +41,51 @@ def get( ) -def set(i: pd.DatetimeIndex, start_of_day: dt.time = None) -> pd.DatetimeIndex: - """Set the start-of-day of an index by changing the time-part of the index elements. +def set(i: pd.DatetimeIndex, start_of_day: dt.time) -> pd.DatetimeIndex: + """Set the start-of-day of an index. Done by changing the time-part of the index + elements (if index has daily-or-longer frequency) or by trimming the index (if index + has hourly-or-shorter frequency). Parameters ---------- i : pd.DatetimeIndex - Index; must have a daily (or longer) frequency. - start_of_day : dt.time, optional (default: midnight) - The new time that replaces the time-part of index elements. + start_of_day : dt.time Returns ------- pd.DatetimeIndex - With adjusted time-part. Date-part is unchanged, so new timestamps are on same - calendar day as original timestamps. + With wanted start-of-day. """ - if tools_freq.up_or_down(i.freq, "D") < 0: - raise ValueError( - "Can only set the start-of-day of an index with daily (or longer) frequency." - ) - - if start_of_day is None: - start_of_day = dt.time(hour=0, minute=0, second=0) - elif start_of_day.second != 0 or start_of_day.minute % 15 != 0: + if start_of_day.second != 0 or start_of_day.minute % 15 != 0: raise ValueError("Start of day must coincide with a full quarterhour.") + if tools_freq.up_or_down(i.freq, "D") >= 0: + return _set_to_longfreq(i, start_of_day) + else: + return _set_to_shortfreq(i, start_of_day) + + +def _set_to_longfreq(i: pd.DatetimeIndex, start_of_day: dt.time) -> pd.DatetimeIndex: + """Set start-of-day of index with daily-or-longer frequency.""" tss = (ts.replace(hour=start_of_day.hour, minute=start_of_day.minute) for ts in i) return pd.DatetimeIndex(tss, freq=i.freq, tz=i.tz) + + +def _set_to_shortfreq(i: pd.DatetimeIndex, start_of_day: dt.time) -> pd.DatetimeIndex: + """Set start-of-day of index with hourly-or-shorter frequency. Destructive; values + at start and/or end of index are removed to get wanted start_of_day.""" + # Remove from start if necessary. + for _ in range(0, 100): # max 100 quarterhours in a day (@ end of DST) + if i[0].time() == start_of_day: + break + i = i[1:] + else: + raise ValueError("Did not find any timestamp with correct time at index start.") + # Remove from end if necessary. + for _ in range(0, 100): # max 100 quarterhours in a day (@ end of DST) + if tools_right.stamp(i[-1], i.freq).time() == start_of_day: + break + i = i[:-1] + else: + raise ValueError("Did not find any timestamp with correct time at index end.") + return i diff --git a/portfolyo/tools/trim.py b/portfolyo/tools/trim.py index bf34278..01f8ca9 100644 --- a/portfolyo/tools/trim.py +++ b/portfolyo/tools/trim.py @@ -9,8 +9,8 @@ from . import ceil as tools_ceil from . import floor as tools_floor from . import freq as tools_freq -from . import startofday as tools_startofday from . import right as tools_right +from . import startofday as tools_startofday def index(i: pd.DatetimeIndex, freq: str) -> pd.DatetimeIndex: diff --git a/pyproject.toml b/pyproject.toml index d1ad723..4be4e79 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ license = "BSD-3" readme = "README.rst" [tool.poetry.dependencies] -python = "^3.9" +python = ">=3.10" pandas = "~2.0" # pandas 2.1.0 doesn't play nice with pint-pandas. Update when new pint-pandas version is released (>0.5) matplotlib = "^3.7.2" pint = "0.19.2" @@ -36,11 +36,13 @@ sphinx-autobuild = "^2021.3.14" matplotlib = "^3.8.2" numpydoc = "^1.6.0" sphinx-copybutton = "^0.5.2" -sphinx-exec-code = "^0.10" +sphinx-exec-code = "^0.12" sphinx-rtd-theme = "^1.3.0" insegel = "^1.3.1" nbsphinx = "^0.9.3" pandoc = "^2.3" +IPython = "^8.23.0" + [tool.poetry.group.dev.dependencies] diff --git a/test-output.xml b/test-output.xml index 5fc8557..8667413 100644 --- a/test-output.xml +++ b/test-output.xml @@ -1 +1 @@ -/Users/ruud.wijtvliet/python/lichtblyck/.venv/bin/pytest tests/tools/test_intersect.pytests/tools/test_intersect.py \ No newline at end of file +/Users/alina.voilova/miniconda3/envs/env-portfolyo/lib/python3.9/site-packages/pytest/__main__.py -p vscode_pytest --collect-only teststests \ No newline at end of file diff --git a/tests/core/pfline/test_flat.py b/tests/core/pfline/test_flat.py index cad08f7..a2741a9 100644 --- a/tests/core/pfline/test_flat.py +++ b/tests/core/pfline/test_flat.py @@ -107,13 +107,13 @@ def test_flatpfline_asfreqcorrect1(freq_in: str, freq_out: str, columns: str): def test_flatpfline_asfreqcorrect2(freq, newfreq, columns, tz): """Test if changing frequency is done correctly (when it's possible).""" - # Includes at 2 full years + # Includes at least 2 full years a, m, d = np.array([2016, 1, 1]) + np.random.randint(0, 12, 3) # each + 0..11 start = f"{a}-{m}-{d}" a, (m, d) = a + 3, np.array([1, 1]) + np.random.randint(0, 12, 2) # each + 0..11 end = f"{a}-{m}-{d}" - i = pd.date_range(start, end, freq=freq, tz=tz) + i = pd.date_range(start, end, freq=freq, inclusive="left", tz=tz) df = dev.get_dataframe(i, columns) pfl1 = create.flatpfline(df) pfl2 = pfl1.asfreq(newfreq) @@ -143,8 +143,9 @@ def test_flatpfline_asfreqcorrect2(freq, newfreq, columns, tz): def test_flatpfline_asfreqimpossible(freq, newfreq, kind): """Test if changing frequency raises error if it's impossible.""" - periods = {"H": 200, "15T": 2000, "D": 20}[freq] - i = pd.date_range("2020-04-06", freq=freq, periods=periods, tz="Europe/Berlin") + i = pd.date_range( + "2020-04-06", "2020-04-16", freq=freq, inclusive="left", tz="Europe/Berlin" + ) pfl = dev.get_flatpfline(i, kind) with pytest.raises(ValueError): _ = pfl.asfreq(newfreq) diff --git a/tests/core/pfline/test_pfline_init.py b/tests/core/pfline/test_pfline_init.py index 76e1f63..a3b8d0d 100644 --- a/tests/core/pfline/test_pfline_init.py +++ b/tests/core/pfline/test_pfline_init.py @@ -253,3 +253,33 @@ def test_init_with_integers(col: str): pfl = pf.PfLine(s) for dtype in pfl.df.pint.dequantify().dtypes.values: assert not pd.api.types.is_integer_dtype(dtype) + + +@pytest.mark.parametrize("inclusive", ["left", "both"]) +@pytest.mark.parametrize("freq", ["15T", "H"]) +def test_contain_whole_day(inclusive: str, freq: str): + """An index must contain full days. + For hourly-or-shorter values, this means that the start time of the first period () must equal the end time of the + last period (), which is not the case.""" + index = pd.date_range( + "2020-01-01", "2020-02-01", freq=freq, tz="Europe/Berlin", inclusive=inclusive + ) + if inclusive == "left": + # This should work without any error + pfl = dev.get_flatpfline(index) + assert isinstance(pfl, PfLine) + else: + # For "both" inclusive, it should raise an error + with pytest.raises(ValueError): + pfl = dev.get_flatpfline(index) + + +@pytest.mark.parametrize("freq", ["D", "MS", "QS", "AS"]) +def test_equal_sod(freq: str): + """In an index with daily-or-longer values, all timestamps (all periods) should start at the same time .""" + i = pd.date_range("2024-03-28", freq=freq, periods=10, tz="Europe/Berlin") + s = pd.Series(range(len(i)), i) + s = s.tz_convert(None) + s_pint = s.astype("pint[MW]") + with pytest.raises(ValueError): + pf.PfLine(s_pint) diff --git a/tests/core/pfline/test_slice.py b/tests/core/pfline/test_slice.py index b237542..63447d2 100644 --- a/tests/core/pfline/test_slice.py +++ b/tests/core/pfline/test_slice.py @@ -5,19 +5,42 @@ from portfolyo import dev -@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +def get_idx( + startdate: str, + starttime: str, + enddate: str, + tz: str, + freq: str, + inclusive: str, +) -> pd.DatetimeIndex: + # Empty index. + if startdate is None: + return pd.DatetimeIndex([], freq=freq, tz=tz) + # Normal index. + ts_start = pd.Timestamp(f"{startdate} {starttime}", tz=tz) + ts_end = pd.Timestamp(f"{enddate} {starttime}", tz=tz) + return pd.date_range(ts_start, ts_end, freq=freq, inclusive=inclusive) + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D"]) @pytest.mark.parametrize( "slice_start", ["2021", "2022", "2022-01-02", "2022-05-23 14:34"] ) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) @pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) -def test_flat_slice_start(slice_start: str, freq: str, tz: str): - index = pd.date_range("2020", "2024", freq=freq, inclusive="left", tz=tz) +@pytest.mark.parametrize("inclusive", ["left", "both"]) +def test_flat_slice_start( + slice_start: str, freq: str, tz: str, sod: str, inclusive: str +): + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive=inclusive, tz=tz + ) pfl1 = dev.get_flatpfline(index) assert pfl1.slice[slice_start:] == pfl1.loc[slice_start:] @pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) -@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D"]) @pytest.mark.parametrize( "slice_end", [ @@ -28,23 +51,31 @@ def test_flat_slice_start(slice_start: str, freq: str, tz: str): ("2022-01-02", "2022-01-01"), ], ) -def test_flat_slice_end(slice_end: str, freq: str, tz: str): - index = pd.date_range("2020", "2024", freq=freq, inclusive="left", tz=tz) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +@pytest.mark.parametrize("inclusive", ["left", "both"]) +def test_flat_slice_end(slice_end: str, freq: str, tz: str, sod: str, inclusive: str): + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive=inclusive, tz=tz + ) pfl1 = dev.get_flatpfline(index) assert pfl1.slice[: slice_end[0]] == pfl1.loc[: slice_end[1]] -@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D"]) @pytest.mark.parametrize( "where", ["2022", "2022-03", "2022-04-21", "2022-05-23 14:34"], ) @pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) -def test_flat_slice_whole(where: str, freq: str, tz: str): +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +@pytest.mark.parametrize("inclusive", ["left", "both"]) +def test_flat_slice_whole(where: str, freq: str, tz: str, sod: str, inclusive: str): """Test that slicing splits the pfl in 2 non-overlapping pieces without gap (i.e., ensure that each original timestamp is in exactly one of the resulting pieces.) """ - index = pd.date_range("2020", "2024", freq=freq, inclusive="left", tz=tz) + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive=inclusive, tz=tz + ) pfl1 = dev.get_flatpfline(index) left, right = pfl1.slice[:where], pfl1.slice[where:] # Test that each timestamp is present at least once. @@ -53,24 +84,30 @@ def test_flat_slice_whole(where: str, freq: str, tz: str): assert len(left.index.intersection(right.index)) == 0 -@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D"]) @pytest.mark.parametrize( "slice_start", [ "2021", "2022", "2022-01-02", - "2022-01-02 14:30", + "2022-01-02 14:00", ], ) @pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) -def test_nested_slice_start(slice_start: str, freq: str, tz: str): - index = pd.date_range("2020", "2024", freq=freq, inclusive="left", tz=tz) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +@pytest.mark.parametrize("inclusive", ["left", "both"]) +def test_nested_slice_start( + slice_start: str, freq: str, tz: str, sod: str, inclusive: str +): + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive=inclusive, tz=tz + ) pfl1 = dev.get_nestedpfline(index) assert pfl1.slice[slice_start:] == pfl1.loc[slice_start:] -@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D"]) @pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) @pytest.mark.parametrize( "slice_end", @@ -82,26 +119,68 @@ def test_nested_slice_start(slice_start: str, freq: str, tz: str): ("2022-01-02", "2022-01-01"), ], ) -def test_nested_slice_end(slice_end: str, freq: str, tz: str): - index = pd.date_range("2020", "2024", freq=freq, inclusive="left", tz=tz) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +@pytest.mark.parametrize("inclusive", ["left", "both"]) +def test_nested_slice_end(slice_end: str, freq: str, tz: str, sod: str, inclusive: str): + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive=inclusive, tz=tz + ) pfl1 = dev.get_nestedpfline(index) assert pfl1.slice[: slice_end[0]] == pfl1.loc[: slice_end[1]] -@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D"]) @pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) @pytest.mark.parametrize( "where", ["2022", "2022-03", "2022-04-21", "2022-05-23 14:34"], ) -def test_nested_slice_whole(where: str, freq: str, tz: str): +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +@pytest.mark.parametrize("inclusive", ["left", "both"]) +def test_nested_slice_whole(where: str, freq: str, tz: str, sod: str, inclusive: str): """Test that slicing splits the pfl in 2 non-overlapping pieces without gap (i.e., ensure that each original timestamp is in exactly one of the resulting pieces.) """ - index = pd.date_range("2020", "2024", freq=freq, inclusive="left", tz=tz) + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive=inclusive, tz=tz + ) pfl1 = dev.get_nestedpfline(index) left, right = pfl1.slice[:where], pfl1.slice[where:] # Test that each timestamp is present at least once. pd.testing.assert_index_equal(left.index.union(right.index), index) # Test that no timestamp is present twice. assert len(left.index.intersection(right.index)) == 0 + + +@pytest.mark.parametrize("freq", ["H", "15T"]) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize("startdate", ["2021", "2022", "2022-01-02"]) +def test__start_less_than_daily(startdate: str, freq: str, tz: str, sod: str): + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive="left", tz=tz + ) + pfl1 = dev.get_flatpfline(index) + slice_start = f"{startdate} {sod}" + assert pfl1.slice[slice_start:] == pfl1.loc[slice_start:] + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize( + "enddate", + [ + # (, ) + ("2021", "2020-12-31"), + ("2022", "2021-12-31"), + ("2021-07", "2021-06-30"), + ("2022-01-02", "2022-01-01"), + ], +) +def test__end_less_than_daily(enddate: str, tz: str): + index = get_idx( + "2020", starttime="00:00", enddate="2024", freq="15T", inclusive="left", tz=tz + ) + pfl1 = dev.get_flatpfline(index) + slice_end = f"{enddate[0]} 00:00" + loc_end = f"{enddate[1]} 23:45" + assert pfl1.slice[:slice_end] == pfl1.loc[:loc_end] diff --git a/tests/core/pfstate/test_pfstate_init.py b/tests/core/pfstate/test_pfstate_init.py index 3f3b679..fa59ac5 100644 --- a/tests/core/pfstate/test_pfstate_init.py +++ b/tests/core/pfstate/test_pfstate_init.py @@ -18,7 +18,7 @@ s_less = dev.get_series(i_less, "") i_more = pd.date_range("2019-12-15", freq="D", periods=100) s_more = dev.get_series(i_more, "") -i_difffreq = pd.date_range("2020", freq="H", periods=80) +i_difffreq = pd.date_range("2020", freq="H", periods=24 * 5) s_difffreq = dev.get_series(i_difffreq, "") @@ -506,3 +506,22 @@ def test_pfstate_consistency_nosourcing(): pd.Series(1.0, i_ref, "pint[dimensionless]"), check_names=False, ) + + +@pytest.mark.parametrize("inclusive", ["left", "both"]) +@pytest.mark.parametrize("freq", ["15T", "H"]) +def test_contain_whole_day(inclusive: str, freq: str): + """An index must contain full days. + For hourly-or-shorter values, this means that the start time of the first period () must equal the end time of the + last period (), which is not the case.""" + index = pd.date_range( + "2020-01-01", "2020-02-01", freq=freq, tz="Europe/Berlin", inclusive=inclusive + ) + if inclusive == "left": + # This should work without any error + pfs = dev.get_pfstate(index) + assert isinstance(pfs, PfState) + else: + # For "both" inclusive, it should raise an error + with pytest.raises(ValueError): + pfs = dev.get_pfstate(index) diff --git a/tests/core/pfstate/test_slice_state.py b/tests/core/pfstate/test_slice_state.py index 39c9069..7a472c3 100644 --- a/tests/core/pfstate/test_slice_state.py +++ b/tests/core/pfstate/test_slice_state.py @@ -5,7 +5,24 @@ from portfolyo import dev -@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +def get_idx( + startdate: str, + starttime: str, + enddate: str, + tz: str, + freq: str, + inclusive: str, +) -> pd.DatetimeIndex: + # Empty index. + if startdate is None: + return pd.DatetimeIndex([], freq=freq, tz=tz) + # Normal index. + ts_start = pd.Timestamp(f"{startdate} {starttime}", tz=tz) + ts_end = pd.Timestamp(f"{enddate} {starttime}", tz=tz) + return pd.date_range(ts_start, ts_end, freq=freq, inclusive=inclusive) + + +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D"]) @pytest.mark.parametrize("slice_start", ["2021", "2022", "2022-01-02"]) @pytest.mark.parametrize( "slice_end", @@ -16,8 +33,20 @@ ("2022-01-02", "2022-01-01"), ], ) -def test_slice_state(slice_start, slice_end, freq): - index = pd.date_range("2020", "2024", freq=freq) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize("inclusive", ["left", "both"]) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +def test_slice_state( + slice_start: str, + slice_end: str, + freq: str, + sod: str, + inclusive: str, + tz: str, +): + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive=inclusive, tz=tz + ) pfs = dev.get_pfstate(index) pfs_to_concat = [pfs.slice[: slice_end[0]], pfs.slice[slice_start:]] @@ -25,7 +54,7 @@ def test_slice_state(slice_start, slice_end, freq): assert pfs_to_concat == pfs_to_concat2 -@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D"]) @pytest.mark.parametrize( "slice_start", [ @@ -35,13 +64,24 @@ def test_slice_state(slice_start, slice_end, freq): "2022-01-02 14:00", ], ) -def test_state_slice_start(slice_start, freq): - index = pd.date_range("2020", "2024", freq=freq, inclusive="left") +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize("inclusive", ["left", "both"]) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +def test_state_slice_start( + slice_start: str, + freq: str, + sod: str, + inclusive: str, + tz: str, +): + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive=inclusive, tz=tz + ) pfs = dev.get_pfstate(index) assert pfs.slice[slice_start:] == pfs.loc[slice_start:] -@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D"]) @pytest.mark.parametrize( "slice_end", [ @@ -52,25 +92,70 @@ def test_state_slice_start(slice_start, freq): ("2022-01-02", "2022-01-01"), ], ) -def test_state_slice_end(slice_end, freq): - index = pd.date_range("2020", "2024", freq=freq, inclusive="left") +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize("inclusive", ["left", "both"]) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +def test_state_slice_end(slice_end: str, freq: str, sod: str, inclusive: str, tz: str): + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive=inclusive, tz=tz + ) pfs = dev.get_pfstate(index) assert pfs.slice[: slice_end[0]] == pfs.loc[: slice_end[1]] -@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D", "15T"]) +@pytest.mark.parametrize("freq", ["MS", "AS", "QS", "D"]) @pytest.mark.parametrize( "where", ["2022", "2022-03", "2022-04-21", "2022-05-23 14:34"], ) -def test_state_slice_whole(where: str, freq: str): +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize("inclusive", ["left", "both"]) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +def test_state_slice_whole(where: str, freq: str, sod: str, inclusive: str, tz: str): """Test that slicing splits the pfl in 2 non-overlapping pieces without gap (i.e., ensure that each original timestamp is in exactly one of the resulting pieces.) """ - index = pd.date_range("2020", "2024", freq=freq, inclusive="left") + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive=inclusive, tz=tz + ) pfs = dev.get_pfstate(index) left, right = pfs.slice[:where], pfs.slice[where:] # Test that each timestamp is present at least once. pd.testing.assert_index_equal(left.index.union(right.index), index) # Test that no timestamp is present twice. assert len(left.index.intersection(right.index)) == 0 + + +@pytest.mark.parametrize("freq", ["H", "15T"]) +@pytest.mark.parametrize("sod", ["00:00", "06:00"]) +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize("startdate", ["2021", "2022", "2022-01-02"]) +def test__start_less_than_daily(startdate: str, freq: str, tz: str, sod: str): + index = get_idx( + "2020", starttime=sod, enddate="2024", freq=freq, inclusive="left", tz=tz + ) + pfl1 = dev.get_pfstate(index) + slice_start = f"{startdate} {sod}" + assert pfl1.slice[slice_start:] == pfl1.loc[slice_start:] + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin"]) +@pytest.mark.parametrize( + "enddate", + [ + # (, ) + ("2021", "2020-12-31"), + ("2022", "2021-12-31"), + ("2021-07", "2021-06-30"), + ("2022-01-02", "2022-01-01"), + ], +) +# @pytest.mark.parametrize("sod", ["00:00", "06:00"]) +def test__end_less_than_daily(enddate: str, tz: str): + index = get_idx( + "2020", starttime="00:00", enddate="2024", freq="15T", inclusive="left", tz=tz + ) + pfl1 = dev.get_pfstate(index) + slice_end = f"{enddate[0]} 00:00" + loc_end = f"{enddate[1]} 23:45" + assert pfl1.slice[:slice_end] == pfl1.loc[:loc_end] diff --git a/tests/core/test-output.xml b/tests/core/test-output.xml new file mode 100644 index 0000000..aeb9a15 --- /dev/null +++ b/tests/core/test-output.xml @@ -0,0 +1,1961 @@ +/Users/ruud.wijtvliet/.local/share/nvim/lazy/neotest-python/neotest.py --results-file /var/folders/4l/jxhd2x_x0x15bwll5w9f_5rr0000gq/T/nvim.ruud.wijtvliet/bxjGD4/9 --stream-file /var/folders/4l/jxhd2x_x0x15bwll5w9f_5rr0000gq/T/nvim.ruud.wijtvliet/bxjGD4/10 --runner pytest -- /Users/ruud.wijtvliet/python/portfolyo/tests/core/pfstate/test_slice_state.py/Users/ruud.wijtvliet/python/portfolyo/tests/core/pfstate/test_slice_state.py \ No newline at end of file diff --git a/tests/dev/test_develop.py b/tests/dev/test_develop.py index 2221b4e..8e1cd51 100644 --- a/tests/dev/test_develop.py +++ b/tests/dev/test_develop.py @@ -1,34 +1,32 @@ """Simply test if functions don't raise an error""" -import pandas as pd +import datetime as dt + import pytest from portfolyo import Kind, dev from portfolyo.core.pfline import classes -@pytest.mark.parametrize("as_str", [True, False]) @pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) @pytest.mark.parametrize( - ("freq", "start"), + ("freq", "startdate", "start_of_day"), [ - (None, None), - ("H", "2020"), - ("D", "2020"), - ("MS", "2020"), - ("QS", "2020"), - ("AS", "2020"), - ("H", "2020-04-21 15:00"), - ("D", "2020-04-21"), - ("MS", "2020-04"), - ("QS", "2020-04"), + (None, None, None), + ("H", "2020", None), + ("D", "2020", None), + ("MS", "2020", None), + ("QS", "2020", None), + ("AS", "2020", None), + ("H", "2020-04-21", dt.time(hour=15)), + ("D", "2020-04-21", None), + ("MS", "2020-04", None), + ("QS", "2020-04", None), ], ) -def test_index(freq, tz, start, as_str): +def test_index(freq, tz, startdate, start_of_day): """Test index creation.""" - if not as_str: - start = pd.Timestamp(start) - _ = dev.get_index() if freq is None else dev.get_index(freq, tz, start) + _ = dev.get_index() if freq is None else dev.get_index(freq, tz, startdate) @pytest.mark.parametrize("request_unit", [True, False]) @@ -38,19 +36,23 @@ def test_index(freq, tz, start, as_str): ) @pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) @pytest.mark.parametrize( - ("freq", "start"), + ("freq", "startdate", "start_of_day"), [ - (None, None), - ("H", "2020-04-21 15:00"), - ("D", "2020-04-21"), - ("MS", "2020-04"), - ("QS", "2020-04"), - ("AS", "2020"), + (None, None, None), + ("H", "2020-04-21", dt.time(hour=15)), + ("D", "2020-04-21", None), + ("MS", "2020-04", None), + ("QS", "2020-04", None), + ("AS", "2020", None), ], ) -def test_series(freq, tz, start, name, name_has_unit, request_unit): +def test_series(freq, tz, startdate, name, name_has_unit, request_unit, start_of_day): """Test series creation.""" - i = None if freq is None else dev.get_index(freq, tz, start) + i = ( + None + if freq is None + else dev.get_index(freq, tz, startdate, start_of_day=start_of_day) + ) s = dev.get_series(i, name, request_unit) if request_unit and name_has_unit: _ = s.pint.magnitude @@ -74,19 +76,25 @@ def test_series(freq, tz, start, name, name_has_unit, request_unit): ) @pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) @pytest.mark.parametrize( - ("freq", "start"), + ("freq", "startdate", "start_of_day"), [ - (None, None), - ("H", "2020-04-21 15:00"), - ("D", "2020-04-21"), - ("MS", "2020-04"), - ("QS", "2020-04"), - ("AS", "2020"), + (None, None, None), + ("H", "2020-04-21", dt.time(hour=15)), + ("D", "2020-04-21", None), + ("MS", "2020-04", None), + ("QS", "2020-04", None), + ("AS", "2020", None), ], ) -def test_dataframe(freq, tz, start, cols, first_col_has_unit, request_unit): +def test_dataframe( + freq, tz, startdate, cols, first_col_has_unit, request_unit, start_of_day +): """Test dataframe creation.""" - i = None if freq is None else dev.get_index(freq, tz, start) + i = ( + None + if freq is None + else dev.get_index(freq, tz, startdate, start_of_day=start_of_day) + ) df = dev.get_dataframe(i, cols, request_unit) unit = df.pint.dequantify().columns.get_level_values("unit")[0] if request_unit and first_col_has_unit: @@ -98,19 +106,23 @@ def test_dataframe(freq, tz, start, cols, first_col_has_unit, request_unit): @pytest.mark.parametrize("kind", [Kind.COMPLETE, Kind.VOLUME, Kind.PRICE]) @pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) @pytest.mark.parametrize( - ("freq", "start"), + ("freq", "startdate", "start_of_day"), [ - (None, None), - ("H", "2020-04-21 15:00"), - ("D", "2020-04-21"), - ("MS", "2020-04"), - ("QS", "2020-04"), - ("AS", "2020"), + (None, None, None), + ("H", "2020-04-21", dt.time(hour=15)), + ("D", "2020-04-21", None), + ("MS", "2020-04", None), + ("QS", "2020-04", None), + ("AS", "2020", None), ], ) -def test_flatnestedpfline(freq, tz, start, kind): +def test_flatnestedpfline(freq, tz, startdate, kind, start_of_day): """Test flatpfline and nestedpfline creation.""" - i = None if freq is None else dev.get_index(freq, tz, start) + i = ( + None + if freq is None + else dev.get_index(freq, tz, startdate, start_of_day=start_of_day) + ) _ = dev.get_flatpfline(i, kind) _ = dev.get_nestedpfline(i, kind) @@ -119,19 +131,23 @@ def test_flatnestedpfline(freq, tz, start, kind): @pytest.mark.parametrize("kind", [Kind.COMPLETE, Kind.VOLUME, Kind.PRICE]) @pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) @pytest.mark.parametrize( - ("freq", "start"), + ("freq", "startdate", "start_of_day"), [ - (None, None), - ("H", "2020-04-21 15:00"), - ("D", "2020-04-21"), - ("MS", "2020-04"), - ("QS", "2020-04"), - ("AS", "2020"), + (None, None, None), + ("H", "2020-04-21", dt.time(hour=15)), + ("D", "2020-04-21", None), + ("MS", "2020-04", None), + ("QS", "2020-04", None), + ("AS", "2020", None), ], ) -def test_pfline(freq, tz, start, kind, max_nlevels): +def test_pfline(freq, tz, startdate, kind, max_nlevels, start_of_day): """Test that pfline can be created.""" - i = None if freq is None else dev.get_index(freq, tz, start) + i = ( + None + if freq is None + else dev.get_index(freq, tz, startdate, start_of_day=start_of_day) + ) pfl = dev.get_randompfline(i, kind, max_nlevels) if max_nlevels == 1: assert isinstance(pfl, classes.FlatPfLine) diff --git a/tests/tools/test_right.py b/tests/tools/test_right.py index 15271c2..b4db911 100644 --- a/tests/tools/test_right.py +++ b/tests/tools/test_right.py @@ -41,35 +41,35 @@ ("2020-04-21 06:00", "D", "2020-04-22 06:00"), ] -TESTCASES_DST = [ # ts, freq, expected_ts_right +TESTCASES_DST = [ # ts, freq, expected_ts_right, periods # Start of DST. - ("2020-03-29 01:00", "15T", "2020-03-29 01:15"), - ("2020-03-29 01:00", "H", "2020-03-29 03:00"), - ("2020-03-29 00:00", "D", "2020-03-30 00:00"), - ("2020-03-29 01:00", "D", "2020-03-30 01:00"), - ("2020-03-29 03:00", "D", "2020-03-30 03:00"), - ("2020-03-29 06:00", "D", "2020-03-30 06:00"), - ("2020-03-01 00:00", "MS", "2020-04-01 00:00"), - ("2020-03-01 06:00", "MS", "2020-04-01 06:00"), - ("2020-01-01 00:00", "QS", "2020-04-01 00:00"), - ("2020-01-01 06:00", "QS", "2020-04-01 06:00"), + ("2020-03-29 01:00", "15T", "2020-03-29 01:15", 92 + 9 * 96), + ("2020-03-29 01:00", "H", "2020-03-29 03:00", 23 + 9 * 24), + ("2020-03-29 00:00", "D", "2020-03-30 00:00", None), + ("2020-03-29 01:00", "D", "2020-03-30 01:00", None), + ("2020-03-29 03:00", "D", "2020-03-30 03:00", None), + ("2020-03-29 06:00", "D", "2020-03-30 06:00", None), + ("2020-03-01 00:00", "MS", "2020-04-01 00:00", None), + ("2020-03-01 06:00", "MS", "2020-04-01 06:00", None), + ("2020-01-01 00:00", "QS", "2020-04-01 00:00", None), + ("2020-01-01 06:00", "QS", "2020-04-01 06:00", None), # End of DST. - ("2020-10-25 01:00", "15T", "2020-10-25 01:15+0200"), - ("2020-10-25 02:00+0200", "15T", "2020-10-25 02:15+0200"), - ("2020-10-25 02:00+0100", "15T", "2020-10-25 02:15+0100"), - ("2020-10-25 03:00", "15T", "2020-10-25 03:15"), - ("2020-10-25 01:00", "H", "2020-10-25 02:00+0200"), - ("2020-10-25 02:00+0200", "H", "2020-10-25 02:00+0100"), - ("2020-10-25 02:00+0100", "H", "2020-10-25 03:00"), - ("2020-10-25 03:00", "H", "2020-10-25 04:00"), - ("2020-10-25 00:00", "D", "2020-10-26 00:00"), - ("2020-10-25 01:00", "D", "2020-10-26 01:00"), - ("2020-10-25 03:00", "D", "2020-10-26 03:00"), - ("2020-10-25 06:00", "D", "2020-10-26 06:00"), - ("2020-10-01 00:00", "MS", "2020-11-01 00:00"), - ("2020-10-01 06:00", "MS", "2020-11-01 06:00"), - ("2020-10-01 00:00", "QS", "2021-01-01 00:00"), - ("2020-10-01 06:00", "QS", "2021-01-01 06:00"), + ("2020-10-25 01:00", "15T", "2020-10-25 01:15+0200", 100 + 9 * 96), + ("2020-10-25 02:00+0200", "15T", "2020-10-25 02:15+0200", 100 + 9 * 96), + ("2020-10-25 02:00+0100", "15T", "2020-10-25 02:15+0100", 10 * 96), + ("2020-10-25 03:00", "15T", "2020-10-25 03:15", 10 * 96), + ("2020-10-25 01:00", "H", "2020-10-25 02:00+0200", 25 + 9 * 24), + ("2020-10-25 02:00+0200", "H", "2020-10-25 02:00+0100", 25 + 9 * 24), + ("2020-10-25 02:00+0100", "H", "2020-10-25 03:00", 10 * 24), + ("2020-10-25 03:00", "H", "2020-10-25 04:00", 10 * 24), + ("2020-10-25 00:00", "D", "2020-10-26 00:00", None), + ("2020-10-25 01:00", "D", "2020-10-26 01:00", None), + ("2020-10-25 03:00", "D", "2020-10-26 03:00", None), + ("2020-10-25 06:00", "D", "2020-10-26 06:00", None), + ("2020-10-01 00:00", "MS", "2020-11-01 00:00", None), + ("2020-10-01 06:00", "MS", "2020-11-01 06:00", None), + ("2020-10-01 00:00", "QS", "2021-01-01 00:00", None), + ("2020-10-01 06:00", "QS", "2021-01-01 06:00", None), ] TESTCASES_15T_STAMPONLY = [ # ts, expected_ts_right @@ -89,13 +89,14 @@ @pytest.mark.parametrize(("ts", "freq", "expected_ts_right"), TESTCASES) def test_right_index(ts: str, freq: str, tz: str, expected_ts_right: str): """Test if right timestamp is correctly calculated for index without dst-transition.""" - do_test_index(ts, freq, tz, expected_ts_right) + do_test_index(ts, freq, tz, expected_ts_right, 96) # always integer # of days -@pytest.mark.parametrize(("ts", "freq", "expected_ts_right"), TESTCASES_DST) -def test_right_index_dst(ts: str, freq: str, expected_ts_right: str): +@pytest.mark.parametrize(("ts", "freq", "expected_ts_right", "periods"), TESTCASES_DST) +def test_right_index_dst(ts: str, freq: str, expected_ts_right: str, periods: int): """Test if right timestamp is correctly calculated for index with dst-transition.""" - do_test_index(ts, freq, "Europe/Berlin", expected_ts_right) + periods = periods or 10 + do_test_index(ts, freq, "Europe/Berlin", expected_ts_right, periods) @pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) @@ -105,8 +106,8 @@ def test_right_stamp(ts: str, freq: str, tz: str, expected_ts_right: str): do_test_stamp(ts, freq, tz, expected_ts_right) -@pytest.mark.parametrize(("ts", "freq", "expected_ts_right"), TESTCASES_DST) -def test_right_stamp_dst(ts: str, freq: str, expected_ts_right: str): +@pytest.mark.parametrize(("ts", "freq", "expected_ts_right", "periods"), TESTCASES_DST) +def test_right_stamp_dst(ts: str, freq: str, expected_ts_right: str, periods: int): """Test if right timestamp is correctly calculated for timestamp with dst-transition.""" do_test_stamp(ts, freq, "Europe/Berlin", expected_ts_right) @@ -117,15 +118,15 @@ def test_right_stamp_15T(ts: str, expected_ts_right: str): do_test_stamp(ts, "15T", "Europe/Berlin", expected_ts_right) -def do_test_index(ts, freq, tz, expected_ts_right): +def do_test_index(ts, freq, tz, expected_ts_right, periods): # Must specify timezone in timestamp (instead of index) to avoid confusion at DST-changeover. - i = pd.date_range(pd.Timestamp(ts, tz=tz), freq=freq, periods=100) + i = pd.date_range(pd.Timestamp(ts, tz=tz), freq=freq, periods=periods) result = tools.right.index(i) expected = pd.date_range( - pd.Timestamp(expected_ts_right, tz=tz), freq=freq, periods=100, name="right" + pd.Timestamp(expected_ts_right, tz=tz), freq=freq, periods=periods, name="right" ) testing.assert_index_equal(result, expected) - tools.standardize.assert_index_standardized(result, True) + tools.standardize.assert_index_standardized(result, __right=True) def do_test_stamp(ts, freq, tz, expected_ts_right): diff --git a/tests/tools/test_standardize.py b/tests/tools/test_standardize.py index 8e606bb..66851fd 100644 --- a/tests/tools/test_standardize.py +++ b/tests/tools/test_standardize.py @@ -65,26 +65,25 @@ def test_standardize_DST( if bound == "right": td = pd.Timedelta(hours=24 if freq == "D" else 0.25) iin = pd.DatetimeIndex([*iin[1:], iin[-1] + td]) - kw = {"bound": bound, "floating": False, "tz": out_tz} + kw = {"floating": False, "tz": out_tz} # Do actual tests. if isinstance(expected, pd.Series): # 1: Using expected frame: should stay the same. - result = tools.standardize.frame(expected, force) + result = tools.standardize.frame(expected, force, **kw) pd.testing.assert_series_equal(result, expected) # 2: Series. - result = tools.standardize.frame(pd.Series(in_vals, iin), force, **kw) + result = tools.standardize.frame( + pd.Series(in_vals, iin), force, bound=bound, **kw + ) pd.testing.assert_series_equal(result, expected) else: # 1: Using expected frame: should stay the same. - result = tools.standardize.frame(expected, force) + result = tools.standardize.frame(expected, force, **kw) pd.testing.assert_frame_equal(result, expected) - # 2: Dataframe with index. - result = tools.standardize.frame(pd.DataFrame({"a": in_vals}, iin), force, **kw) - pd.testing.assert_frame_equal(result, expected) - # 3: Dataframe with column that must become index. + # 2: Dataframe. result = tools.standardize.frame( - pd.DataFrame({"a": in_vals, "t": iin}), force, index_col="t", **kw + pd.DataFrame({"a": in_vals}, iin), force, bound=bound, **kw ) pd.testing.assert_frame_equal(result, expected) @@ -139,7 +138,7 @@ def test_standardize_convert(freq, in_tz, floating, series_or_df, bound, out_tz) @pytest.mark.parametrize("in_tz", [None, "Europe/Berlin"]) @pytest.mark.parametrize("floating", [True, False]) @pytest.mark.parametrize("force", ["agnostic", "aware"]) -@pytest.mark.parametrize("freq", [*tools.freq.FREQUENCIES, "Q", "30T", "M", "AS-FEB"]) +@pytest.mark.parametrize("freq", [*tools.freq.FREQUENCIES, "Q", "M", "AS-FEB"]) def test_standardize_freq(freq, in_tz, floating, series_or_df, force): """Test raising errors when passing invalid frequencies.""" out_tz = "Europe/Berlin" @@ -147,14 +146,6 @@ def test_standardize_freq(freq, in_tz, floating, series_or_df, force): # Get index. i = dev.get_index(freq, in_tz, _seed=1) - # If no timezone specified and below-daily values, the created index will have too few/many datapoints. - # if ( - # in_tz is None - # and tools.freq.up_or_down(freq, "D") == -1 - # and tools.freq.up_or_down(force_freq, "D") == 1 - # ): - # pytest.skip("edge case: too few/too many datapoints.") # don't check edge case - # Add values. fr = dev.get_series(i) if series_or_df == "series" else dev.get_dataframe(i) @@ -169,13 +160,10 @@ def test_standardize_freq(freq, in_tz, floating, series_or_df, force): @pytest.mark.parametrize("series_or_df", ["series", "df"]) -@pytest.mark.parametrize("removefrom", ["nowhere", "end", "middle"]) +@pytest.mark.parametrize("remove", ["remove_some", "remove_none"]) @pytest.mark.parametrize("in_tz", [None, "Europe/Berlin"]) @pytest.mark.parametrize("freq", tools.freq.FREQUENCIES) -@pytest.mark.parametrize( - "force_freq", [*tools.freq.FREQUENCIES[::2], "30T", "M", "AS-FEB", None] -) -def test_standardize_gaps(freq, in_tz, removefrom, series_or_df, force_freq): +def test_standardize_gaps(freq, in_tz, remove, series_or_df): """Test raising errors on index with gaps. Don't test timezone-conversion.""" force = "agnostic" if in_tz is None else "aware" out_tz = in_tz @@ -183,14 +171,8 @@ def test_standardize_gaps(freq, in_tz, removefrom, series_or_df, force_freq): # Get index. i = dev.get_index(freq, in_tz, _seed=1) - # If no timezone specified and below-daily values, the created index will have too few/many datapoints. - if in_tz is None and tools.freq.up_or_down(freq, "D") == -1: - pytest.skip("edge case: too few/too many datapoints.") # don't check edge case - - # remove timestamp from index. - if removefrom == "start": # remove from end - i = i.delete(-1) - elif removefrom == "middle": # remove from middle + # remove timestamp from middle of index. + if remove == "remove_some": i = i.delete((len(i) - 2) // 2) # Add values. @@ -199,18 +181,13 @@ def test_standardize_gaps(freq, in_tz, removefrom, series_or_df, force_freq): # See if error is raised. if ( # fr has frequency, but it's a forbidden frequency - (removefrom != "middle" and freq not in tools.freq.FREQUENCIES) - # fr has frequency, but user wants to force a different frequency - or (removefrom != "middle" and freq != force_freq and force_freq is not None) - # fr does not have frequency, and user does not specify a forced frequency - or (removefrom == "middle" and not force_freq) - # user wants to force a frequency, but it's a forbidden frequency - or (force_freq is not None and force_freq not in tools.freq.FREQUENCIES) + (remove == "remove_none" and freq not in tools.freq.FREQUENCIES) + # fr does not have frequency + or (remove == "remove_some") ): with pytest.raises(ValueError): - _ = tools.standardize.frame(fr, force, tz=out_tz, force_freq=force_freq) + _ = tools.standardize.frame(fr, force, tz=out_tz) return - result = tools.standardize.frame(fr, force, tz=out_tz, force_freq=force_freq) - expected_freq = force_freq or freq - assert result.index.freq == expected_freq + result = tools.standardize.frame(fr, force, tz=out_tz) + assert result.index.freq == freq diff --git a/tests/tools/test_startofday.py b/tests/tools/test_startofday.py index b098883..f8460ad 100644 --- a/tests/tools/test_startofday.py +++ b/tests/tools/test_startofday.py @@ -1,9 +1,13 @@ -import pytest import datetime as dt -from portfolyo import tools, testing, dev +import pandas as pd +import pytest + +from portfolyo import testing, tools ERROR_SOD_DICT = {"hour": 6, "minute": 1} # error +SOD_STRS = ["00:00", "06:00", "15:30"] +SODS = [(0, 0), (6, 0), (15, 30)] SOD_DICTS = [ {"hour": 0, "minute": 0}, {"hour": 6, "minute": 0}, @@ -34,38 +38,390 @@ def create_start_of_day(hour, minute, returntype): return dt.timedelta(hours=hour, minutes=minute) -@pytest.mark.parametrize("startdate,freq", STARTDATE_AND_FREQ) -@pytest.mark.parametrize("sod_dict", SOD_DICTS) -@pytest.mark.parametrize("returntype", ["time", "str", "timedelta"]) -@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) -def test_get_startofday(startdate, freq, tz, sod_dict, returntype): +@pytest.mark.parametrize( + "i,hour,minute", + [ + # Midnight + # . No timezone + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="MS", inclusive="left", tz=None + ), + 0, + 0, + ), + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="D", inclusive="left", tz=None + ), + 0, + 0, + ), + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="H", inclusive="left", tz=None + ), + 0, + 0, + ), + # . Europe/Berlin + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="MS", + inclusive="left", + tz="Europe/Berlin", + ), + 0, + 0, + ), + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="D", + inclusive="left", + tz="Europe/Berlin", + ), + 0, + 0, + ), + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="H", + inclusive="left", + tz="Europe/Berlin", + ), + 0, + 0, + ), + # 06:00 + # . No timezone + ( + pd.date_range( + "2020-01-01 06:00", + "2021-01-01 06:00", + freq="MS", + inclusive="left", + tz=None, + ), + 6, + 0, + ), + ( + pd.date_range( + "2020-01-01 06:00", + "2021-01-01 06:00", + freq="D", + inclusive="left", + tz=None, + ), + 6, + 0, + ), + ( + pd.date_range( + "2020-01-01 06:00", + "2021-01-01 06:00", + freq="H", + inclusive="left", + tz=None, + ), + 6, + 0, + ), + # . Europe/Berlin + ( + pd.date_range( + "2020-01-01 06:00", + "2021-01-01 06:00", + freq="MS", + inclusive="left", + tz="Europe/Berlin", + ), + 6, + 0, + ), + ( + pd.date_range( + "2020-01-01 06:30", + "2021-01-01 06:30", + freq="D", + inclusive="left", + tz="Europe/Berlin", + ), + 6, + 30, + ), + ( + pd.date_range( + "2020-01-01 06:30", + "2021-01-01 06:30", + freq="H", + inclusive="left", + tz="Europe/Berlin", + ), + 6, + 30, + ), + ], +) +@pytest.mark.parametrize("returntype", ["time", "timedelta", "str"]) +def test_get_startofday(i: pd.DatetimeIndex, hour: int, minute: int, returntype: str): """Test if start-of-day can be correctly gotten from index.""" - i = dev.get_index(freq, tz, startdate, 10, dt.time(**sod_dict), _seed=SEED) + expected = create_start_of_day(hour, minute, returntype) result = tools.startofday.get(i, returntype) - expected = create_start_of_day(**sod_dict, returntype=returntype) assert result == expected -@pytest.mark.parametrize("startdate,freq", STARTDATE_AND_FREQ) -@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) -@pytest.mark.parametrize("sod_dict_in", SOD_DICTS) -@pytest.mark.parametrize("sod_dict_out", SOD_DICTS) -def test_set_startofday(startdate, freq, tz, sod_dict_in, sod_dict_out): - """Test if start of day can be correctly set to an index.""" - periods = {"H": 240, "D": 10, "MS": 3}[freq] - start_of_day_in = create_start_of_day(**sod_dict_in, returntype="time") - start_of_day_out = create_start_of_day(**sod_dict_out, returntype="time") - i = dev.get_index(freq, tz, startdate, periods, start_of_day_in, _seed=SEED) - if freq == "H" or sod_dict_out == ERROR_SOD_DICT: - with pytest.raises(ValueError): - _ = tools.startofday.set(i, start_of_day_out) - return - - result = tools.startofday.set(i, start_of_day_out) - if start_of_day_in == start_of_day_out: +@pytest.mark.parametrize( + "i,hour,minute,expected", + [ + # Midnight + # . No timezone + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="MS", inclusive="left", tz=None + ), + 0, + 0, + None, + ), + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="D", inclusive="left", tz=None + ), + 0, + 0, + None, + ), + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="H", inclusive="left", tz=None + ), + 0, + 0, + None, + ), + # . Europe/Berlin + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="MS", + inclusive="left", + tz="Europe/Berlin", + ), + 0, + 0, + None, + ), + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="D", + inclusive="left", + tz="Europe/Berlin", + ), + 0, + 0, + None, + ), + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="H", + inclusive="left", + tz="Europe/Berlin", + ), + 0, + 0, + None, + ), + # 06:00 + # . No timezone + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="MS", inclusive="left", tz=None + ), + 6, + 0, + pd.date_range( + "2020-01-01 06:00", + "2021-01-01 06:00", + freq="MS", + inclusive="left", + tz=None, + ), + ), + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="D", inclusive="left", tz=None + ), + 6, + 0, + pd.date_range( + "2020-01-01 06:00", + "2021-01-01 06:00", + freq="D", + inclusive="left", + tz=None, + ), + ), + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="H", inclusive="left", tz=None + ), + 6, + 0, + pd.date_range( + "2020-01-01 06:00", + "2020-12-31 06:00", + freq="H", + inclusive="left", + tz=None, + ), + ), + # . Europe/Berlin + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="MS", + inclusive="left", + tz="Europe/Berlin", + ), + 6, + 0, + pd.date_range( + "2020-01-01 06:00", + "2021-01-01 06:00", + freq="MS", + inclusive="left", + tz="Europe/Berlin", + ), + ), + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="D", + inclusive="left", + tz="Europe/Berlin", + ), + 6, + 0, + pd.date_range( + "2020-01-01 06:00", + "2021-01-01 06:00", + freq="D", + inclusive="left", + tz="Europe/Berlin", + ), + ), + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="H", + inclusive="left", + tz="Europe/Berlin", + ), + 6, + 0, + pd.date_range( + "2020-01-01 06:00", + "2020-12-31 06:00", + freq="H", + inclusive="left", + tz="Europe/Berlin", + ), + ), + # 06:03 + # . No timezone + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="MS", inclusive="left", tz=None + ), + 6, + 3, + Exception, + ), + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="D", inclusive="left", tz=None + ), + 6, + 3, + Exception, + ), + ( + pd.date_range( + "2020-01-01", "2021-01-01", freq="H", inclusive="left", tz=None + ), + 6, + 3, + Exception, + ), + # . Europe/Berlin + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="MS", + inclusive="left", + tz="Europe/Berlin", + ), + 6, + 3, + Exception, + ), + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="D", + inclusive="left", + tz="Europe/Berlin", + ), + 6, + 3, + Exception, + ), + ( + pd.date_range( + "2020-01-01", + "2021-01-01", + freq="H", + inclusive="left", + tz="Europe/Berlin", + ), + 6, + 3, + Exception, + ), + ], +) +def test_set_startofday( + i: pd.DatetimeIndex, + hour: int, + minute: int, + expected: pd.DatetimeIndex, +): + """Test if start-of-day can be correctly set to index.""" + if expected is None: expected = i - else: - expected = dev.get_index( - freq, tz, startdate, periods, start_of_day_out, _seed=SEED - ) + sod = dt.time(hour=hour, minute=minute) + # Error case. + if isinstance(expected, type) and issubclass(expected, Exception): + with pytest.raises(expected): + _ = tools.startofday.set(i, sod) + return + # Normal case. + result = tools.startofday.set(i, sod) testing.assert_index_equal(result, expected) From c619cea5469a2854b2c0f6043c92d3d74d6c1082 Mon Sep 17 00:00:00 2001 From: Alina Voilova <91426818+Pizza2Pizza@users.noreply.github.com> Date: Wed, 10 Apr 2024 11:40:46 +0200 Subject: [PATCH 8/8] Concat (#83) * added slice property & tests * changed toml * created branch concat * first commit * works for flat pflines, nested not yet * draft of concat function done, need more testing though * created error_case tests for concat * wrote test_func for concat_pflines, improved the code for concat * added test cases for concat pfstates, requires approval(!) * changed test_function * change general to take iterable as argument --------- Co-authored-by: Alina Voilova --- dev_scripts/checks.py | 42 +++++ docs/core/pfline.rst | 23 +++ docs/savefig/fig_hedge.png | Bin 32613 -> 32711 bytes docs/savefig/fig_offtake.png | Bin 64383 -> 64411 bytes docs/savefig/fig_plot_pfl.png | Bin 28115 -> 28115 bytes docs/savefig/fig_plot_pfs.png | Bin 43127 -> 43127 bytes portfolyo/__init__.py | 6 +- portfolyo/core/pfline/classes.py | 2 +- portfolyo/core/pfstate/pfstate.py | 2 +- portfolyo/core/{mixins => shared}/__init__.py | 0 portfolyo/core/shared/concat.py | 149 +++++++++++++++++ .../core/{mixins => shared}/excelclipboard.py | 0 portfolyo/core/{mixins => shared}/plot.py | 0 portfolyo/core/{mixins => shared}/text.py | 0 tests/core/shared/test_concat_error_cases.py | 137 ++++++++++++++++ tests/core/shared/test_concat_pfline.py | 151 ++++++++++++++++++ tests/core/shared/test_concat_pfstate.py | 100 ++++++++++++ 17 files changed, 608 insertions(+), 4 deletions(-) create mode 100644 dev_scripts/checks.py rename portfolyo/core/{mixins => shared}/__init__.py (100%) create mode 100644 portfolyo/core/shared/concat.py rename portfolyo/core/{mixins => shared}/excelclipboard.py (100%) rename portfolyo/core/{mixins => shared}/plot.py (100%) rename portfolyo/core/{mixins => shared}/text.py (100%) create mode 100644 tests/core/shared/test_concat_error_cases.py create mode 100644 tests/core/shared/test_concat_pfline.py create mode 100644 tests/core/shared/test_concat_pfstate.py diff --git a/dev_scripts/checks.py b/dev_scripts/checks.py new file mode 100644 index 0000000..265a864 --- /dev/null +++ b/dev_scripts/checks.py @@ -0,0 +1,42 @@ +import pandas as pd +import portfolyo as pf +from portfolyo.core.shared import concat + + +def get_idx( + startdate: str, starttime: str, tz: str, freq: str, enddate: str +) -> pd.DatetimeIndex: + # Empty index. + if startdate is None: + return pd.DatetimeIndex([], freq=freq, tz=tz) + # Normal index. + ts_start = pd.Timestamp(f"{startdate} {starttime}", tz=tz) + ts_end = pd.Timestamp(f"{enddate} {starttime}", tz=tz) + return pd.date_range(ts_start, ts_end, freq=freq, inclusive="left") + + +index = pd.date_range("2020", "2024", freq="QS", inclusive="left") +# index2 = pd.date_range("2023", "2025", freq="QS", inclusive="left") +# pfl = pf.dev.get_flatpfline(index) +# pfl2 = pf.dev.get_flatpfline(index2) +# print(pfl) +# print(pfl2) + +# pfs = pf.dev.get_pfstate(index) + +# pfs2 = pf.dev.get_pfstate(index2) +# pfl3 = concat.general(pfl, pfl2) +# print(pfl3) + +# print(index) +# print(index2) + +whole_pfl = pf.dev.get_nestedpfline(index) +pfl_a = whole_pfl.slice[:"2021"] + +pfl_b = whole_pfl.slice["2021":"2022"] +pfl_c = whole_pfl.slice["2022":] +result = concat.concat_pflines(pfl_a, pfl_b, pfl_c) +result2 = concat.concat_pflines(pfl_b, pfl_c, pfl_a) +print(result) +print(result2) diff --git a/docs/core/pfline.rst b/docs/core/pfline.rst index 5a6756d..2c907cc 100644 --- a/docs/core/pfline.rst +++ b/docs/core/pfline.rst @@ -270,6 +270,29 @@ Another slicing method is implemented with the ``.slice[]`` property. The improv +Concatenation +============= + +Portfolio lines can be concatenated with the ``portfolio.concat()`` function. This only works if the input portfolio lines have contain compatible information (the same frequency, timezone, start-of-day, kind, etc) and, crucially, their indices are gapless and without overlap. To remove any overlap, use the ``.slice[]`` property. + +.. exec_code:: + + # --- hide: start --- + import portfolyo as pf, pandas as pd + index = pd.date_range('2024', freq='AS', periods=3) + input_df = pd.DataFrame({'w':[200, 220, 300], 'p': [100, 150, 200]}, index) + pfl = pf.PfLine(input_df) + # --- hide: stop --- + # continuation of previous code example + index2 = pd.date_range('2025', freq='AS', periods=3) # 2 years' overlap with pfl + pfl2 = pf.PfLine(pd.DataFrame({'w':[22, 30, 40], 'p': [15, 20, 21]}, index)) + # first two datapoints (until/excl 2026) from pfl, last two datapoints (from/incl 2026) from pfl2 + pf.concat([pfl.slice[:'2026'], pfl2.slice['2026':]]) + # --- hide: start --- + print(pf.concat([pfl.slice[:'2026'], pfl2.slice['2026':]])) + # --- hide: stop --- + + Volume-only, price-only or revenue-only ======================================= diff --git a/docs/savefig/fig_hedge.png b/docs/savefig/fig_hedge.png index c898c477d788411da4e25d083a6e39c94ae702e1..2fea7c3c50f503dfd026e57b4eb206d02733e835 100644 GIT binary patch literal 32711 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 literal 32613 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�*$ktTxQ^= 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 delta 43 zcmcb7oAL5(#t9yBMmh=^B_##LR{Hw6i6sR&`6W4-NqYH3>G}%4{~g(wmYWLzgIp3x diff --git a/docs/savefig/fig_plot_pfs.png b/docs/savefig/fig_plot_pfs.png index a00e5dedb5c03afe737427465f69ed908388476b..8ac43f358a1efca6344000a1507cac83569e32e5 100644 GIT binary patch delta 43 zcmexH6}j%B36A1Xln6e-sd1 delta 43 zcmexG}%4{~g(wCb$9si(e94 diff --git a/portfolyo/__init__.py b/portfolyo/__init__.py index a10d888..504d5e3 100644 --- a/portfolyo/__init__.py +++ b/portfolyo/__init__.py @@ -1,10 +1,9 @@ """Package to analyse and manipulate timeseries related to power and gas offtake portfolios.""" - from . import _version, dev, tools from .core import extendpandas # extend functionalty of pandas from .core import suppresswarnings -from .core.mixins.plot import plot_pfstates +from .core.shared.plot import plot_pfstates from .core.pfline import Kind, PfLine, Structure, create from .core.pfstate import PfState from .prices.hedge import hedge @@ -15,6 +14,9 @@ from .tools.tzone import force_agnostic, force_aware from .tools.unit import Q_, ureg, Unit from .tools.wavg import general as wavg +from .core.shared.concat import general as concat + +# from .core.shared.concat import general as concat VOLUME = Kind.VOLUME PRICE = Kind.PRICE diff --git a/portfolyo/core/pfline/classes.py b/portfolyo/core/pfline/classes.py index a2aa855..740bea2 100644 --- a/portfolyo/core/pfline/classes.py +++ b/portfolyo/core/pfline/classes.py @@ -8,7 +8,7 @@ import pandas as pd from ... import tools -from ..mixins import ExcelClipboardOutput, PfLinePlot, PfLineText +from ..shared import ExcelClipboardOutput, PfLinePlot, PfLineText from ..ndframelike import NDFrameLike from . import ( create, diff --git a/portfolyo/core/pfstate/pfstate.py b/portfolyo/core/pfstate/pfstate.py index ed127a4..cd634ac 100644 --- a/portfolyo/core/pfstate/pfstate.py +++ b/portfolyo/core/pfstate/pfstate.py @@ -12,7 +12,7 @@ import pandas as pd from ... import tools -from ..mixins import ExcelClipboardOutput, PfStatePlot, PfStateText +from ..shared import ExcelClipboardOutput, PfStatePlot, PfStateText from ..ndframelike import NDFrameLike from ..pfline import PfLine, create from . import pfstate_helper diff --git a/portfolyo/core/mixins/__init__.py b/portfolyo/core/shared/__init__.py similarity index 100% rename from portfolyo/core/mixins/__init__.py rename to portfolyo/core/shared/__init__.py diff --git a/portfolyo/core/shared/concat.py b/portfolyo/core/shared/concat.py new file mode 100644 index 0000000..5f105d2 --- /dev/null +++ b/portfolyo/core/shared/concat.py @@ -0,0 +1,149 @@ +# import pandas as pd +# import portfolyo as pf +from __future__ import annotations +from typing import Iterable +import pandas as pd +from portfolyo import tools + +from ..pfstate import PfState +from ..pfline.enums import Structure + +from ..pfline import PfLine, create +from .. import pfstate + + +def general(pfl_or_pfs: Iterable[PfLine | PfState]) -> None: + """ + Based on passed parameters calls either concat_pflines() or concat_pfstates(). + + Parameters + ---------- + pfl_or_pfs: Iterable[PfLine | PfState] + The input values. Can be either a list of Pflines or PfStates to concatenate. + + Returns + ------- + None + + Notes + ----- + Input portfolio lines must contain compatible information, i.e., same frequency, + timezone, start-of-day, and kind. Their indices must be gapless and without overlap. + + For nested pflines, the number and names of their children must match; concatenation + is done on a name-by-name basis. + + Concatenation returns the same result regardless of input order. + + """ + if all(isinstance(item, PfLine) for item in pfl_or_pfs): + return concat_pflines(pfl_or_pfs) + elif all(isinstance(item, PfState) for item in pfl_or_pfs): + return concat_pfstates(pfl_or_pfs) + else: + raise NotImplementedError( + "Concatenation is implemented only for PfState or PfLine." + ) + + +def concat_pflines(pfls: Iterable[PfLine]) -> PfLine: + """ + Concatenate porfolyo lines along their index. + + Parameters + ---------- + pfls: Iterable[PfLine] + The input values. + + Returns + ------- + PfLine + Concatenated version of PfLines. + + Notes + ----- + Input portfolio lines must contain compatible information, i.e., same frequency, + timezone, start-of-day, and kind. Their indices must be gapless and without overlap. + + For nested pflines, the number and names of their children must match; concatenation + is done on a name-by-name basis. + + Concatenation returns the same result regardless of input order. + """ + if len(pfls) < 2: + raise NotImplementedError( + "Cannot perform operation with less than 2 portfolio lines." + ) + if len({pfl.kind for pfl in pfls}) != 1: + raise TypeError("Not possible to concatenate PfLines of different kinds.") + if len({pfl.index.freq for pfl in pfls}) != 1: + raise TypeError("Not possible to concatenate PfLines of different frequencies.") + if len({pfl.index.tz for pfl in pfls}) != 1: + raise TypeError("Not possible to concatenate PfLines of different time zones.") + if len({tools.startofday.get(pfl.index, "str") for pfl in pfls}) != 1: + raise TypeError( + "Not possible to concatenate PfLines of different start_of_day." + ) + # we can concatenate only pflines of the same type: nested of flat + # with this test and check whether pfls are the same types and they have the same number of children + if len({pfl.structure for pfl in pfls}) != 1: + raise TypeError("Not possible to concatenate PfLines of different structures.") + if pfls[0].structure is Structure.NESTED: + child_names = pfls[0].children.keys() + for pfl in pfls: + diffs = set(child_names) ^ set(pfl.children.keys()) + if len(diffs) != 0: + raise TypeError( + "Not possible to concatenate PfLines with different children names." + ) + # If we reach here, all pfls have same kind, same number and names of children. + + # concat(a,b) and concat(b,a) should give the same result: + sorted_pfls = sorted(pfls, key=lambda pfl: pfl.index[0]) + if pfls[0].structure is Structure.FLAT: + # create flat dataframe of parent + dataframes_flat = [pfl.df for pfl in sorted_pfls] + # concatenate dataframes into one + concat_data = pd.concat(dataframes_flat, axis=0) + try: + # Call create.flatpfline() and catch any ValueError + return create.flatpfline(concat_data) + except ValueError as e: + # Handle the error + raise ValueError( + "Error by creating PfLine. PfLine is either not gapless or has overlaps" + ) from e + child_data = {} + child_names = pfls[0].children.keys() + for cname in child_names: + # for every name in children need to concatenate elements + child_values = [pfl.children[cname] for pfl in sorted_pfls] + child_data[cname] = concat_pflines(child_values) + + # create pfline from dataframes: -> + # call the constructor of pfl to check check gaplesnes and overplap + return create.nestedpfline(child_data) + + +def concat_pfstates(pfss: Iterable[PfState]) -> PfState: + """ + Concatenate porfolyo states along their index. + + Parameters + ---------- + pfss: Iterable[PfState] + The input values. + + Returns + ------- + PfState + Concatenated version of PfStates. + + """ + if len(pfss) < 2: + print("Concatenate needs at least two elements.") + return + offtakevolume = concat_pflines([pfs.offtakevolume for pfs in pfss]) + sourced = concat_pflines([pfs.sourced for pfs in pfss]) + unsourcedprice = concat_pflines([pfs.unsourcedprice for pfs in pfss]) + return pfstate.PfState(offtakevolume, unsourcedprice, sourced) diff --git a/portfolyo/core/mixins/excelclipboard.py b/portfolyo/core/shared/excelclipboard.py similarity index 100% rename from portfolyo/core/mixins/excelclipboard.py rename to portfolyo/core/shared/excelclipboard.py diff --git a/portfolyo/core/mixins/plot.py b/portfolyo/core/shared/plot.py similarity index 100% rename from portfolyo/core/mixins/plot.py rename to portfolyo/core/shared/plot.py diff --git a/portfolyo/core/mixins/text.py b/portfolyo/core/shared/text.py similarity index 100% rename from portfolyo/core/mixins/text.py rename to portfolyo/core/shared/text.py diff --git a/tests/core/shared/test_concat_error_cases.py b/tests/core/shared/test_concat_error_cases.py new file mode 100644 index 0000000..a5eb551 --- /dev/null +++ b/tests/core/shared/test_concat_error_cases.py @@ -0,0 +1,137 @@ +"""Test different error cases for concatenation of PfStates and PfLines.""" + +import pandas as pd +import pytest + + +from portfolyo import dev +from portfolyo.core.pfline.enums import Kind +from portfolyo.core.pfstate.pfstate import PfState +from portfolyo.core.shared import concat + + +def test_general(): + """Test if concatenating PfLine with PfState raises error.""" + index = pd.date_range("2020", "2024", freq="QS", inclusive="left") + index2 = pd.date_range("2024", "2025", freq="QS", inclusive="left") + pfl = dev.get_flatpfline(index) + pfs = dev.get_pfstate(index2) + with pytest.raises(NotImplementedError): + _ = concat.general([pfl, pfs]) + + +def test_diff_freq(): + """Test if concatenating of two flat PfLines with different freq raises error.""" + index = pd.date_range("2020", "2024", freq="QS", inclusive="left") + index2 = pd.date_range("2024", "2025", freq="AS", inclusive="left") + pfl = dev.get_flatpfline(index) + pfl2 = dev.get_flatpfline(index2) + with pytest.raises(TypeError): + _ = concat.concat_pflines([pfl, pfl2]) + + +def test_diff_sod(): + """Test if concatenating of two flat PfLines with different sod raises error.""" + index = pd.date_range("2020-01-01 00:00", "2024", freq="QS", inclusive="left") + index2 = pd.date_range("2024-01-01 06:00", "2025", freq="QS", inclusive="left") + pfl = dev.get_flatpfline(index) + pfl2 = dev.get_flatpfline(index2) + with pytest.raises(TypeError): + _ = concat.concat_pflines([pfl, pfl2]) + + +def test_slice_not_sod(): + """Test if concatenating of two flat PfLines with different sod raises error.""" + index = pd.date_range("2020-01-01 00:00", "2020-03-01", freq="H", inclusive="left") + index2 = pd.date_range( + "2020-02-01 06:00", "2020-04-01 06:00", freq="H", inclusive="left" + ) + pfl_a = dev.get_flatpfline(index) + pfl_b = dev.get_flatpfline(index2) + with pytest.raises(TypeError): + _ = concat.concat_pflines([pfl_a, pfl_b]) + + +def test_diff_tz(): + """Test if concatenating of two flat PfLines with different tz raises error.""" + index = pd.date_range( + "2020-01-01", "2024", freq="QS", tz="Europe/Berlin", inclusive="left" + ) + index2 = pd.date_range("2024-01-01", "2025", freq="QS", tz=None, inclusive="left") + pfl = dev.get_flatpfline(index) + pfl2 = dev.get_flatpfline(index2) + with pytest.raises(TypeError): + _ = concat.concat_pflines([pfl, pfl2]) + + +def test_diff_kind(): + """Test if concatenating of two flat PfLines with different kind raises error.""" + index = pd.date_range("2020-01-01", "2024", freq="QS", inclusive="left") + index2 = pd.date_range("2024-01-01", "2025", freq="QS", inclusive="left") + pfl = dev.get_flatpfline(index, kind=Kind.COMPLETE) + pfl2 = dev.get_flatpfline(index2, kind=Kind.VOLUME) + with pytest.raises(TypeError): + _ = concat.concat_pflines([pfl, pfl2]) + + +def test_app_lenght(): + """Test if concatenatination raises error if we pass only one parameter.""" + index = pd.date_range("2020-01-01", "2024", freq="QS", inclusive="left") + pfl = dev.get_flatpfline(index) + with pytest.raises(NotImplementedError): + _ = concat.concat_pflines([pfl]) + + +def test_concat_with_overlap(): + """Test if concatenatination raises error if there is overlap in indices of PfLines.""" + index = pd.date_range("2020-01-01", "2024", freq="QS", inclusive="left") + index2 = pd.date_range("2020-01-01", "2023", freq="QS", inclusive="left") + pfl = dev.get_flatpfline(index) + pfl2 = dev.get_flatpfline(index2) + with pytest.raises(ValueError): + _ = concat.concat_pflines([pfl, pfl2]) + + +def test_concat_with_gaps(): + """Test if concatenatination raises error if there is a gap in indices of PfLines.""" + index = pd.date_range("2020-01-01", "2023", freq="QS", inclusive="left") + index2 = pd.date_range("2024-01-01", "2025", freq="QS", inclusive="left") + pfl = dev.get_flatpfline(index) + pfl2 = dev.get_flatpfline(index2) + with pytest.raises(ValueError): + _ = concat.concat_pflines([pfl, pfl2]) + + +def test_concat_children(): + """Test if concatenating of flat PfLine with nested PfLine raises error.""" + index = pd.date_range("2020-01-01", "2024", freq="QS", inclusive="left") + index2 = pd.date_range("2024-01-01", "2025", freq="QS", inclusive="left") + pfl = dev.get_flatpfline(index) + pfl2 = dev.get_nestedpfline(index2) + with pytest.raises(TypeError): + _ = concat.concat_pflines([pfl, pfl2]) + + +def test_concat_diff_children(): + """Test if concatenating of two nested PfLines with different children raises error.""" + index = pd.date_range("2020-01-01", "2024", freq="QS", inclusive="left") + index2 = pd.date_range("2024-01-01", "2025", freq="QS", inclusive="left") + pfl = dev.get_nestedpfline(index) + pfl2 = dev.get_nestedpfline(index2).drop_child(name="a") + with pytest.raises(TypeError): + _ = concat.concat_pflines([pfl, pfl2]) + + +def test_concat_pfss(): + """Test if concatenating of Pfstate with "nested" PfState + (meaning that offtakevolume, sourced and unsourcedprice are nested Pflines) raises error. + """ + index = pd.date_range("2020-01-01", "2024", freq="QS", inclusive="left") + index2 = pd.date_range("2024-01-01", "2025", freq="QS", inclusive="left") + pfs1 = dev.get_pfstate(index) + offtakevolume = dev.get_nestedpfline(index2, kind=Kind.VOLUME) + sourced = dev.get_nestedpfline(index2, kind=Kind.COMPLETE) + unsourcedprice = dev.get_nestedpfline(index2, kind=Kind.PRICE) + pfs2 = PfState(offtakevolume, unsourcedprice, sourced) + with pytest.raises(TypeError): + _ = concat.concat_pfstates([pfs1, pfs2]) diff --git a/tests/core/shared/test_concat_pfline.py b/tests/core/shared/test_concat_pfline.py new file mode 100644 index 0000000..f066602 --- /dev/null +++ b/tests/core/shared/test_concat_pfline.py @@ -0,0 +1,151 @@ +"""Test if concatenation of PfLines works properly with different test cases.""" + +import pandas as pd +import pytest +from portfolyo import dev +from portfolyo.core.shared import concat + + +TESTCASES2 = [ # whole idx, freq, where + ( + ("2020-01-01", "2023-04-01"), + "QS", + "2022-04-01", + ), + (("2020", "2022"), "AS", "2021-01-01"), + ( + ("2020-05-01", "2023-04-01"), + "MS", + "2022-11-01", + ), + (("2022-03-20", "2022-07-28"), "D", "2022-05-28"), +] + +TESTCASES3 = [ # whole idx, freq, where + ( + ("2020-01-01", "2023-04-01"), + "QS", + ("2022-04-01", "2023-01-01"), + ), + (("2020", "2023"), "AS", ("2021-01-01", "2022-01-01")), + ( + ("2020-05-01", "2023-04-01"), + "MS", + ("2022-11-01", "2023-01-01"), + ), + (("2022-03-20", "2022-07-28"), "D", ("2022-04-28", "2022-05-15")), +] + + +def get_idx( + startdate: str, starttime: str, tz: str, freq: str, enddate: str +) -> pd.DatetimeIndex: + # Empty index. + if startdate is None: + return pd.DatetimeIndex([], freq=freq, tz=tz) + # Normal index. + ts_start = pd.Timestamp(f"{startdate} {starttime}", tz=tz) + ts_end = pd.Timestamp(f"{enddate} {starttime}", tz=tz) + return pd.date_range(ts_start, ts_end, freq=freq, inclusive="left") + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) +@pytest.mark.parametrize("starttime", ["00:00", "06:00"]) +@pytest.mark.parametrize(("whole_idx", "freq", "where"), TESTCASES2) +@pytest.mark.parametrize("test_fn", ["general", "concat_pflines"]) +def test_concat_flat_pflines( + whole_idx: str, starttime: str, tz: str, freq: str, where: str, test_fn: str +): + """Test that two flat pflines with the same attributes (i.e., same frequency, + timezone, start-of-day, and kind) get concatenated properly.""" + idx = get_idx(whole_idx[0], starttime, tz, freq, whole_idx[1]) + whole_pfl = dev.get_flatpfline(idx) + pfl_a = whole_pfl.slice[:where] + pfl_b = whole_pfl.slice[where:] + fn = concat.general if test_fn == "general" else concat.concat_pflines + result = fn([pfl_a, pfl_b]) + result2 = fn([pfl_b, pfl_a]) + assert whole_pfl == result + assert whole_pfl == result2 + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) +@pytest.mark.parametrize("starttime", ["00:00", "06:00"]) +@pytest.mark.parametrize(("whole_idx", "freq", "where"), TESTCASES2) +@pytest.mark.parametrize("test_fn", ["general", "concat_pflines"]) +def test_concat_nested_pflines( + whole_idx: str, + starttime: str, + tz: str, + freq: str, + where: str, + test_fn: str, +): + """Test that two nested pflines with the same attributes (i.e., same frequency, + timezone, start-of-day, and kind) and the same number of children and children names + get concatenated properly.""" + idx = get_idx(whole_idx[0], starttime, tz, freq, whole_idx[1]) + whole_pfl = dev.get_nestedpfline(idx) + pfl_a = whole_pfl.slice[:where] + pfl_b = whole_pfl.slice[where:] + fn = concat.general if test_fn == "general" else concat.concat_pflines + result = fn([pfl_a, pfl_b]) + result2 = fn([pfl_b, pfl_a]) + assert whole_pfl == result + assert whole_pfl == result2 + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) +@pytest.mark.parametrize("starttime", ["00:00", "06:00"]) +@pytest.mark.parametrize(("whole_idx", "freq", "where"), TESTCASES3) +@pytest.mark.parametrize("test_fn", ["general", "concat_pflines"]) +def test_concat_three_flatpflines( + whole_idx: str, + starttime: str, + tz: str, + freq: str, + where: str, + test_fn: str, +): + """Test that three flat pflines with the same attributes (i.e., same frequency, + timezone, start-of-day, and kind) get concatenated properly.""" + idx = get_idx(whole_idx[0], starttime, tz, freq, whole_idx[1]) + whole_pfl = dev.get_flatpfline(idx) + split_one = where[0] + split_two = where[1] + pfl_a = whole_pfl.slice[:split_one] + pfl_b = whole_pfl.slice[split_one:split_two] + pfl_c = whole_pfl.slice[split_two:] + fn = concat.general if test_fn == "general" else concat.concat_pflines + result = fn([pfl_a, pfl_b, pfl_c]) + result2 = fn([pfl_b, pfl_c, pfl_a]) + assert whole_pfl == result + assert whole_pfl == result2 + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) +@pytest.mark.parametrize("starttime", ["00:00", "06:00"]) +@pytest.mark.parametrize(("whole_idx", "freq", "where"), TESTCASES3) +@pytest.mark.parametrize("test_fn", ["general", "concat_pflines"]) +def test_concat_three_nestedpflines( + whole_idx: str, + starttime: str, + tz: str, + freq: str, + where: str, + test_fn: str, +): + """Test that three nested pflines with the same attributes ( aka kind, freq, sod, etc.) + and the same number of children and children names get concatenated properly.""" + idx = get_idx(whole_idx[0], starttime, tz, freq, whole_idx[1]) + whole_pfl = dev.get_nestedpfline(idx) + split_one = where[0] + split_two = where[1] + pfl_a = whole_pfl.slice[:split_one] + pfl_b = whole_pfl.slice[split_one:split_two] + pfl_c = whole_pfl.slice[split_two:] + fn = concat.general if test_fn == "general" else concat.concat_pflines + result = fn([pfl_a, pfl_b, pfl_c]) + result2 = fn([pfl_b, pfl_c, pfl_a]) + assert whole_pfl == result + assert whole_pfl == result2 diff --git a/tests/core/shared/test_concat_pfstate.py b/tests/core/shared/test_concat_pfstate.py new file mode 100644 index 0000000..3ce923e --- /dev/null +++ b/tests/core/shared/test_concat_pfstate.py @@ -0,0 +1,100 @@ +"""Test if concatenation of PfStates works properly with different test cases.""" + +import pandas as pd +import pytest +from portfolyo import dev +from portfolyo.core.shared import concat + + +TESTCASES2 = [ # whole idx, freq, where + ( + ("2020-01-01", "2023-04-01"), + "QS", + "2022-04-01", + ), + (("2020", "2022"), "AS", "2021-01-01"), + ( + ("2020-05-01", "2023-04-01"), + "MS", + "2022-11-01", + ), + (("2022-03-20", "2022-07-28"), "D", "2022-05-28"), +] + +TESTCASES3 = [ # whole idx, freq, where + ( + ("2020-01-01", "2023-04-01"), + "QS", + ("2022-04-01", "2023-01-01"), + ), + (("2020", "2023"), "AS", ("2021-01-01", "2022-01-01")), + ( + ("2020-05-01", "2023-04-01"), + "MS", + ("2022-11-01", "2023-01-01"), + ), + (("2022-03-20", "2022-07-28"), "D", ("2022-04-28", "2022-05-15")), +] + + +def get_idx( + startdate: str, starttime: str, tz: str, freq: str, enddate: str +) -> pd.DatetimeIndex: + # Empty index. + if startdate is None: + return pd.DatetimeIndex([], freq=freq, tz=tz) + # Normal index. + ts_start = pd.Timestamp(f"{startdate} {starttime}", tz=tz) + ts_end = pd.Timestamp(f"{enddate} {starttime}", tz=tz) + return pd.date_range(ts_start, ts_end, freq=freq, inclusive="left") + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) +@pytest.mark.parametrize("starttime", ["00:00", "06:00"]) +@pytest.mark.parametrize(("whole_idx", "freq", "where"), TESTCASES2) +@pytest.mark.parametrize("test_fn", ["general", "concat_pfstates"]) +def test_concat_pfstates( + whole_idx: str, + starttime: str, + tz: str, + freq: str, + where: str, + test_fn: str, +): + """Test that two PfStates get concatenated properly.""" + idx = get_idx(whole_idx[0], starttime, tz, freq, whole_idx[1]) + whole_pfs = dev.get_pfstate(idx) + pfs_a = whole_pfs.slice[:where] + pfs_b = whole_pfs.slice[where:] + fn = concat.general if test_fn == "general" else concat.concat_pfstates + result = fn([pfs_a, pfs_b]) + result2 = fn([pfs_b, pfs_a]) + assert whole_pfs == result + assert whole_pfs == result2 + + +@pytest.mark.parametrize("tz", [None, "Europe/Berlin", "Asia/Kolkata"]) +@pytest.mark.parametrize("starttime", ["00:00", "06:00"]) +@pytest.mark.parametrize(("whole_idx", "freq", "where"), TESTCASES3) +@pytest.mark.parametrize("test_fn", ["general", "concat_pfstates"]) +def test_concat_three_pfstates( + whole_idx: str, + starttime: str, + tz: str, + freq: str, + where: str, + test_fn: str, +): + """Test that three PfStates get concatenated properly.""" + idx = get_idx(whole_idx[0], starttime, tz, freq, whole_idx[1]) + whole_pfs = dev.get_pfstate(idx) + split_one = where[0] + split_two = where[1] + pfs_a = whole_pfs.slice[:split_one] + pfs_b = whole_pfs.slice[split_one:split_two] + pfs_c = whole_pfs.slice[split_two:] + fn = concat.general if test_fn == "general" else concat.concat_pfstates + result = fn([pfs_a, pfs_b, pfs_c]) + result2 = fn([pfs_b, pfs_c, pfs_a]) + assert whole_pfs == result + assert whole_pfs == result2