diff --git a/.flake8 b/.flake8 index 0d2775c..c04c2c6 100644 --- a/.flake8 +++ b/.flake8 @@ -1,5 +1,5 @@ [flake8] -ignore = E203, E266, E501, W503, E741 +ignore = E501, W503 max-line-length = 88 max-complexity = 18 select = B,C,E,F,W,T4 diff --git a/.github/workflows/conda-deployment.yml b/.github/workflows/conda-deployment.yml new file mode 100644 index 0000000..86dc5cd --- /dev/null +++ b/.github/workflows/conda-deployment.yml @@ -0,0 +1,46 @@ +name: conda-deployment + +on: [push] + +jobs: + Main-package: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest] + python-version: ["3.11"] + env: + OS: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v3 + - uses: conda-incubator/setup-miniconda@v2 + with: + mamba-version: "*" + #use-mamba: true + auto-update-conda: false + environment-file: environment.yml + auto-activate-base: false + activate-environment: test + python-version: ${{ matrix.python-version }} + channels: conda-forge,defaults + channel-priority: true + show-channel-urls: true + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + architecture: x64 + + - name: Install dev-dependencies + run: | + python -m pip install -r requirements-dev.txt + + - name: Run tests + shell: bash -el {0} + run: | + conda info + conda list + conda config --show-sources + conda config --show + pytest -sv diff --git a/.github/workflows/github-release.yml b/.github/workflows/github-release.yml new file mode 100644 index 0000000..40038ab --- /dev/null +++ b/.github/workflows/github-release.yml @@ -0,0 +1,36 @@ +name: gitHub-release + +on: + workflow_dispatch: + push: + tags: + - '*' + +jobs: + create-release: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup GitHub CLI + run: | + type -p curl >/dev/null || (sudo apt update && sudo apt install curl -y) + curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \ + && sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \ + && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \ + && sudo apt update \ + && sudo apt install gh -y + + - name: Extract tag name + run: echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV + + + - name: Create GitHub Release + id: create_release + run: | + gh release create $TAG_NAME --title "$TAG_NAME" --notes-from-tag + env: + GH_TOKEN: ${{ secrets.CREATE_RELEASE }} diff --git a/.github/workflows/pypi-deployment.yml b/.github/workflows/pypi-deployment.yml new file mode 100644 index 0000000..0c05caf --- /dev/null +++ b/.github/workflows/pypi-deployment.yml @@ -0,0 +1,36 @@ +name: pypi-deployment + +on: + push: + branches: + - main + pull_request: + branches: + - main +jobs: + Run: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + python-version: ["3.9", "3.10", "3.11"] + + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} ${{ matrix.os }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + architecture: x64 + + - name: Install dependencies + run: | + pip install -r requirements.txt -r requirements-dev.txt + python setup.py install + + - name: Generate coverage report + run: | + python -m pytest -vvv --cov=statista --cov-report=xml + + - name: Upload coverage reports to Codecov with GitHub Action + uses: codecov/codecov-action@v3 diff --git a/.github/workflows/pypi-release.yml b/.github/workflows/pypi-release.yml new file mode 100644 index 0000000..46c6b6c --- /dev/null +++ b/.github/workflows/pypi-release.yml @@ -0,0 +1,34 @@ +# This workflows will upload a Python Package using Twine when a release is created +# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries + +name: pypi-release + +on: + workflow_dispatch: + release: + types: [released, published, created] + +permissions: + contents: read + +jobs: + publish: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.x" + - name: Install tools + run: | + python -m pip install --upgrade pip + pip install setuptools wheel twine + - name: Build and publish + run: | + python setup.py sdist bdist_wheel + twine upload dist/* + env: + TWINE_USERNAME: ${{ secrets.PYPI_USERS }} + TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml deleted file mode 100644 index 237bc2b..0000000 --- a/.github/workflows/pypi.yml +++ /dev/null @@ -1,30 +0,0 @@ -# This workflows will upload a Python Package using Twine when a release is created -# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries - -name: pypi-package - -on: - release: - types: [created] - -jobs: - deploy: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: "3.x" - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install setuptools wheel twine - - name: Build and publish - env: - TWINE_USERNAME: ${{ secrets.PYPI_USERS }} - TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} - run: | - python setup.py sdist bdist_wheel - twine upload dist/* diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml deleted file mode 100644 index 56e2386..0000000 --- a/.github/workflows/ubuntu.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Linux -on: - push: - branches: - - main - pull_request: - branches: - - main -jobs: - Run: - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ ubuntu-latest] - python-version: ["3.9", "3.10", "3.11"] - env: - OS: ${{ matrix.os }} - - steps: - - uses: actions/checkout@v3 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python-version }} - architecture: x64 - - name: Install poetry - run: | - pip install --user poetry==1.2.2 - export PATH="${PATH}:/root/.poetry/bin" - - - name: Install dependencies - run: | - poetry install - source `poetry env info --path`/bin/activate - - - name: Install & Lint with flake8 - run: | - pip install flake8 - flake8 --max-line-length=120 statista/*.py tests/*.py - - - name: Generate coverage report - run: | - pip install pytest - pip install pytest-cov - poetry run pytest -vvv --cov=statista --cov-report=xml - - - name: Upload coverage reports to Codecov with GitHub Action - uses: codecov/codecov-action@v3 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8729045..7b9f30c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ fail_fast: true repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.1.0 + rev: v4.5.0 hooks: - id: end-of-file-fixer name: "[py - check] validate yaml" @@ -51,14 +51,14 @@ repos: # args: [ -i, --wrap-summaries, "0" ] - repo: https://github.com/PyCQA/pydocstyle - rev: 6.1.1 + rev: 6.3.0 hooks: - id: pydocstyle name: "[py - check] pydocstyle" files: ^Hapi/ - repo: https://github.com/pycqa/flake8 - rev: 6.0.0 + rev: 6.1.0 hooks: - id: flake8 name: "[py - check] flake8" @@ -83,7 +83,7 @@ repos: # pre-commit-shell: Checks shell scripts against shellcheck. - repo: https://github.com/detailyang/pre-commit-shell - rev: v1.0.6 + rev: 1.0.5 hooks: - id: shell-lint name: "[bash - lint] shell-lint" diff --git a/HISTORY.rst b/HISTORY.rst index 22b0e90..6d809aa 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -34,3 +34,11 @@ History * add exponential and normal distributions * modify the pdf, cdf, and probability plot plots * create separate plot and confidence_interval modules. + +0.4.0 (2023-011-23) +------------------ + +* add Pearson 3 distribution +* Use setup.py instead of pyproject.toml. +* Correct pearson correlation coefficient and add documentation . +* replace the pdf and cdf by the methods from scipy package. diff --git a/README.md b/README.md index f251a31..55479bc 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ pip install git+https://github.com/MAfarrag/statista ## pip to install the last release you can easly use pip ``` -pip install statista==0.3.0 +pip install statista==0.4.0 ``` Quick start diff --git a/environment.yml b/environment.yml new file mode 100644 index 0000000..9192155 --- /dev/null +++ b/environment.yml @@ -0,0 +1,13 @@ +channels: + - conda-forge +dependencies: + - python >=3.11 + - numpy >=1.25.2 + - pip >=23.2.1 + - matplotlib >=3.8.0 + - pandas >=2.1.0 + - scipy >=1.11.4 + - scikit-learn >=1.3.2 + - loguru >=0.7.2 + - pytest >=7.4.2 + - pytest-cov >=4.1.0 diff --git a/examples/Extreme value statistics.py b/examples/Extreme value statistics.py index 78443d8..774a37b 100644 --- a/examples/Extreme value statistics.py +++ b/examples/Extreme value statistics.py @@ -69,23 +69,23 @@ #%% Generalized Extreme Value (GEV) Gevdist = GEV(time_series2) # default parameter estimation method is maximum liklihood method -Param_dist = Gevdist.estimateParameter() +mle_param = Gevdist.estimateParameter(method="mle") Gevdist.ks() Gevdist.chisquare() -print(Param_dist) -shape = Param_dist[0] -loc = Param_dist[1] -scale = Param_dist[2] +print(mle_param) +shape = mle_param[0] +loc = mle_param[1] +scale = mle_param[2] # calculate and plot the pdf pdf, fig, ax = Gevdist.pdf(shape, loc, scale, plot_figure=True) cdf, _, _ = Gevdist.cdf(shape, loc, scale, plot_figure=True) #%% lmoment method -Param_dist = Gevdist.estimateParameter(method="lmoments") -print(Param_dist) -shape = Param_dist[0] -loc = Param_dist[1] -scale = Param_dist[2] +lmom_param = Gevdist.estimateParameter(method="lmoments") +print(lmom_param) +shape = lmom_param[0] +loc = lmom_param[1] +scale = lmom_param[2] # calculate and plot the pdf pdf, fig, ax = Gevdist.pdf(shape, loc, scale, plot_figure=True) cdf, _, _ = Gevdist.cdf(shape, loc, scale, plot_figure=True) diff --git a/examples/data/rhine.csv b/examples/data/rhine.csv new file mode 100644 index 0000000..ed8a878 --- /dev/null +++ b/examples/data/rhine.csv @@ -0,0 +1,62 @@ +rockenau,maxau,cologne,rees +864.07,4547.767,9590.666,9753.263 +723.215,3769.567,8182.114,8651.166 +885.58,3776.206,8972.081,9380.397 +899.729,4130.709,8864.038,9071.717 +810.59,3707.643,8071.079,8354.173 +657.29,3060.602,6059.325,6161.421 +317.901,1664.429,3379.392,3544.866 +664.918,4897.676,6960.542,7120.425 +771.302,5107.398,11096.996,11194.502 +607.715,2542.668,4558.705,4710.178 +504.546,3419.572,5268.303,5380.688 +657.765,4244.528,8166.846,8499.548 +412.049,3477.113,5345.505,5617.157 +430.275,2353.229,3569.146,3742.097 +759.009,4203.538,9867.485,10274.362 +586.914,3604.609,5788.003,6186.083 +1498.432,4488.53,12430.111,13292.6 +837.382,4451.977,7668.923,8006.946 +561.339,4368.913,6657.312,6790.353 +621.614,2907.988,5288.914,5455.554 +1106.789,5886.001,9423.463,9700.152 +723.523,3008.073,5375.765,5709.204 +1673.559,10534.625,21109.317,21416.848 +440.296,3513.78,5194.249,5363.839 +1389.102,5128.942,11933.067,12514.28 +745.07,3923.602,6964.679,7225.553 +1305.618,4834.714,12440.473,12890.64 +635.083,3269.209,7566.014,8045.471 +1507.378,7367.462,18839.956,19560.905 +724.527,3317.516,6992.191,7339.839 +624.698,3939.171,7179.259,7500.92 +1036.123,5532.896,11099.148,11532.695 +621.161,2681.054,6137.239,6639.799 +659.645,4212.49,6257.606,6341.556 +562.899,4771.264,6503.941,6533.038 +503.703,2695.5,4887.783,5113.036 +461.093,2314.033,3763.698,3854.754 +702.038,3803.766,5307.284,5477.022 +781.548,3838.486,7121.639,7310.343 +655.116,3483.401,4627.795,4670.991 +497.533,3007.102,8905.487,10346.79 +848.332,3258.229,8602.819,9039.356 +552.19,3457.171,6330.154,6480.619 +679.675,4595.554,8343.684,8425.722 +815.232,4252.016,10204.035,10647.809 +665.06,3406.22,7340.352,7565.567 +597.893,2900.832,5103.644,5456.57 +629.268,2867.873,8253.274,8713.613 +979.804,5880.644,9392.578,9305.365 +560.695,3645.365,5740.699,5948.87 +626.864,3771.042,7411.259,7638.778 +715.519,4373.225,8044.45,8576.919 +470.15,2702.219,4852.58,4959.301 +1469.607,5533.187,12127.818,12426.522 +717.686,4845.551,6884.507,6870.319 +732.114,3883.042,7630.891,7838.047 +527.367,3864.275,6019.161,6414.488 +752.283,7059.755,12471.2,13121.738 +977.327,3109.482,9556.227,9801.248 +933.936,103.584,8187.513,8745.997 +678.692,0,4411.914,0 diff --git a/examples/heavy-tail-example.py b/examples/heavy-tail-example.py new file mode 100644 index 0000000..7f41049 --- /dev/null +++ b/examples/heavy-tail-example.py @@ -0,0 +1,27 @@ +import pandas as pd + +rdir = rf"\\MYCLOUDEX2ULTRA\research\phd\heavy-tail-statistics" +from statista.distributions import GEV + +#%% +dung = pd.read_csv(f"{rdir}/dung/pdf_obs.txt", delimiter=" ") +dung.sort_values(by="ams", inplace=True) +scale = 2132.938715 +loc = 6582.059315 +shape = 0.0486556 +ams = dung["ams"].values + + +dist_positive = GEV(ams, shape, loc, scale) +pdf = dist_positive.pdf(shape, loc, scale, plot_figure=False) +dung["scipy +ve"] = pdf + +shape = -0.0486556 +dist_negative = GEV(ams, shape, loc, scale) +pdf = dist_negative.pdf(shape, loc, scale, plot_figure=False) +dung["scipy -ve"] = pdf +#%% +method = "lmoments" # "mle" +parameters_lm = dist_negative.estimateParameter(method=method) +parameters_mle = dist_negative.estimateParameter(method="mle") +#%% diff --git a/examples/lmoments.py b/examples/lmoments.py index 7712105..1e3c045 100644 --- a/examples/lmoments.py +++ b/examples/lmoments.py @@ -13,14 +13,16 @@ # sort descinding sample = np.sort(sample.reshape(n))[::-1] b0 = np.mean(sample) -b1 = np.array([(n - j - 1) * sample[j] / n / (n - 1) for j in range(n - 1)]).sum() +lmom1 = b0 +b1 = np.array([(n - j - 1) * sample[j] / n / (n - 1) for j in range(n)]).sum() +lmom2 = 2 * b1 - b0 + b2 = np.array( - [ - (n - j - 1) * (n - j - 2) * sample[j] / n / (n - 1) / (n - 2) - for j in range(n - 1) - ] + [(n - j - 1) * (n - j - 2) * sample[j] / n / (n - 1) / (n - 2) for j in range(n)] ).sum() +lmom3 = 6 * (b2 - b1) + b0 + b3 = np.array( [ (n - j - 1) @@ -34,8 +36,6 @@ for j in range(n - 1) ] ).sum() -lmom1 = b0 -lmom2 = 2 * b1 - b0 -lmom3 = 6 * (b2 - b1) + b0 + lmom4 = 20 * b3 - 30 * b2 + 12 * b1 - b0 lmom1, lmom2, lmom3, lmom4 diff --git a/examples/rhine_example.py b/examples/rhine_example.py new file mode 100644 index 0000000..c937851 --- /dev/null +++ b/examples/rhine_example.py @@ -0,0 +1,78 @@ +import matplotlib + +matplotlib.use("TkAgg") +import numpy as np +import pandas as pd +from statista.distributions import ( + GEV, + Exponential, + ConfidenceInterval, + Gumbel, + PlottingPosition, +) + +ams = pd.read_csv("examples/data/rhine.csv") +ams.head() +ams.replace(0, np.nan, inplace=True) +ams.dropna(axis=0, inplace=True) +#%% +rees_gauge = ams.loc[:, "rees"].values +cologne_gauge = ams.loc[:, "cologne"].values +maxau_gauge = ams.loc[:, "maxau"].values +rockenau_gauge = ams.loc[:, "rockenau"].values +#%% Exponential distribution (mle) +dist_obj = Exponential(cologne_gauge) +# default parameter estimation method is maximum liklihood method +mle_param = dist_obj.estimateParameter(method="mle") +dist_obj.ks() +dist_obj.chisquare() + +print(mle_param) +loc = mle_param[0] +scale = mle_param[1] +# calculate and plot the pdf +pdf, fig, ax = dist_obj.pdf(loc, scale, plot_figure=True) +cdf, _, _ = dist_obj.cdf(loc, scale, plot_figure=True) +#%% exponential distribution (lmoments) +dist_obj = Exponential(cologne_gauge) +# default parameter estimation method is maximum liklihood method +mle_param = dist_obj.estimateParameter(method="lmoments") +dist_obj.ks() +dist_obj.chisquare() + +print(mle_param) +loc = mle_param[0] +scale = mle_param[1] +# calculate and plot the pdf +pdf, fig, ax = dist_obj.pdf(loc, scale, plot_figure=True) +cdf, _, _ = dist_obj.cdf(loc, scale, plot_figure=True) +#%% GEV (mle) +gev_cologne = GEV(cologne_gauge) +# default parameter estimation method is maximum liklihood method +mle_param = gev_cologne.estimateParameter(method="mle") +gev_cologne.ks() +gev_cologne.chisquare() + +print(mle_param) +# shape = -1 * mle_param[0] +shape = mle_param[0] +loc = mle_param[1] +scale = mle_param[2] +# calculate and plot the pdf +pdf, fig, ax = gev_cologne.pdf(shape, loc, scale, plot_figure=True) +cdf, _, _ = gev_cologne.cdf(shape, loc, scale, plot_figure=True) +#%% cologne (lmoment) +gev_cologne = GEV(cologne_gauge) +# default parameter estimation method is maximum liklihood method +lmom_param = gev_cologne.estimateParameter(method="lmoments") +gev_cologne.ks() +gev_cologne.chisquare() + +print(lmom_param) +# shape = -1 * `lmom_param[0] +shape = lmom_param[0] +loc = lmom_param[1] +scale = lmom_param[2] +# calculate and plot the pdf +pdf, fig, ax = gev_cologne.pdf(shape, loc, scale, plot_figure=True) +cdf, _, _ = gev_cologne.cdf(shape, loc, scale, plot_figure=True) diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index 2e5a02c..0000000 --- a/poetry.lock +++ /dev/null @@ -1,1550 +0,0 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. - -[[package]] -name = "attrs" -version = "22.2.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.6" -files = [ - {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, - {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] -tests = ["attrs[tests-no-zope]", "zope.interface"] -tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] - -[[package]] -name = "bandit" -version = "1.7.4" -description = "Security oriented static analyser for python code." -optional = false -python-versions = ">=3.7" -files = [ - {file = "bandit-1.7.4-py3-none-any.whl", hash = "sha256:412d3f259dab4077d0e7f0c11f50f650cc7d10db905d98f6520a95a18049658a"}, - {file = "bandit-1.7.4.tar.gz", hash = "sha256:2d63a8c573417bae338962d4b9b06fbc6080f74ecd955a092849e1e65c717bd2"}, -] - -[package.dependencies] -colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} -GitPython = ">=1.0.1" -PyYAML = ">=5.3.1" -stevedore = ">=1.20.0" - -[package.extras] -test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "toml"] -toml = ["toml"] -yaml = ["PyYAML"] - -[[package]] -name = "black" -version = "23.3.0" -description = "The uncompromising code formatter." -optional = false -python-versions = ">=3.7" -files = [ - {file = "black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915"}, - {file = "black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9"}, - {file = "black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2"}, - {file = "black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c"}, - {file = "black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d"}, - {file = "black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70"}, - {file = "black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326"}, - {file = "black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b"}, - {file = "black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2"}, - {file = "black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5"}, - {file = "black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961"}, - {file = "black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266"}, - {file = "black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab"}, - {file = "black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb"}, - {file = "black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4"}, - {file = "black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "cfgv" -version = "3.3.1" -description = "Validate configuration and produce human readable error messages." -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, -] - -[[package]] -name = "classify-imports" -version = "4.2.0" -description = "Utilities for refactoring imports in python-like syntax." -optional = false -python-versions = ">=3.7" -files = [ - {file = "classify_imports-4.2.0-py2.py3-none-any.whl", hash = "sha256:dbbc264b70a470ed8c6c95976a11dfb8b7f63df44ed1af87328bbed2663f5161"}, - {file = "classify_imports-4.2.0.tar.gz", hash = "sha256:7abfb7ea92149b29d046bd34573d247ba6e68cc28100c801eba4af17964fc40e"}, -] - -[[package]] -name = "click" -version = "8.1.3" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "contourpy" -version = "1.0.7" -description = "Python library for calculating contours of 2D quadrilateral grids" -optional = false -python-versions = ">=3.8" -files = [ - {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d"}, - {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab"}, - {file = "contourpy-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69"}, - {file = "contourpy-1.0.7-cp310-cp310-win32.whl", hash = "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3"}, - {file = "contourpy-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566"}, - {file = "contourpy-1.0.7-cp311-cp311-win32.whl", hash = "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0"}, - {file = "contourpy-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd7dc0e6812b799a34f6d12fcb1000539098c249c8da54f3566c6a6461d0dbad"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0f9d350b639db6c2c233d92c7f213d94d2e444d8e8fc5ca44c9706cf72193772"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e96a08b62bb8de960d3a6afbc5ed8421bf1a2d9c85cc4ea73f4bc81b4910500f"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:031154ed61f7328ad7f97662e48660a150ef84ee1bc8876b6472af88bf5a9b98"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e9ebb4425fc1b658e13bace354c48a933b842d53c458f02c86f371cecbedecc"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efb8f6d08ca7998cf59eaf50c9d60717f29a1a0a09caa46460d33b2924839dbd"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6c180d89a28787e4b73b07e9b0e2dac7741261dbdca95f2b489c4f8f887dd810"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b8d587cc39057d0afd4166083d289bdeff221ac6d3ee5046aef2d480dc4b503c"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:769eef00437edf115e24d87f8926955f00f7704bede656ce605097584f9966dc"}, - {file = "contourpy-1.0.7-cp38-cp38-win32.whl", hash = "sha256:62398c80ef57589bdbe1eb8537127321c1abcfdf8c5f14f479dbbe27d0322e66"}, - {file = "contourpy-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:57119b0116e3f408acbdccf9eb6ef19d7fe7baf0d1e9aaa5381489bc1aa56556"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30676ca45084ee61e9c3da589042c24a57592e375d4b138bd84d8709893a1ba4"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e927b3868bd1e12acee7cc8f3747d815b4ab3e445a28d2e5373a7f4a6e76ba1"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:366a0cf0fc079af5204801786ad7a1c007714ee3909e364dbac1729f5b0849e5"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ba9bb365446a22411f0673abf6ee1fea3b2cf47b37533b970904880ceb72f3"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b0bf0c30d432278793d2141362ac853859e87de0a7dee24a1cea35231f0d50"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7281244c99fd7c6f27c1c6bfafba878517b0b62925a09b586d88ce750a016d2"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6d0f9e1d39dbfb3977f9dd79f156c86eb03e57a7face96f199e02b18e58d32a"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7f6979d20ee5693a1057ab53e043adffa1e7418d734c1532e2d9e915b08d8ec2"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5dd34c1ae752515318224cba7fc62b53130c45ac6a1040c8b7c1a223c46e8967"}, - {file = "contourpy-1.0.7-cp39-cp39-win32.whl", hash = "sha256:c5210e5d5117e9aec8c47d9156d1d3835570dd909a899171b9535cb4a3f32693"}, - {file = "contourpy-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:60835badb5ed5f4e194a6f21c09283dd6e007664a86101431bf870d9e86266c4"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce41676b3d0dd16dbcfabcc1dc46090aaf4688fd6e819ef343dbda5a57ef0161"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a011cf354107b47c58ea932d13b04d93c6d1d69b8b6dce885e642531f847566"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31a55dccc8426e71817e3fe09b37d6d48ae40aae4ecbc8c7ad59d6893569c436"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69f8ff4db108815addd900a74df665e135dbbd6547a8a69333a68e1f6e368ac2"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efe99298ba37e37787f6a2ea868265465410822f7bea163edcc1bd3903354ea9"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a1e97b86f73715e8670ef45292d7cc033548266f07d54e2183ecb3c87598888f"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc331c13902d0f50845099434cd936d49d7a2ca76cb654b39691974cb1e4812d"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24847601071f740837aefb730e01bd169fbcaa610209779a78db7ebb6e6a7051"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abf298af1e7ad44eeb93501e40eb5a67abbf93b5d90e468d01fc0c4451971afa"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:64757f6460fc55d7e16ed4f1de193f362104285c667c112b50a804d482777edd"}, - {file = "contourpy-1.0.7.tar.gz", hash = "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e"}, -] - -[package.dependencies] -numpy = ">=1.16" - -[package.extras] -bokeh = ["bokeh", "chromedriver", "selenium"] -docs = ["furo", "sphinx-copybutton"] -mypy = ["contourpy[bokeh]", "docutils-stubs", "mypy (==0.991)", "types-Pillow"] -test = ["Pillow", "matplotlib", "pytest"] -test-no-images = ["pytest"] - -[[package]] -name = "coverage" -version = "7.1.0" -description = "Code coverage measurement for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "coverage-7.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b946bbcd5a8231383450b195cfb58cb01cbe7f8949f5758566b881df4b33baf"}, - {file = "coverage-7.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec8e767f13be637d056f7e07e61d089e555f719b387a7070154ad80a0ff31801"}, - {file = "coverage-7.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4a5a5879a939cb84959d86869132b00176197ca561c664fc21478c1eee60d75"}, - {file = "coverage-7.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b643cb30821e7570c0aaf54feaf0bfb630b79059f85741843e9dc23f33aaca2c"}, - {file = "coverage-7.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32df215215f3af2c1617a55dbdfb403b772d463d54d219985ac7cd3bf124cada"}, - {file = "coverage-7.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:33d1ae9d4079e05ac4cc1ef9e20c648f5afabf1a92adfaf2ccf509c50b85717f"}, - {file = "coverage-7.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:29571503c37f2ef2138a306d23e7270687c0efb9cab4bd8038d609b5c2393a3a"}, - {file = "coverage-7.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:63ffd21aa133ff48c4dff7adcc46b7ec8b565491bfc371212122dd999812ea1c"}, - {file = "coverage-7.1.0-cp310-cp310-win32.whl", hash = "sha256:4b14d5e09c656de5038a3f9bfe5228f53439282abcab87317c9f7f1acb280352"}, - {file = "coverage-7.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:8361be1c2c073919500b6601220a6f2f98ea0b6d2fec5014c1d9cfa23dd07038"}, - {file = "coverage-7.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:da9b41d4539eefd408c46725fb76ecba3a50a3367cafb7dea5f250d0653c1040"}, - {file = "coverage-7.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5b15ed7644ae4bee0ecf74fee95808dcc34ba6ace87e8dfbf5cb0dc20eab45a"}, - {file = "coverage-7.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d12d076582507ea460ea2a89a8c85cb558f83406c8a41dd641d7be9a32e1274f"}, - {file = "coverage-7.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2617759031dae1bf183c16cef8fcfb3de7617f394c813fa5e8e46e9b82d4222"}, - {file = "coverage-7.1.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4e4881fa9e9667afcc742f0c244d9364d197490fbc91d12ac3b5de0bf2df146"}, - {file = "coverage-7.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9d58885215094ab4a86a6aef044e42994a2bd76a446dc59b352622655ba6621b"}, - {file = "coverage-7.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ffeeb38ee4a80a30a6877c5c4c359e5498eec095878f1581453202bfacc8fbc2"}, - {file = "coverage-7.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3baf5f126f30781b5e93dbefcc8271cb2491647f8283f20ac54d12161dff080e"}, - {file = "coverage-7.1.0-cp311-cp311-win32.whl", hash = "sha256:ded59300d6330be27bc6cf0b74b89ada58069ced87c48eaf9344e5e84b0072f7"}, - {file = "coverage-7.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:6a43c7823cd7427b4ed763aa7fb63901ca8288591323b58c9cd6ec31ad910f3c"}, - {file = "coverage-7.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a726d742816cb3a8973c8c9a97539c734b3a309345236cd533c4883dda05b8d"}, - {file = "coverage-7.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc7c85a150501286f8b56bd8ed3aa4093f4b88fb68c0843d21ff9656f0009d6a"}, - {file = "coverage-7.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5b4198d85a3755d27e64c52f8c95d6333119e49fd001ae5798dac872c95e0f8"}, - {file = "coverage-7.1.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddb726cb861c3117a553f940372a495fe1078249ff5f8a5478c0576c7be12050"}, - {file = "coverage-7.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:51b236e764840a6df0661b67e50697aaa0e7d4124ca95e5058fa3d7cbc240b7c"}, - {file = "coverage-7.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7ee5c9bb51695f80878faaa5598040dd6c9e172ddcf490382e8aedb8ec3fec8d"}, - {file = "coverage-7.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c31b75ae466c053a98bf26843563b3b3517b8f37da4d47b1c582fdc703112bc3"}, - {file = "coverage-7.1.0-cp37-cp37m-win32.whl", hash = "sha256:3b155caf3760408d1cb903b21e6a97ad4e2bdad43cbc265e3ce0afb8e0057e73"}, - {file = "coverage-7.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2a60d6513781e87047c3e630b33b4d1e89f39836dac6e069ffee28c4786715f5"}, - {file = "coverage-7.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2cba5c6db29ce991029b5e4ac51eb36774458f0a3b8d3137241b32d1bb91f06"}, - {file = "coverage-7.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:beeb129cacea34490ffd4d6153af70509aa3cda20fdda2ea1a2be870dfec8d52"}, - {file = "coverage-7.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c45948f613d5d18c9ec5eaa203ce06a653334cf1bd47c783a12d0dd4fd9c851"}, - {file = "coverage-7.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef382417db92ba23dfb5864a3fc9be27ea4894e86620d342a116b243ade5d35d"}, - {file = "coverage-7.1.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c7c0d0827e853315c9bbd43c1162c006dd808dbbe297db7ae66cd17b07830f0"}, - {file = "coverage-7.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e5cdbb5cafcedea04924568d990e20ce7f1945a1dd54b560f879ee2d57226912"}, - {file = "coverage-7.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9817733f0d3ea91bea80de0f79ef971ae94f81ca52f9b66500c6a2fea8e4b4f8"}, - {file = "coverage-7.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:218fe982371ac7387304153ecd51205f14e9d731b34fb0568181abaf7b443ba0"}, - {file = "coverage-7.1.0-cp38-cp38-win32.whl", hash = "sha256:04481245ef966fbd24ae9b9e537ce899ae584d521dfbe78f89cad003c38ca2ab"}, - {file = "coverage-7.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:8ae125d1134bf236acba8b83e74c603d1b30e207266121e76484562bc816344c"}, - {file = "coverage-7.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2bf1d5f2084c3932b56b962a683074a3692bce7cabd3aa023c987a2a8e7612f6"}, - {file = "coverage-7.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:98b85dd86514d889a2e3dd22ab3c18c9d0019e696478391d86708b805f4ea0fa"}, - {file = "coverage-7.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38da2db80cc505a611938d8624801158e409928b136c8916cd2e203970dde4dc"}, - {file = "coverage-7.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3164d31078fa9efe406e198aecd2a02d32a62fecbdef74f76dad6a46c7e48311"}, - {file = "coverage-7.1.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db61a79c07331e88b9a9974815c075fbd812bc9dbc4dc44b366b5368a2936063"}, - {file = "coverage-7.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ccb092c9ede70b2517a57382a601619d20981f56f440eae7e4d7eaafd1d1d09"}, - {file = "coverage-7.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:33ff26d0f6cc3ca8de13d14fde1ff8efe1456b53e3f0273e63cc8b3c84a063d8"}, - {file = "coverage-7.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d47dd659a4ee952e90dc56c97d78132573dc5c7b09d61b416a9deef4ebe01a0c"}, - {file = "coverage-7.1.0-cp39-cp39-win32.whl", hash = "sha256:d248cd4a92065a4d4543b8331660121b31c4148dd00a691bfb7a5cdc7483cfa4"}, - {file = "coverage-7.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:7ed681b0f8e8bcbbffa58ba26fcf5dbc8f79e7997595bf071ed5430d8c08d6f3"}, - {file = "coverage-7.1.0-pp37.pp38.pp39-none-any.whl", hash = "sha256:755e89e32376c850f826c425ece2c35a4fc266c081490eb0a841e7c1cb0d3bda"}, - {file = "coverage-7.1.0.tar.gz", hash = "sha256:10188fe543560ec4874f974b5305cd1a8bdcfa885ee00ea3a03733464c4ca265"}, -] - -[package.dependencies] -tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} - -[package.extras] -toml = ["tomli"] - -[[package]] -name = "cycler" -version = "0.11.0" -description = "Composable style cycles" -optional = false -python-versions = ">=3.6" -files = [ - {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, - {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, -] - -[[package]] -name = "darglint" -version = "1.8.1" -description = "A utility for ensuring Google-style docstrings stay up to date with the source code." -optional = false -python-versions = ">=3.6,<4.0" -files = [ - {file = "darglint-1.8.1-py3-none-any.whl", hash = "sha256:5ae11c259c17b0701618a20c3da343a3eb98b3bc4b5a83d31cdd94f5ebdced8d"}, - {file = "darglint-1.8.1.tar.gz", hash = "sha256:080d5106df149b199822e7ee7deb9c012b49891538f14a11be681044f0bb20da"}, -] - -[[package]] -name = "distlib" -version = "0.3.6" -description = "Distribution utilities" -optional = false -python-versions = "*" -files = [ - {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, - {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, -] - -[[package]] -name = "docutils" -version = "0.19" -description = "Docutils -- Python Documentation Utilities" -optional = false -python-versions = ">=3.7" -files = [ - {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, - {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, -] - -[[package]] -name = "exceptiongroup" -version = "1.1.0" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"}, - {file = "exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "filelock" -version = "3.9.0" -description = "A platform independent file lock." -optional = false -python-versions = ">=3.7" -files = [ - {file = "filelock-3.9.0-py3-none-any.whl", hash = "sha256:f58d535af89bb9ad5cd4df046f741f8553a418c01a7856bf0d173bbc9f6bd16d"}, - {file = "filelock-3.9.0.tar.gz", hash = "sha256:7b319f24340b51f55a2bf7a12ac0755a9b03e718311dac567a0f4f7fabd2f5de"}, -] - -[package.extras] -docs = ["furo (>=2022.12.7)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] -testing = ["covdefaults (>=2.2.2)", "coverage (>=7.0.1)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)"] - -[[package]] -name = "flake8" -version = "6.0.0" -description = "the modular source code checker: pep8 pyflakes and co" -optional = false -python-versions = ">=3.8.1" -files = [ - {file = "flake8-6.0.0-py2.py3-none-any.whl", hash = "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7"}, - {file = "flake8-6.0.0.tar.gz", hash = "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181"}, -] - -[package.dependencies] -mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.10.0,<2.11.0" -pyflakes = ">=3.0.0,<3.1.0" - -[[package]] -name = "flake8-bandit" -version = "4.1.1" -description = "Automated security testing with bandit and flake8." -optional = false -python-versions = ">=3.6" -files = [ - {file = "flake8_bandit-4.1.1-py3-none-any.whl", hash = "sha256:4c8a53eb48f23d4ef1e59293657181a3c989d0077c9952717e98a0eace43e06d"}, - {file = "flake8_bandit-4.1.1.tar.gz", hash = "sha256:068e09287189cbfd7f986e92605adea2067630b75380c6b5733dab7d87f9a84e"}, -] - -[package.dependencies] -bandit = ">=1.7.3" -flake8 = ">=5.0.0" - -[[package]] -name = "flake8-bugbear" -version = "23.6.5" -description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." -optional = false -python-versions = ">=3.8.1" -files = [ - {file = "flake8-bugbear-23.6.5.tar.gz", hash = "sha256:8631e1071c9d85d24a615f235565c16c9a2ac57add4a14636d331bf9f4ef14fa"}, - {file = "flake8_bugbear-23.6.5-py3-none-any.whl", hash = "sha256:1d9eae6d262a3823765f4579cdab169963d1d2288b02f0f5c6e829b03dded509"}, -] - -[package.dependencies] -attrs = ">=19.2.0" -flake8 = ">=6.0.0" - -[package.extras] -dev = ["coverage", "hypothesis", "hypothesmith (>=0.2)", "pre-commit", "pytest", "tox"] - -[[package]] -name = "flake8-docstrings" -version = "1.7.0" -description = "Extension for flake8 which uses pydocstyle to check docstrings" -optional = false -python-versions = ">=3.7" -files = [ - {file = "flake8_docstrings-1.7.0-py2.py3-none-any.whl", hash = "sha256:51f2344026da083fc084166a9353f5082b01f72901df422f74b4d953ae88ac75"}, - {file = "flake8_docstrings-1.7.0.tar.gz", hash = "sha256:4c8cc748dc16e6869728699e5d0d685da9a10b0ea718e090b1ba088e67a941af"}, -] - -[package.dependencies] -flake8 = ">=3" -pydocstyle = ">=2.1" - -[[package]] -name = "flake8-rst-docstrings" -version = "0.3.0" -description = "Python docstring reStructuredText (RST) validator for flake8" -optional = false -python-versions = ">=3.7" -files = [ - {file = "flake8-rst-docstrings-0.3.0.tar.gz", hash = "sha256:d1ce22b4bd37b73cd86b8d980e946ef198cfcc18ed82fedb674ceaa2f8d1afa4"}, - {file = "flake8_rst_docstrings-0.3.0-py3-none-any.whl", hash = "sha256:f8c3c6892ff402292651c31983a38da082480ad3ba253743de52989bdc84ca1c"}, -] - -[package.dependencies] -flake8 = ">=3" -pygments = "*" -restructuredtext-lint = "*" - -[package.extras] -develop = ["build", "twine"] - -[[package]] -name = "fonttools" -version = "4.38.0" -description = "Tools to manipulate font files" -optional = false -python-versions = ">=3.7" -files = [ - {file = "fonttools-4.38.0-py3-none-any.whl", hash = "sha256:820466f43c8be8c3009aef8b87e785014133508f0de64ec469e4efb643ae54fb"}, - {file = "fonttools-4.38.0.zip", hash = "sha256:2bb244009f9bf3fa100fc3ead6aeb99febe5985fa20afbfbaa2f8946c2fbdaf1"}, -] - -[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 (>=14.0.0)", "xattr", "zopfli (>=0.1.4)"] -graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "scipy"] -lxml = ["lxml (>=4.0,<5)"] -pathops = ["skia-pathops (>=0.5.0)"] -plot = ["matplotlib"] -repacker = ["uharfbuzz (>=0.23.0)"] -symfont = ["sympy"] -type1 = ["xattr"] -ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=14.0.0)"] -woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] - -[[package]] -name = "gitdb" -version = "4.0.10" -description = "Git Object Database" -optional = false -python-versions = ">=3.7" -files = [ - {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, - {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, -] - -[package.dependencies] -smmap = ">=3.0.1,<6" - -[[package]] -name = "gitpython" -version = "3.1.31" -description = "GitPython is a Python library used to interact with Git repositories" -optional = false -python-versions = ">=3.7" -files = [ - {file = "GitPython-3.1.31-py3-none-any.whl", hash = "sha256:f04893614f6aa713a60cbbe1e6a97403ef633103cdd0ef5eb6efe0deb98dbe8d"}, - {file = "GitPython-3.1.31.tar.gz", hash = "sha256:8ce3bcf69adfdf7c7d503e78fd3b1c492af782d58893b650adb2ac8912ddd573"}, -] - -[package.dependencies] -gitdb = ">=4.0.1,<5" - -[[package]] -name = "identify" -version = "2.5.18" -description = "File identification library for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "identify-2.5.18-py2.py3-none-any.whl", hash = "sha256:93aac7ecf2f6abf879b8f29a8002d3c6de7086b8c28d88e1ad15045a15ab63f9"}, - {file = "identify-2.5.18.tar.gz", hash = "sha256:89e144fa560cc4cffb6ef2ab5e9fb18ed9f9b3cb054384bab4b95c12f6c309fe"}, -] - -[package.extras] -license = ["ukkonen"] - -[[package]] -name = "importlib-resources" -version = "5.12.0" -description = "Read resources from Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, - {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, -] - -[package.dependencies] -zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "joblib" -version = "1.2.0" -description = "Lightweight pipelining with Python functions" -optional = false -python-versions = ">=3.7" -files = [ - {file = "joblib-1.2.0-py3-none-any.whl", hash = "sha256:091138ed78f800342968c523bdde947e7a305b8594b910a0fea2ab83c3c6d385"}, - {file = "joblib-1.2.0.tar.gz", hash = "sha256:e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018"}, -] - -[[package]] -name = "kiwisolver" -version = "1.4.4" -description = "A fast implementation of the Cassowary constraint solver" -optional = false -python-versions = ">=3.7" -files = [ - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, - {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, -] - -[[package]] -name = "loguru" -version = "0.7.0" -description = "Python logging made (stupidly) simple" -optional = false -python-versions = ">=3.5" -files = [ - {file = "loguru-0.7.0-py3-none-any.whl", hash = "sha256:b93aa30099fa6860d4727f1b81f8718e965bb96253fa190fab2077aaad6d15d3"}, - {file = "loguru-0.7.0.tar.gz", hash = "sha256:1612053ced6ae84d7959dd7d5e431a0532642237ec21f7fd83ac73fe539e03e1"}, -] - -[package.dependencies] -colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} -win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} - -[package.extras] -dev = ["Sphinx (==5.3.0)", "colorama (==0.4.5)", "colorama (==0.4.6)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v0.990)", "pre-commit (==3.2.1)", "pytest (==6.1.2)", "pytest (==7.2.1)", "pytest-cov (==2.12.1)", "pytest-cov (==4.0.0)", "pytest-mypy-plugins (==1.10.1)", "pytest-mypy-plugins (==1.9.3)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.2.0)", "tox (==3.27.1)", "tox (==4.4.6)"] - -[[package]] -name = "matplotlib" -version = "3.7.0" -description = "Python plotting package" -optional = false -python-versions = ">=3.8" -files = [ - {file = "matplotlib-3.7.0-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:3da8b9618188346239e51f1ea6c0f8f05c6e218cfcc30b399dd7dd7f52e8bceb"}, - {file = "matplotlib-3.7.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c0592ba57217c22987b7322df10f75ef95bc44dce781692b4b7524085de66019"}, - {file = "matplotlib-3.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:21269450243d6928da81a9bed201f0909432a74e7d0d65db5545b9fa8a0d0223"}, - {file = "matplotlib-3.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb2e76cd429058d8954121c334dddfcd11a6186c6975bca61f3f248c99031b05"}, - {file = "matplotlib-3.7.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de20eb1247725a2f889173d391a6d9e7e0f2540feda24030748283108b0478ec"}, - {file = "matplotlib-3.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5465735eaaafd1cfaec3fed60aee776aeb3fd3992aa2e49f4635339c931d443"}, - {file = "matplotlib-3.7.0-cp310-cp310-win32.whl", hash = "sha256:092e6abc80cdf8a95f7d1813e16c0e99ceda8d5b195a3ab859c680f3487b80a2"}, - {file = "matplotlib-3.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:4f640534ec2760e270801056bc0d8a10777c48b30966eef78a7c35d8590915ba"}, - {file = "matplotlib-3.7.0-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:f336e7014889c38c59029ebacc35c59236a852e4b23836708cfd3f43d1eaeed5"}, - {file = "matplotlib-3.7.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a10428d4f8d1a478ceabd652e61a175b2fdeed4175ab48da4a7b8deb561e3fa"}, - {file = "matplotlib-3.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46ca923e980f76d34c1c633343a72bb042d6ba690ecc649aababf5317997171d"}, - {file = "matplotlib-3.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c849aa94ff2a70fb71f318f48a61076d1205c6013b9d3885ade7f992093ac434"}, - {file = "matplotlib-3.7.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:827e78239292e561cfb70abf356a9d7eaf5bf6a85c97877f254009f20b892f89"}, - {file = "matplotlib-3.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:691ef1f15360e439886186d0db77b5345b24da12cbc4fc57b26c4826db4d6cab"}, - {file = "matplotlib-3.7.0-cp311-cp311-win32.whl", hash = "sha256:21a8aeac39b4a795e697265d800ce52ab59bdeb6bb23082e2d971f3041074f02"}, - {file = "matplotlib-3.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:01681566e95b9423021b49dea6a2395c16fa054604eacb87f0f4c439750f9114"}, - {file = "matplotlib-3.7.0-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:cf119eee4e57389fba5ac8b816934e95c256535e55f0b21628b4205737d1de85"}, - {file = "matplotlib-3.7.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:21bd4033c40b95abd5b8453f036ed5aa70856e56ecbd887705c37dce007a4c21"}, - {file = "matplotlib-3.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:111ef351f28fd823ed7177632070a6badd6f475607122bc9002a526f2502a0b5"}, - {file = "matplotlib-3.7.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f91d35b3ef51d29d9c661069b9e4ba431ce283ffc533b981506889e144b5b40e"}, - {file = "matplotlib-3.7.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0a776462a4a63c0bfc9df106c15a0897aa2dbab6795c693aa366e8e283958854"}, - {file = "matplotlib-3.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0dfd4a0cbd151f6439e6d7f8dca5292839ca311e7e650596d073774847ca2e4f"}, - {file = "matplotlib-3.7.0-cp38-cp38-win32.whl", hash = "sha256:56b7b79488209041a9bf7ddc34f1b069274489ce69e34dc63ae241d0d6b4b736"}, - {file = "matplotlib-3.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:8665855f3919c80551f377bc16df618ceabf3ef65270bc14b60302dce88ca9ab"}, - {file = "matplotlib-3.7.0-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:f910d924da8b9fb066b5beae0b85e34ed1b6293014892baadcf2a51da1c65807"}, - {file = "matplotlib-3.7.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:cf6346644e8fe234dc847e6232145dac199a650d3d8025b3ef65107221584ba4"}, - {file = "matplotlib-3.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d1e52365d8d5af699f04581ca191112e1d1220a9ce4386b57d807124d8b55e6"}, - {file = "matplotlib-3.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c869b646489c6a94375714032e5cec08e3aa8d3f7d4e8ef2b0fb50a52b317ce6"}, - {file = "matplotlib-3.7.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4ddac5f59e78d04b20469bc43853a8e619bb6505c7eac8ffb343ff2c516d72f"}, - {file = "matplotlib-3.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb0304c1cd802e9a25743414c887e8a7cd51d96c9ec96d388625d2cd1c137ae3"}, - {file = "matplotlib-3.7.0-cp39-cp39-win32.whl", hash = "sha256:a06a6c9822e80f323549c6bc9da96d4f233178212ad9a5f4ab87fd153077a507"}, - {file = "matplotlib-3.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:cb52aa97b92acdee090edfb65d1cb84ea60ab38e871ba8321a10bbcebc2a3540"}, - {file = "matplotlib-3.7.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3493b48e56468c39bd9c1532566dff3b8062952721b7521e1f394eb6791495f4"}, - {file = "matplotlib-3.7.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d0dcd1a0bf8d56551e8617d6dc3881d8a1c7fb37d14e5ec12cbb293f3e6170a"}, - {file = "matplotlib-3.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51fb664c37714cbaac69c16d6b3719f517a13c96c3f76f4caadd5a0aa7ed0329"}, - {file = "matplotlib-3.7.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4497d88c559b76da320b7759d64db442178beeea06a52dc0c629086982082dcd"}, - {file = "matplotlib-3.7.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9d85355c48ef8b9994293eb7c00f44aa8a43cad7a297fbf0770a25cdb2244b91"}, - {file = "matplotlib-3.7.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03eb2c8ff8d85da679b71e14c7c95d16d014c48e0c0bfa14db85f6cdc5c92aad"}, - {file = "matplotlib-3.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71b751d06b2ed1fd017de512d7439c0259822864ea16731522b251a27c0b2ede"}, - {file = "matplotlib-3.7.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b51ab8a5d5d3bbd4527af633a638325f492e09e45e78afdf816ef55217a09664"}, - {file = "matplotlib-3.7.0.tar.gz", hash = "sha256:8f6efd313430d7ef70a38a3276281cb2e8646b3a22b3b21eb227da20e15e6813"}, -] - -[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.0.1" -numpy = ">=1.20" -packaging = ">=20.0" -pillow = ">=6.2.0" -pyparsing = ">=2.3.1" -python-dateutil = ">=2.7" - -[[package]] -name = "mccabe" -version = "0.7.0" -description = "McCabe checker, plugin for flake8" -optional = false -python-versions = ">=3.6" -files = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "nodeenv" -version = "1.7.0" -description = "Node.js virtual environment builder" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" -files = [ - {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, - {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, -] - -[package.dependencies] -setuptools = "*" - -[[package]] -name = "numpy" -version = "1.24.3" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, - {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, - {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, - {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, - {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, - {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, - {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, - {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, - {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, - {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, - {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, - {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, - {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, - {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, - {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, - {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, - {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, - {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, - {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, - {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, - {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, - {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, - {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, - {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, - {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, -] - -[[package]] -name = "packaging" -version = "23.0" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, - {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, -] - -[[package]] -name = "pandas" -version = "2.0.2" -description = "Powerful data structures for data analysis, time series, and statistics" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pandas-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ebb9f1c22ddb828e7fd017ea265a59d80461d5a79154b49a4207bd17514d122"}, - {file = "pandas-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1eb09a242184092f424b2edd06eb2b99d06dc07eeddff9929e8667d4ed44e181"}, - {file = "pandas-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7319b6e68de14e6209460f72a8d1ef13c09fb3d3ef6c37c1e65b35d50b5c145"}, - {file = "pandas-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd46bde7309088481b1cf9c58e3f0e204b9ff9e3244f441accd220dd3365ce7c"}, - {file = "pandas-2.0.2-cp310-cp310-win32.whl", hash = "sha256:51a93d422fbb1bd04b67639ba4b5368dffc26923f3ea32a275d2cc450f1d1c86"}, - {file = "pandas-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:66d00300f188fa5de73f92d5725ced162488f6dc6ad4cecfe4144ca29debe3b8"}, - {file = "pandas-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02755de164da6827764ceb3bbc5f64b35cb12394b1024fdf88704d0fa06e0e2f"}, - {file = "pandas-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0a1e0576611641acde15c2322228d138258f236d14b749ad9af498ab69089e2d"}, - {file = "pandas-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6b5f14cd24a2ed06e14255ff40fe2ea0cfaef79a8dd68069b7ace74bd6acbba"}, - {file = "pandas-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50e451932b3011b61d2961b4185382c92cc8c6ee4658dcd4f320687bb2d000ee"}, - {file = "pandas-2.0.2-cp311-cp311-win32.whl", hash = "sha256:7b21cb72958fc49ad757685db1919021d99650d7aaba676576c9e88d3889d456"}, - {file = "pandas-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:c4af689352c4fe3d75b2834933ee9d0ccdbf5d7a8a7264f0ce9524e877820c08"}, - {file = "pandas-2.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:69167693cb8f9b3fc060956a5d0a0a8dbfed5f980d9fd2c306fb5b9c855c814c"}, - {file = "pandas-2.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:30a89d0fec4263ccbf96f68592fd668939481854d2ff9da709d32a047689393b"}, - {file = "pandas-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a18e5c72b989ff0f7197707ceddc99828320d0ca22ab50dd1b9e37db45b010c0"}, - {file = "pandas-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7376e13d28eb16752c398ca1d36ccfe52bf7e887067af9a0474de6331dd948d2"}, - {file = "pandas-2.0.2-cp38-cp38-win32.whl", hash = "sha256:6d6d10c2142d11d40d6e6c0a190b1f89f525bcf85564707e31b0a39e3b398e08"}, - {file = "pandas-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:e69140bc2d29a8556f55445c15f5794490852af3de0f609a24003ef174528b79"}, - {file = "pandas-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b42b120458636a981077cfcfa8568c031b3e8709701315e2bfa866324a83efa8"}, - {file = "pandas-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f908a77cbeef9bbd646bd4b81214cbef9ac3dda4181d5092a4aa9797d1bc7774"}, - {file = "pandas-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:713f2f70abcdade1ddd68fc91577cb090b3544b07ceba78a12f799355a13ee44"}, - {file = "pandas-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf3f0c361a4270185baa89ec7ab92ecaa355fe783791457077473f974f654df5"}, - {file = "pandas-2.0.2-cp39-cp39-win32.whl", hash = "sha256:598e9020d85a8cdbaa1815eb325a91cfff2bb2b23c1442549b8a3668e36f0f77"}, - {file = "pandas-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:77550c8909ebc23e56a89f91b40ad01b50c42cfbfab49b3393694a50549295ea"}, - {file = "pandas-2.0.2.tar.gz", hash = "sha256:dd5476b6c3fe410ee95926873f377b856dbc4e81a9c605a0dc05aaccc6a7c6c6"}, -] - -[package.dependencies] -numpy = [ - {version = ">=1.20.3", markers = "python_version < \"3.10\""}, - {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, - {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, -] -python-dateutil = ">=2.8.2" -pytz = ">=2020.1" -tzdata = ">=2022.1" - -[package.extras] -all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] -aws = ["s3fs (>=2021.08.0)"] -clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] -compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] -computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] -excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] -feather = ["pyarrow (>=7.0.0)"] -fss = ["fsspec (>=2021.07.0)"] -gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] -hdf5 = ["tables (>=3.6.1)"] -html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] -mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] -output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] -parquet = ["pyarrow (>=7.0.0)"] -performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] -plot = ["matplotlib (>=3.6.1)"] -postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] -spss = ["pyreadstat (>=1.1.2)"] -sql-other = ["SQLAlchemy (>=1.4.16)"] -test = ["hypothesis (>=6.34.2)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.6.3)"] - -[[package]] -name = "pathspec" -version = "0.11.0" -description = "Utility library for gitignore style pattern matching of file paths." -optional = false -python-versions = ">=3.7" -files = [ - {file = "pathspec-0.11.0-py3-none-any.whl", hash = "sha256:3a66eb970cbac598f9e5ccb5b2cf58930cd8e3ed86d393d541eaf2d8b1705229"}, - {file = "pathspec-0.11.0.tar.gz", hash = "sha256:64d338d4e0914e91c1792321e6907b5a593f1ab1851de7fc269557a21b30ebbc"}, -] - -[[package]] -name = "pbr" -version = "5.11.1" -description = "Python Build Reasonableness" -optional = false -python-versions = ">=2.6" -files = [ - {file = "pbr-5.11.1-py2.py3-none-any.whl", hash = "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b"}, - {file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"}, -] - -[[package]] -name = "pep8-naming" -version = "0.13.3" -description = "Check PEP-8 naming conventions, plugin for flake8" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pep8-naming-0.13.3.tar.gz", hash = "sha256:1705f046dfcd851378aac3be1cd1551c7c1e5ff363bacad707d43007877fa971"}, - {file = "pep8_naming-0.13.3-py3-none-any.whl", hash = "sha256:1a86b8c71a03337c97181917e2b472f0f5e4ccb06844a0d6f0a33522549e7a80"}, -] - -[package.dependencies] -flake8 = ">=5.0.0" - -[[package]] -name = "pillow" -version = "9.4.0" -description = "Python Imaging Library (Fork)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Pillow-9.4.0-1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b4b4e9dda4f4e4c4e6896f93e84a8f0bcca3b059de9ddf67dac3c334b1195e1"}, - {file = "Pillow-9.4.0-1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fb5c1ad6bad98c57482236a21bf985ab0ef42bd51f7ad4e4538e89a997624e12"}, - {file = "Pillow-9.4.0-1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:f0caf4a5dcf610d96c3bd32932bfac8aee61c96e60481c2a0ea58da435e25acd"}, - {file = "Pillow-9.4.0-1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:3f4cc516e0b264c8d4ccd6b6cbc69a07c6d582d8337df79be1e15a5056b258c9"}, - {file = "Pillow-9.4.0-1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b8c2f6eb0df979ee99433d8b3f6d193d9590f735cf12274c108bd954e30ca858"}, - {file = "Pillow-9.4.0-1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b70756ec9417c34e097f987b4d8c510975216ad26ba6e57ccb53bc758f490dab"}, - {file = "Pillow-9.4.0-1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:43521ce2c4b865d385e78579a082b6ad1166ebed2b1a2293c3be1d68dd7ca3b9"}, - {file = "Pillow-9.4.0-2-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:9d9a62576b68cd90f7075876f4e8444487db5eeea0e4df3ba298ee38a8d067b0"}, - {file = "Pillow-9.4.0-2-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:87708d78a14d56a990fbf4f9cb350b7d89ee8988705e58e39bdf4d82c149210f"}, - {file = "Pillow-9.4.0-2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8a2b5874d17e72dfb80d917213abd55d7e1ed2479f38f001f264f7ce7bae757c"}, - {file = "Pillow-9.4.0-2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:83125753a60cfc8c412de5896d10a0a405e0bd88d0470ad82e0869ddf0cb3848"}, - {file = "Pillow-9.4.0-2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9e5f94742033898bfe84c93c831a6f552bb629448d4072dd312306bab3bd96f1"}, - {file = "Pillow-9.4.0-2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:013016af6b3a12a2f40b704677f8b51f72cb007dac785a9933d5c86a72a7fe33"}, - {file = "Pillow-9.4.0-2-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:99d92d148dd03fd19d16175b6d355cc1b01faf80dae93c6c3eb4163709edc0a9"}, - {file = "Pillow-9.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157"}, - {file = "Pillow-9.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3049a10261d7f2b6514d35bbb7a4dfc3ece4c4de14ef5876c4b7a23a0e566d"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16a8df99701f9095bea8a6c4b3197da105df6f74e6176c5b410bc2df2fd29a57"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:94cdff45173b1919350601f82d61365e792895e3c3a3443cf99819e6fbf717a5"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ed3e4b4e1e6de75fdc16d3259098de7c6571b1a6cc863b1a49e7d3d53e036070"}, - {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5b2f8a31bd43e0f18172d8ac82347c8f37ef3e0b414431157718aa234991b28"}, - {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:09b89ddc95c248ee788328528e6a2996e09eaccddeeb82a5356e92645733be35"}, - {file = "Pillow-9.4.0-cp310-cp310-win32.whl", hash = "sha256:f09598b416ba39a8f489c124447b007fe865f786a89dbfa48bb5cf395693132a"}, - {file = "Pillow-9.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6e78171be3fb7941f9910ea15b4b14ec27725865a73c15277bc39f5ca4f8391"}, - {file = "Pillow-9.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:3fa1284762aacca6dc97474ee9c16f83990b8eeb6697f2ba17140d54b453e133"}, - {file = "Pillow-9.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eaef5d2de3c7e9b21f1e762f289d17b726c2239a42b11e25446abf82b26ac132"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4dfdae195335abb4e89cc9762b2edc524f3c6e80d647a9a81bf81e17e3fb6f0"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6abfb51a82e919e3933eb137e17c4ae9c0475a25508ea88993bb59faf82f3b35"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451f10ef963918e65b8869e17d67db5e2f4ab40e716ee6ce7129b0cde2876eab"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6663977496d616b618b6cfa43ec86e479ee62b942e1da76a2c3daa1c75933ef4"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:60e7da3a3ad1812c128750fc1bc14a7ceeb8d29f77e0a2356a8fb2aa8925287d"}, - {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:19005a8e58b7c1796bc0167862b1f54a64d3b44ee5d48152b06bb861458bc0f8"}, - {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f715c32e774a60a337b2bb8ad9839b4abf75b267a0f18806f6f4f5f1688c4b5a"}, - {file = "Pillow-9.4.0-cp311-cp311-win32.whl", hash = "sha256:b222090c455d6d1a64e6b7bb5f4035c4dff479e22455c9eaa1bdd4c75b52c80c"}, - {file = "Pillow-9.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba6612b6548220ff5e9df85261bddc811a057b0b465a1226b39bfb8550616aee"}, - {file = "Pillow-9.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5f532a2ad4d174eb73494e7397988e22bf427f91acc8e6ebf5bb10597b49c493"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dd5a9c3091a0f414a963d427f920368e2b6a4c2f7527fdd82cde8ef0bc7a327"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef21af928e807f10bf4141cad4746eee692a0dd3ff56cfb25fce076ec3cc8abe"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:847b114580c5cc9ebaf216dd8c8dbc6b00a3b7ab0131e173d7120e6deade1f57"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:653d7fb2df65efefbcbf81ef5fe5e5be931f1ee4332c2893ca638c9b11a409c4"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:46f39cab8bbf4a384ba7cb0bc8bae7b7062b6a11cfac1ca4bc144dea90d4a9f5"}, - {file = "Pillow-9.4.0-cp37-cp37m-win32.whl", hash = "sha256:7ac7594397698f77bce84382929747130765f66406dc2cd8b4ab4da68ade4c6e"}, - {file = "Pillow-9.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:46c259e87199041583658457372a183636ae8cd56dbf3f0755e0f376a7f9d0e6"}, - {file = "Pillow-9.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:0e51f608da093e5d9038c592b5b575cadc12fd748af1479b5e858045fff955a9"}, - {file = "Pillow-9.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:765cb54c0b8724a7c12c55146ae4647e0274a839fb6de7bcba841e04298e1011"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:519e14e2c49fcf7616d6d2cfc5c70adae95682ae20f0395e9280db85e8d6c4df"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d197df5489004db87d90b918033edbeee0bd6df3848a204bca3ff0a903bef837"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0845adc64fe9886db00f5ab68c4a8cd933ab749a87747555cec1c95acea64b0b"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:e1339790c083c5a4de48f688b4841f18df839eb3c9584a770cbd818b33e26d5d"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:a96e6e23f2b79433390273eaf8cc94fec9c6370842e577ab10dabdcc7ea0a66b"}, - {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7cfc287da09f9d2a7ec146ee4d72d6ea1342e770d975e49a8621bf54eaa8f30f"}, - {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d7081c084ceb58278dd3cf81f836bc818978c0ccc770cbbb202125ddabec6628"}, - {file = "Pillow-9.4.0-cp38-cp38-win32.whl", hash = "sha256:df41112ccce5d47770a0c13651479fbcd8793f34232a2dd9faeccb75eb5d0d0d"}, - {file = "Pillow-9.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7a21222644ab69ddd9967cfe6f2bb420b460dae4289c9d40ff9a4896e7c35c9a"}, - {file = "Pillow-9.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0f3269304c1a7ce82f1759c12ce731ef9b6e95b6df829dccd9fe42912cc48569"}, - {file = "Pillow-9.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb362e3b0976dc994857391b776ddaa8c13c28a16f80ac6522c23d5257156bed"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e0f87144fcbbe54297cae708c5e7f9da21a4646523456b00cc956bd4c65815"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28676836c7796805914b76b1837a40f76827ee0d5398f72f7dcc634bae7c6264"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0884ba7b515163a1a05440a138adeb722b8a6ae2c2b33aea93ea3118dd3a899e"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:53dcb50fbdc3fb2c55431a9b30caeb2f7027fcd2aeb501459464f0214200a503"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:e8c5cf126889a4de385c02a2c3d3aba4b00f70234bfddae82a5eaa3ee6d5e3e6"}, - {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c6b1389ed66cdd174d040105123a5a1bc91d0aa7059c7261d20e583b6d8cbd2"}, - {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0dd4c681b82214b36273c18ca7ee87065a50e013112eea7d78c7a1b89a739153"}, - {file = "Pillow-9.4.0-cp39-cp39-win32.whl", hash = "sha256:6d9dfb9959a3b0039ee06c1a1a90dc23bac3b430842dcb97908ddde05870601c"}, - {file = "Pillow-9.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:54614444887e0d3043557d9dbc697dbb16cfb5a35d672b7a0fcc1ed0cf1c600b"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b9b752ab91e78234941e44abdecc07f1f0d8f51fb62941d32995b8161f68cfe5"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3b56206244dc8711f7e8b7d6cad4663917cd5b2d950799425076681e8766286"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aabdab8ec1e7ca7f1434d042bf8b1e92056245fb179790dc97ed040361f16bfd"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db74f5562c09953b2c5f8ec4b7dfd3f5421f31811e97d1dbc0a7c93d6e3a24df"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e9d7747847c53a16a729b6ee5e737cf170f7a16611c143d95aa60a109a59c336"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b52ff4f4e002f828ea6483faf4c4e8deea8d743cf801b74910243c58acc6eda3"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:575d8912dca808edd9acd6f7795199332696d3469665ef26163cd090fa1f8bfa"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c4ed2ff6760e98d262e0cc9c9a7f7b8a9f61aa4d47c58835cdaf7b0b8811bb"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e621b0246192d3b9cb1dc62c78cfa4c6f6d2ddc0ec207d43c0dedecb914f152a"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8f127e7b028900421cad64f51f75c051b628db17fb00e099eb148761eed598c9"}, - {file = "Pillow-9.4.0.tar.gz", hash = "sha256:a1c2d7780448eb93fbcc3789bf3916aa5720d942e37945f4056680317f1cd23e"}, -] - -[package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinxext-opengraph"] -tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "platformdirs" -version = "3.0.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -optional = false -python-versions = ">=3.7" -files = [ - {file = "platformdirs-3.0.0-py3-none-any.whl", hash = "sha256:b1d5eb14f221506f50d6604a561f4c5786d9e80355219694a1b244bcd96f4567"}, - {file = "platformdirs-3.0.0.tar.gz", hash = "sha256:8a1228abb1ef82d788f74139988b137e78692984ec7b08eaa6c65f1723af28f9"}, -] - -[package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] - -[[package]] -name = "pluggy" -version = "1.0.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "pre-commit" -version = "3.3.3" -description = "A framework for managing and maintaining multi-language pre-commit hooks." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pre_commit-3.3.3-py2.py3-none-any.whl", hash = "sha256:10badb65d6a38caff29703362271d7dca483d01da88f9d7e05d0b97171c136cb"}, - {file = "pre_commit-3.3.3.tar.gz", hash = "sha256:a2256f489cd913d575c145132ae196fe335da32d91a8294b7afe6622335dd023"}, -] - -[package.dependencies] -cfgv = ">=2.0.0" -identify = ">=1.0.0" -nodeenv = ">=0.11.1" -pyyaml = ">=5.1" -virtualenv = ">=20.10.0" - -[[package]] -name = "pre-commit-hooks" -version = "4.4.0" -description = "Some out-of-the-box hooks for pre-commit." -optional = false -python-versions = ">=3.7" -files = [ - {file = "pre_commit_hooks-4.4.0-py2.py3-none-any.whl", hash = "sha256:fc8837335476221ccccda3d176ed6ae29fe58753ce7e8b7863f5d0f987328fc6"}, - {file = "pre_commit_hooks-4.4.0.tar.gz", hash = "sha256:7011eed8e1a25cde94693da009cba76392194cecc2f3f06c51a44ea6ad6c2af9"}, -] - -[package.dependencies] -"ruamel.yaml" = ">=0.15" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} - -[[package]] -name = "pycodestyle" -version = "2.10.0" -description = "Python style guide checker" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pycodestyle-2.10.0-py2.py3-none-any.whl", hash = "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610"}, - {file = "pycodestyle-2.10.0.tar.gz", hash = "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053"}, -] - -[[package]] -name = "pydocstyle" -version = "6.3.0" -description = "Python docstring style checker" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019"}, - {file = "pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1"}, -] - -[package.dependencies] -snowballstemmer = ">=2.2.0" - -[package.extras] -toml = ["tomli (>=1.2.3)"] - -[[package]] -name = "pyflakes" -version = "3.0.1" -description = "passive checker of Python programs" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pyflakes-3.0.1-py2.py3-none-any.whl", hash = "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf"}, - {file = "pyflakes-3.0.1.tar.gz", hash = "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd"}, -] - -[[package]] -name = "pygments" -version = "2.14.0" -description = "Pygments is a syntax highlighting package written in Python." -optional = false -python-versions = ">=3.6" -files = [ - {file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, - {file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"}, -] - -[package.extras] -plugins = ["importlib-metadata"] - -[[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -optional = false -python-versions = ">=3.6.8" -files = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - -[[package]] -name = "pytest" -version = "7.3.2" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest-7.3.2-py3-none-any.whl", hash = "sha256:cdcbd012c9312258922f8cd3f1b62a6580fdced17db6014896053d47cddf9295"}, - {file = "pytest-7.3.2.tar.gz", hash = "sha256:ee990a3cc55ba808b80795a79944756f315c67c12b56abd3ac993a7b8c17030b"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} - -[package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] - -[[package]] -name = "pytest-cov" -version = "4.1.0" -description = "Pytest plugin for measuring coverage." -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, - {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, -] - -[package.dependencies] -coverage = {version = ">=5.2.1", extras = ["toml"]} -pytest = ">=4.6" - -[package.extras] -testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] - -[[package]] -name = "python-dateutil" -version = "2.8.2" -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"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "pytz" -version = "2022.7.1" -description = "World timezone definitions, modern and historical" -optional = false -python-versions = "*" -files = [ - {file = "pytz-2022.7.1-py2.py3-none-any.whl", hash = "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a"}, - {file = "pytz-2022.7.1.tar.gz", hash = "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0"}, -] - -[[package]] -name = "pyyaml" -version = "6.0" -description = "YAML parser and emitter for Python" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] - -[[package]] -name = "reorder-python-imports" -version = "3.10.0" -description = "Tool for reordering python imports" -optional = false -python-versions = ">=3.7" -files = [ - {file = "reorder_python_imports-3.10.0-py2.py3-none-any.whl", hash = "sha256:4dbfe21e27f569384b5e43539cb5696ef161f5c43827ee5d7de69febbfacc7c6"}, - {file = "reorder_python_imports-3.10.0.tar.gz", hash = "sha256:52bf76318bcfde5c6001f442c862ccf94dcdff42c0f9ec43a2ac6f23560c60bf"}, -] - -[package.dependencies] -classify-imports = ">=4.1" - -[[package]] -name = "restructuredtext-lint" -version = "1.4.0" -description = "reStructuredText linter" -optional = false -python-versions = "*" -files = [ - {file = "restructuredtext_lint-1.4.0.tar.gz", hash = "sha256:1b235c0c922341ab6c530390892eb9e92f90b9b75046063e047cacfb0f050c45"}, -] - -[package.dependencies] -docutils = ">=0.11,<1.0" - -[[package]] -name = "ruamel-yaml" -version = "0.17.21" -description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" -optional = false -python-versions = ">=3" -files = [ - {file = "ruamel.yaml-0.17.21-py3-none-any.whl", hash = "sha256:742b35d3d665023981bd6d16b3d24248ce5df75fdb4e2924e93a05c1f8b61ca7"}, - {file = "ruamel.yaml-0.17.21.tar.gz", hash = "sha256:8b7ce697a2f212752a35c1ac414471dc16c424c9573be4926b56ff3f5d23b7af"}, -] - -[package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.2.6", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.11\""} - -[package.extras] -docs = ["ryd"] -jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] - -[[package]] -name = "ruamel-yaml-clib" -version = "0.2.7" -description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" -optional = false -python-versions = ">=3.5" -files = [ - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5859983f26d8cd7bb5c287ef452e8aacc86501487634573d260968f753e1d71"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:debc87a9516b237d0466a711b18b6ebeb17ba9f391eb7f91c649c5c4ec5006c7"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:df5828871e6648db72d1c19b4bd24819b80a755c4541d3409f0f7acd0f335c80"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:efa08d63ef03d079dcae1dfe334f6c8847ba8b645d08df286358b1f5293d24ab"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win32.whl", hash = "sha256:763d65baa3b952479c4e972669f679fe490eee058d5aa85da483ebae2009d231"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:d000f258cf42fec2b1bbf2863c61d7b8918d31ffee905da62dede869254d3b8a"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:045e0626baf1c52e5527bd5db361bc83180faaba2ff586e763d3d5982a876a9e"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:1a6391a7cabb7641c32517539ca42cf84b87b667bad38b78d4d42dd23e957c81"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:9c7617df90c1365638916b98cdd9be833d31d337dbcd722485597b43c4a215bf"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:41d0f1fa4c6830176eef5b276af04c89320ea616655d01327d5ce65e50575c94"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-win32.whl", hash = "sha256:f6d3d39611ac2e4f62c3128a9eed45f19a6608670c5a2f4f07f24e8de3441d38"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:da538167284de58a52109a9b89b8f6a53ff8437dd6dc26d33b57bf6699153122"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4b3a93bb9bc662fc1f99c5c3ea8e623d8b23ad22f861eb6fce9377ac07ad6072"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_12_0_arm64.whl", hash = "sha256:a234a20ae07e8469da311e182e70ef6b199d0fbeb6c6cc2901204dd87fb867e8"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:15910ef4f3e537eea7fe45f8a5d19997479940d9196f357152a09031c5be59f3"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:370445fd795706fd291ab00c9df38a0caed0f17a6fb46b0f607668ecb16ce763"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win32.whl", hash = "sha256:ecdf1a604009bd35c674b9225a8fa609e0282d9b896c03dd441a91e5f53b534e"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win_amd64.whl", hash = "sha256:f34019dced51047d6f70cb9383b2ae2853b7fc4dce65129a5acd49f4f9256646"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aa261c29a5545adfef9296b7e33941f46aa5bbd21164228e833412af4c9c75f"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f01da5790e95815eb5a8a138508c01c758e5f5bc0ce4286c4f7028b8dd7ac3d0"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:40d030e2329ce5286d6b231b8726959ebbe0404c92f0a578c0e2482182e38282"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c3ca1fbba4ae962521e5eb66d72998b51f0f4d0f608d3c0347a48e1af262efa7"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win32.whl", hash = "sha256:7bdb4c06b063f6fd55e472e201317a3bb6cdeeee5d5a38512ea5c01e1acbdd93"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:be2a7ad8fd8f7442b24323d24ba0b56c51219513cfa45b9ada3b87b76c374d4b"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91a789b4aa0097b78c93e3dc4b40040ba55bef518f84a40d4442f713b4094acb"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:99e77daab5d13a48a4054803d052ff40780278240a902b880dd37a51ba01a307"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3243f48ecd450eddadc2d11b5feb08aca941b5cd98c9b1db14b2fd128be8c697"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8831a2cedcd0f0927f788c5bdf6567d9dc9cc235646a434986a852af1cb54b4b"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win32.whl", hash = "sha256:3110a99e0f94a4a3470ff67fc20d3f96c25b13d24c6980ff841e82bafe827cac"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:92460ce908546ab69770b2e576e4f99fbb4ce6ab4b245345a3869a0a0410488f"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc0667c1eb8f83a3752b71b9c4ba55ef7c7058ae57022dd9b29065186a113d9"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:4a4d8d417868d68b979076a9be6a38c676eca060785abaa6709c7b31593c35d1"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf9a6bc4a0221538b1a7de3ed7bca4c93c02346853f44e1cd764be0023cd3640"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a7b301ff08055d73223058b5c46c55638917f04d21577c95e00e0c4d79201a6b"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win32.whl", hash = "sha256:d5e51e2901ec2366b79f16c2299a03e74ba4531ddcfacc1416639c557aef0ad8"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:184faeaec61dbaa3cace407cffc5819f7b977e75360e8d5ca19461cd851a5fc5"}, - {file = "ruamel.yaml.clib-0.2.7.tar.gz", hash = "sha256:1f08fd5a2bea9c4180db71678e850b995d2a5f4537be0e94557668cf0f5f9497"}, -] - -[[package]] -name = "scikit-learn" -version = "1.2.1" -description = "A set of python modules for machine learning and data mining" -optional = false -python-versions = ">=3.8" -files = [ - {file = "scikit-learn-1.2.1.tar.gz", hash = "sha256:fbf8a5c893c9b4b99bcc7ed8fb3e8500957a113f4101860386d06635520f7cfb"}, - {file = "scikit_learn-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bed9f75763bd392c094bf474c7ab75a01d68b15146ea7a20c0f9ff6fb3063dad"}, - {file = "scikit_learn-1.2.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:c9285275a435d1f8f47bbe3500346ab9ead2499e0e090518404d318ea90d1c1c"}, - {file = "scikit_learn-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc838b5a4057c55ba81b82316ea8bf443af445f96eb21500b0e40618017e0923"}, - {file = "scikit_learn-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8bcd303dd982494842a3f482f844d539484c6043b4eed896b43ea8e5f609a21"}, - {file = "scikit_learn-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:a9abf17d177df54e529154f26acfd42930e19117d045e8a9a8e893ca82dd94ec"}, - {file = "scikit_learn-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:70fa30d146b7e9d0c256e73e271b3e17f23123b7c4adcbde1a385031adf59090"}, - {file = "scikit_learn-1.2.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5a8111f3c7a314017ebf90d6feab861c11d1ca14f3dbafb39abcc31aa4c54ba6"}, - {file = "scikit_learn-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cba0c7c6bf1493f8ce670bab69f9317874826ee838988de377ae355abd4d74cf"}, - {file = "scikit_learn-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:479aedd0abedbda6b8b4529145fe4cd8622f69f726a72cef8f75548a93eeb1e1"}, - {file = "scikit_learn-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:5523e21ab2b4d52b2bd41bedd335dbe8f3c1b5f6dd7c9c001b2e17ec9818af8d"}, - {file = "scikit_learn-1.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dcfab6a19b236194af88771d8e6e778a60c3339248ab0018696ebf2b7c8bed4b"}, - {file = "scikit_learn-1.2.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:559f66e12f93b34c8c85c0a5728c3b8af98f04eb12f2c9ee18ea3c82c3d2fad1"}, - {file = "scikit_learn-1.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbb7831b2308c67bb6dd83c5ea3cdaf8e8cafd2de4000b93d78bb689126bd2cf"}, - {file = "scikit_learn-1.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b2c5d9930ced2b7821ad936b9940706ccb5471d89b8a516bb641cec87257d1c"}, - {file = "scikit_learn-1.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:54731e2c2fbff40da6d76cbb9022ace5f44a4020a10bd5cd92107e86882bad15"}, - {file = "scikit_learn-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d00e46a2a7fce6e118ed0f4c6263785bf6c297a94ffd0cd7b32455043c508cc8"}, - {file = "scikit_learn-1.2.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da0e2d50a8435ea8dc5cd21f1fc1a45d329bae03dcca92087ebed859d22d184e"}, - {file = "scikit_learn-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61bb9c654b5d2e6cdd4b1c7e6048fc66270c1682bda1b0f7d2726fdae09010f4"}, - {file = "scikit_learn-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0ee4d4d32c94e082344308528f7b3c9294b60ab19c84eb37a2d9c88bdffd9d1"}, - {file = "scikit_learn-1.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:c722f3446ad8c4f1a93b2399fe1a188635b94709a3f25e6f4d61efbe75fe8eaa"}, -] - -[package.dependencies] -joblib = ">=1.1.1" -numpy = ">=1.17.3" -scipy = ">=1.3.2" -threadpoolctl = ">=2.0.0" - -[package.extras] -benchmark = ["matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "pandas (>=1.0.5)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=4.0.1)", "sphinx-gallery (>=0.7.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] -examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] -tests = ["black (>=22.3.0)", "flake8 (>=3.8.2)", "matplotlib (>=3.1.3)", "mypy (>=0.961)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=5.3.1)", "pytest-cov (>=2.9.0)", "scikit-image (>=0.16.2)"] - -[[package]] -name = "scipy" -version = "1.9.3" -description = "Fundamental algorithms for scientific computing in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "scipy-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0"}, - {file = "scipy-1.9.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd"}, - {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b"}, - {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9"}, - {file = "scipy-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523"}, - {file = "scipy-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096"}, - {file = "scipy-1.9.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c"}, - {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab"}, - {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb"}, - {file = "scipy-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31"}, - {file = "scipy-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840"}, - {file = "scipy-1.9.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5"}, - {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108"}, - {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc"}, - {file = "scipy-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e"}, - {file = "scipy-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c"}, - {file = "scipy-1.9.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95"}, - {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e"}, - {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0"}, - {file = "scipy-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58"}, - {file = "scipy-1.9.3.tar.gz", hash = "sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027"}, -] - -[package.dependencies] -numpy = ">=1.18.5,<1.26.0" - -[package.extras] -dev = ["flake8", "mypy", "pycodestyle", "typing_extensions"] -doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-panels (>=0.5.2)", "sphinx-tabs"] -test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] - -[[package]] -name = "setuptools" -version = "67.3.2" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "setuptools-67.3.2-py3-none-any.whl", hash = "sha256:bb6d8e508de562768f2027902929f8523932fcd1fb784e6d573d2cafac995a48"}, - {file = "setuptools-67.3.2.tar.gz", hash = "sha256:95f00380ef2ffa41d9bba85d95b27689d923c93dfbafed4aecd7cf988a25e012"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "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", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "smmap" -version = "5.0.0" -description = "A pure Python implementation of a sliding window memory map manager" -optional = false -python-versions = ">=3.6" -files = [ - {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, - {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, -] - -[[package]] -name = "snowballstemmer" -version = "2.2.0" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -optional = false -python-versions = "*" -files = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] - -[[package]] -name = "stevedore" -version = "5.0.0" -description = "Manage dynamic plugins for Python applications" -optional = false -python-versions = ">=3.8" -files = [ - {file = "stevedore-5.0.0-py3-none-any.whl", hash = "sha256:bd5a71ff5e5e5f5ea983880e4a1dd1bb47f8feebbb3d95b592398e2f02194771"}, - {file = "stevedore-5.0.0.tar.gz", hash = "sha256:2c428d2338976279e8eb2196f7a94910960d9f7ba2f41f3988511e95ca447021"}, -] - -[package.dependencies] -pbr = ">=2.0.0,<2.1.0 || >2.1.0" - -[[package]] -name = "threadpoolctl" -version = "3.1.0" -description = "threadpoolctl" -optional = false -python-versions = ">=3.6" -files = [ - {file = "threadpoolctl-3.1.0-py3-none-any.whl", hash = "sha256:8b99adda265feb6773280df41eece7b2e6561b772d21ffd52e372f999024907b"}, - {file = "threadpoolctl-3.1.0.tar.gz", hash = "sha256:a335baacfaa4400ae1f0d8e3a58d6674d2f8828e3716bb2802c44955ad391380"}, -] - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - -[[package]] -name = "typing-extensions" -version = "4.5.0" -description = "Backported and Experimental Type Hints for Python 3.7+" -optional = false -python-versions = ">=3.7" -files = [ - {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, - {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, -] - -[[package]] -name = "tzdata" -version = "2023.3" -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"}, -] - -[[package]] -name = "virtualenv" -version = "20.19.0" -description = "Virtual Python Environment builder" -optional = false -python-versions = ">=3.7" -files = [ - {file = "virtualenv-20.19.0-py3-none-any.whl", hash = "sha256:54eb59e7352b573aa04d53f80fc9736ed0ad5143af445a1e539aada6eb947dd1"}, - {file = "virtualenv-20.19.0.tar.gz", hash = "sha256:37a640ba82ed40b226599c522d411e4be5edb339a0c0de030c0dc7b646d61590"}, -] - -[package.dependencies] -distlib = ">=0.3.6,<1" -filelock = ">=3.4.1,<4" -platformdirs = ">=2.4,<4" - -[package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] -test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23)", "pytest (>=7.2.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)"] - -[[package]] -name = "win32-setctime" -version = "1.1.0" -description = "A small Python utility to set file creation time on Windows" -optional = false -python-versions = ">=3.5" -files = [ - {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, - {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, -] - -[package.extras] -dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] - -[[package]] -name = "zipp" -version = "3.14.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -optional = false -python-versions = ">=3.7" -files = [ - {file = "zipp-3.14.0-py3-none-any.whl", hash = "sha256:188834565033387710d046e3fe96acfc9b5e86cbca7f39ff69cf21a4128198b7"}, - {file = "zipp-3.14.0.tar.gz", hash = "sha256:9e5421e176ef5ab4c0ad896624e87a7b2f07aca746c9b2aa305952800cb8eecb"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[metadata] -lock-version = "2.0" -python-versions = ">=3.9,<3.15" -content-hash = "0f6c8cba3ac1808b0179bb151be64eba9ae119c7bcc035f2013958ec6b07649a" diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 4538ab6..0000000 --- a/pyproject.toml +++ /dev/null @@ -1,88 +0,0 @@ -[tool.poetry] -name = "statista" -version = "0.3.0" -description = "statistics package" -authors = ["Mostafa Farrag "] -readme = "README.md" -license = "GNU General Public License v3" -repository = "https://github.com/MAfarrag/statista" -documentation = "https://statista.readthedocs.io/" -keywords = ["statistics", "distributions"] -classifiers=[ - "Development Status :: 5 - Production/Stable", - "Environment :: Console", - "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", - "Natural Language :: English", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Intended Audience :: Science/Research", - "Intended Audience :: Developers", - ] - - - -[tool.poetry.dependencies] -python = ">=3.9,<3.15" -numpy = "^1.24.2" -matplotlib = "^3.7.0" -pandas = ">=1.5.3,<3.0.0" -scipy = "^1.9.0" -scikit-learn = "^1.2.1" -loguru = ">=0.6,<0.8" - - - -[tool.poetry.dev-dependencies] -pytest = "^7.3.2" -pytest-cov = "^4.0.0" -pre-commit = "^3.3.3" -black = "^23.3.0" -flake8 = "^6.0.0" -flake8-bandit = "^4.1.1" -flake8-bugbear = "^23.6.5" -flake8-docstrings = "^1.7.0" -flake8-rst-docstrings = "^0.3.0" -pep8-naming = "^0.13.3" -darglint = "^1.8.1" -reorder-python-imports = "^3.10.0" -pre-commit-hooks = "^4.4.0" - - -[tool.poetry.scripts] - -[tool.coverage.paths] -source = ["statista", "*/site-packages"] - - -[tool.coverage.run] -branch = true -source = ["statista"] - - -[tool.coverage.report] -show_missing = true -fail_under = 0 - - -[tool.isort] -multi_line_output=3 -include_trailing_comma=true -force_grid_wrap=0 -use_parentheses=true -line_length=88 -ensure_newline_before_comments=true -profile="black" - - -[tool.pytest.ini_options] -minversion = "7.0" -addopts = "-ra -q" -testpaths = [ - "tests", -] - - -[build-system] -requires = ["setuptools", "poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..b359f2e --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,13 @@ +black >=23.11.0 +darglint >=1.8.1 +flake8 >=6.1.0 +flake8-bandit >=4.1.1 +flake8-bugbear >=23.9.16 +flake8-docstrings >=1.7.0 +flake8-rst-docstrings >=0.3.0 +pep8-naming >=0.13.3 +pre-commit >=3.5.0 +pre-commit-hooks >=4.5.0 +pytest >=7.4.3 +pytest-cov >= 4.1.0 +reorder-python-imports >=3.12.0 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..7fe56c8 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +loguru >=0.6.0 +matplotlib >=3.6.3 +numpy ==1.25.2 +pandas >=2.1.0 +pip >=23.2.1 +scikit-learn >=1.3.2 +scipy >=1.11.4 diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..2362cf8 --- /dev/null +++ b/setup.py @@ -0,0 +1,41 @@ +from setuptools import find_packages, setup + +with open("README.md", "r") as readme_file: + readme = readme_file.read() + +with open("HISTORY.rst") as history_file: + history = history_file.read() + +requirements = [line.strip() for line in open("requirements.txt").readlines()] +requirements_dev = [line.strip() for line in open("requirements-dev.txt").readlines()] + +setup( + name="statista", + version="0.4.0", + description="statistics package", + author="Mostafa Farrag", + author_email="moah.farag@gmail.come", + url="https://github.com/MAfarrag/statista", + keywords=["remote sensing", "ecmwf"], + long_description=readme + "\n\n" + history, + long_description_content_type="text/markdown", + license="GNU General Public License v3", + zip_safe=False, + packages=find_packages(include=["statista", "statista.*"]), + test_suite="tests", + tests_require=requirements_dev, + install_requires=requirements, + classifiers=[ + "Development Status :: 5 - Production/Stable", + "Environment :: Console", + "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", + "Natural Language :: English", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Topic :: Scientific/Engineering :: GIS", + "Intended Audience :: Science/Research", + "Intended Audience :: Developers", + ], +) diff --git a/statista/confidence_interval.py b/statista/confidence_interval.py index ab0717d..bb4ddfd 100644 --- a/statista/confidence_interval.py +++ b/statista/confidence_interval.py @@ -65,6 +65,9 @@ def BootStrap( list of the three parameters of the GEV distribution [shape, loc, scale] F : [list] non exceedence probability/ cdf + method: [str] + method used to fit the generated samples from the bootstrap method ["lmoments", "mle", "mm"]. Default is + "lmoments". """ alphas = np.array([alpha / 2, 1 - alpha / 2]) tdata = (np.array(data),) diff --git a/statista/distributions.py b/statista/distributions.py index 4918e7c..3b1747d 100644 --- a/statista/distributions.py +++ b/statista/distributions.py @@ -5,7 +5,7 @@ import numpy as np import scipy.optimize as so from numpy import ndarray -from scipy.stats import chisquare, genextreme, gumbel_r, ks_2samp, norm, expon +from scipy.stats import chisquare, genextreme, gumbel_r, ks_2samp, norm, expon, pearson3 from statista.parameters import Lmoments from statista.tools import Tools as st @@ -14,6 +14,8 @@ ninf = 1e-5 +__all__ = ["PlottingPosition", "Gumbel", "GEV", "Exponential", "Normal", "Pearson3"] + class PlottingPosition: """PlottingPosition.""" @@ -41,14 +43,15 @@ def weibul(data: Union[list, np.ndarray], option: int = 1) -> np.ndarray: CDF/T: [list] list of cumulative distribution function or return period. """ + data = np.array(data) data.sort() - + n = len(data) + CDF = np.array(range(1, len(data) + 1)) / (n + 1) + # CDF = np.array([j / ( n + 1) for j in range(1, len(data) + 1)]) if option == 1: - CDF = np.array([j / (len(data) + 1) for j in range(1, len(data) + 1)]) return CDF else: - CDF = [j / (len(data) + 1) for j in range(1, len(data) + 1)] - T = np.array([1 / (1 - j) for j in CDF]) + T = PlottingPosition.returnPeriod(CDF) return T @staticmethod @@ -140,9 +143,11 @@ def pdf( else: ts = actualdata - z = (ts - loc) / scale - pdf = (1.0 / scale) * (np.exp(-(z + (np.exp(-z))))) - # gumbel_r.pdf(data, loc=loc, scale=scale) + # z = (ts - loc) / scale + # pdf = (1.0 / scale) * (np.exp(-(z + (np.exp(-z))))) + + pdf = gumbel_r.pdf(ts, loc=loc, scale=scale) + if plot_figure: Qx = np.linspace( float(self.data_sorted[0]), 1.5 * float(self.data_sorted[-1]), 10000 @@ -192,8 +197,9 @@ def cdf( else: ts = actualdata - z = (ts - loc) / scale - cdf = np.exp(-np.exp(-z)) + # z = (ts - loc) / scale + # cdf = np.exp(-np.exp(-z)) + cdf = gumbel_r.cdf(ts, loc=loc, scale=scale) if plot_figure: Qx = np.linspace( @@ -217,7 +223,6 @@ def cdf( return cdf, fig, ax else: return cdf - # gumbel_r.cdf(Q, loc, scale) def getRP(self, loc, scale, data): """getRP. @@ -238,10 +243,10 @@ def getRP(self, loc, scale, data): float: return period """ - if isinstance(data, list) or isinstance(data, np.ndarray): - cdf = self.cdf(loc, scale, actualdata=data) - else: - cdf = gumbel_r.cdf(data, loc, scale) + # if isinstance(data, list) or isinstance(data, np.ndarray): + cdf = self.cdf(loc, scale, actualdata=data) + # else: + # cdf = gumbel_r.cdf(data, loc, scale) rp = 1 / (1 - cdf) @@ -606,7 +611,7 @@ def pdf( xlabel: str = "Actual data", ylabel: str = "pdf", fontsize: int = 15, - actualdata: Union[bool, np.ndarray] = True, + actualdata: np.ndarray = None, ) -> Union[Tuple[np.ndarray, Figure, Any], np.ndarray]: """pdf. @@ -639,51 +644,41 @@ def pdf( TYPE DESCRIPTION. """ - if isinstance(actualdata, bool): + if actualdata is None: ts = self.data_sorted else: ts = actualdata - pdf = [] - for ts_i in ts: - z = (ts_i - loc) / scale - - # Gumbel - if shape == 0: - val = np.exp(-(z + np.exp(-z))) - pdf.append((1 / scale) * val) - continue + # pdf = [] + # for ts_i in ts: + # z = (ts_i - loc) / scale + # + # # Gumbel + # if shape == 0: + # val = np.exp(-(z + np.exp(-z))) + # pdf.append((1 / scale) * val) + # continue + # + # # GEV + # y = 1 - shape * z + # if y > ninf: + # # np.log(y) = ln(y) + # # ln is the inverse of e + # lnY = (-1 / shape) * np.log(y) + # val = np.exp(-(1 - shape) * lnY - np.exp(-lnY)) + # pdf.append((1 / scale) * val) + # continue + # + # if shape < 0: + # pdf.append(0) + # continue + # pdf.append(0) + # + # if len(pdf) == 1: + # pdf = pdf[0] - # GEV - y = 1 - shape * z - if y > ninf: - # np.log(y) = ln(y) - # ln is the inverse of e - lnY = (-1 / shape) * np.log(y) - val = np.exp(-(1 - shape) * lnY - np.exp(-lnY)) - pdf.append((1 / scale) * val) - continue - - # y = 1 + shape * z - # if y > ninf: - # # np.log(y) = ln(y) - # # ln is the inverse of e - # Q = y ** (-1 / shape) - # val = np.power(Q,1 + shape) * np.exp(-Q) - # pdf.append((1 / scale) * val) - # continue - - if shape < 0: - pdf.append(0) - continue - pdf.append(0) - # pdf.append(1) - - if len(pdf) == 1: - pdf = pdf[0] - - pdf = np.array(pdf) - # f = genextreme.pdf(self.data_sorted, loc=loc, scale=scale, c=shape) + # pdf = np.array(pdf) + pdf = genextreme.pdf(ts, loc=loc, scale=scale, c=shape) if plot_figure: Qx = np.linspace( float(self.data_sorted[0]), 1.5 * float(self.data_sorted[-1]), 10000 @@ -712,7 +707,7 @@ def cdf( figsize: tuple = (6, 5), xlabel: str = "Actual data", ylabel: str = "cdf", - fontsize: int = 15, + fontsize: int = 11, actualdata: Union[bool, np.ndarray] = True, ) -> Union[Tuple[np.ndarray, Figure, Any], np.ndarray]: """cdf. @@ -727,25 +722,25 @@ def cdf( ts = self.data else: ts = actualdata - - z = (ts - loc) / scale - if shape == 0: - # GEV is Gumbel distribution - cdf = np.exp(-np.exp(-z)) - else: - y = 1 - shape * z - cdf = list() - for y_i in y: - if y_i > ninf: - logY = -np.log(y_i) / shape - cdf.append(np.exp(-np.exp(-logY))) - elif shape < 0: - cdf.append(0) - else: - cdf.append(1) - - cdf = np.array(cdf) - + # equation https://www.rdocumentation.org/packages/evd/versions/2.3-6/topics/fextreme + # z = (ts - loc) / scale + # if shape == 0: + # # GEV is Gumbel distribution + # cdf = np.exp(-np.exp(-z)) + # else: + # y = 1 - shape * z + # cdf = list() + # for y_i in y: + # if y_i > ninf: + # logY = -np.log(y_i) / shape + # cdf.append(np.exp(-np.exp(-logY))) + # elif shape < 0: + # cdf.append(0) + # else: + # cdf.append(1) + # + # cdf = np.array(cdf) + cdf = genextreme.cdf(ts, c=shape, loc=loc, scale=scale) if plot_figure: Qx = np.linspace( float(self.data_sorted[0]), 1.5 * float(self.data_sorted[-1]), 10000 @@ -764,14 +759,11 @@ def cdf( ylabel=ylabel, fontsize=fontsize, ) - return cdf, fig, ax else: return cdf - # genextreme.cdf() - - def getRP(self, shape, loc, scale, data): + def getRP(self, shape: float, loc: float, scale: float, data: np.ndarray): """getRP. getRP calculates the return period for a list/array of values or a single value. @@ -792,10 +784,10 @@ def getRP(self, shape, loc, scale, data): float: return period """ - if isinstance(data, list) or isinstance(data, np.ndarray): - cdf = self.cdf(shape, loc, scale, actualdata=data) - else: - cdf = genextreme.cdf(data, shape, loc, scale) + # if isinstance(data, list) or isinstance(data, np.ndarray): + cdf = self.cdf(shape, loc, scale, actualdata=data) + # else: + # cdf = genextreme.cdf(data, shape, loc, scale) rp = 1 / (1 - cdf) @@ -909,24 +901,24 @@ def theporeticalEstimate( if any(F) < 0 or any(F) > 1: raise ValueError("cdf Value Invalid") - Qth = list() - for i in range(len(F)): - if F[i] <= 0 or F[i] >= 1: - if F[i] == 0 and shape < 0: - Qth.append(loc + scale / shape) - elif F[i] == 1 and shape > 0: - Qth.append(loc + scale / shape) - else: - raise ValueError(str(F[i]) + " value of cdf is Invalid") - # F = np.array(F) - Y = -np.log(-np.log(F[i])) - if shape != 0: - Y = (1 - np.exp(-1 * shape * Y)) / shape - - Qth.append(loc + scale * Y) - Qth = np.array(Qth) + # Qth = list() + # for i in range(len(F)): + # if F[i] <= 0 or F[i] >= 1: + # if F[i] == 0 and shape < 0: + # Qth.append(loc + scale / shape) + # elif F[i] == 1 and shape > 0: + # Qth.append(loc + scale / shape) + # else: + # raise ValueError(str(F[i]) + " value of cdf is Invalid") + # # F = np.array(F) + # Y = -np.log(-np.log(F[i])) + # if shape != 0: + # Y = (1 - np.exp(-1 * shape * Y)) / shape + # + # Qth.append(loc + scale * Y) + # Qth = np.array(Qth) # the main equation from scipy - # Qth = genextreme.ppf(F, shape, loc=loc, scale=scale) + Qth = genextreme.ppf(F, shape, loc=loc, scale=scale) return Qth def ks(self): @@ -993,27 +985,35 @@ def confidenceInterval( alpha: float = 0.1, statfunction=np.average, n_samples: int = 100, + method: str = "lmoments", **kargs, ): """confidenceInterval. Parameters: ----------- - 1- loc : [numeric] - location parameter of the gumbel distribution. - 2- scale : [numeric] - scale parameter of the gumbel distribution. - 1-F : [list] - Non Exceedence probability - 3-alpha : [numeric] - alpha or SignificanceLevel is a value of the confidence interval. + loc : [numeric] + location parameter of the gumbel distribution. + scale : [numeric] + scale parameter of the gumbel distribution. + F : [list] + Non Exceedence probability + alpha : [numeric] + alpha or SignificanceLevel is a value of the confidence interval. + statfunction: [callable] + Default is np.average. + n_samples: [int] + number of samples generated by the bootstrap method Default is 100. + method: [str] + method used to fit the generated samples from the bootstrap method ["lmoments", "mle", "mm"]. Default is + "lmoments". Return: ------- - Qupper : [list] - upper bound coresponding to the confidence interval. - Qlower : [list] - lower bound coresponding to the confidence interval. + Qupper : [list] + upper bound coresponding to the confidence interval. + Qlower : [list] + lower bound coresponding to the confidence interval. """ if scale <= 0: raise ValueError("Scale parameter is negative") @@ -1026,6 +1026,7 @@ def confidenceInterval( F=F, alpha=alpha, n_samples=n_samples, + method=method, **kargs, ) Qlower = CI["LB"] @@ -1041,6 +1042,7 @@ def probapilityPlot( F, alpha=0.1, func=None, + method: str = "lmoments", n_samples=100, fig1size=(10, 5), fig2size=(6, 6), @@ -1056,21 +1058,24 @@ def probapilityPlot( Parameters ---------- loc : [numeric] - location parameter of the GEV distribution. + Location parameter of the GEV distribution. scale : [numeric] - scale parameter of the GEV distribution. + Scale parameter of the GEV distribution. shape: [float, int] - shape parameter for the GEV distribution + Shape parameter for the GEV distribution. F : [list] - theoretical cdf calculated using weibul or using the distribution cdf function. + Theoretical cdf calculated using weibul or using the distribution cdf function. + method: [str] + Method used to fit the generated samples from the bootstrap method ["lmoments", "mle", "mm"]. Default is + "lmoments". alpha : [float] - value between 0 and 1. + Value between 0 and 1. fontsize : [numeric] - font size of the axis labels and legend + Font size of the axis labels and legend ylabel : [string] y label string xlabel : [string] - x label string + X label string fig1size : [tuple] size of the pdf and cdf figure fig2size : [tuple] @@ -1091,7 +1096,12 @@ def probapilityPlot( Param_dist = [shape, loc, scale] CI = ConfidenceInterval.BootStrap( - self.data, statfunction=func, gevfit=Param_dist, n_samples=n_samples, F=F + self.data, + statfunction=func, + gevfit=Param_dist, + n_samples=n_samples, + F=F, + method=method, ) Qlower = CI["LB"] Qupper = CI["UB"] @@ -1136,21 +1146,27 @@ def ci_func(data: Union[list, np.ndarray], **kwargs): GEV parameter [shape, location, scale] - F: [list] Non Exceedence probability + - method: [str] + method used to fit the generated samples from the bootstrap method ["lmoments", "mle", "mm"]. Default is + "lmoments". """ gevfit = kwargs["gevfit"] F = kwargs["F"] shape = gevfit[0] loc = gevfit[1] scale = gevfit[2] + method = kwargs["method"] # generate theoretical estimates based on a random cdf, and the dist parameters sample = GEV.theporeticalEstimate(shape, loc, scale, np.random.rand(len(data))) + # get parameters based on the new generated sample - LM = Lmoments(sample) - mum = LM.Lmom() - newfit = LM.gev(mum) - shape = newfit[0] - loc = newfit[1] - scale = newfit[2] + Gdist = GEV(sample) + new_param = Gdist.estimateParameter(method=method, test=False) + + shape = new_param[0] + loc = new_param[1] + scale = new_param[2] + # return period # T = np.arange(0.1, 999.1, 0.1) + 1 # +1 in order not to make 1- 1/0.1 = -9 @@ -1159,11 +1175,289 @@ def ci_func(data: Union[list, np.ndarray], **kwargs): # F = 1 - 1 / T Qth = GEV.theporeticalEstimate(shape, loc, scale, F) - res = newfit + res = new_param res.extend(Qth) return tuple(res) +# class Frechet: +# +# """ +# f(x: threshold, scale) = (1/scale) e **(- (x-threshold)/scale) +# +# """ +# +# def __init__( +# self, +# data: Union[list, np.ndarray] = None, +# loc: Union[int, float] = None, +# scale: Union[int, float] = None, +# ): +# """Gumbel. +# +# Parameters +# ---------- +# data : [list] +# data time series. +# loc: [numeric] +# location parameter +# scale: [numeric] +# scale parameter +# """ +# if isinstance(data, list) or isinstance(data, np.ndarray): +# self.data = np.array(data) +# self.data_sorted = np.sort(data) +# self.cdf_Weibul = PlottingPosition.weibul(data) +# self.KStable = 1.22 / np.sqrt(len(self.data)) +# +# self.loc = loc +# self.scale = scale +# self.Dstatic = None +# self.KS_Pvalue = None +# self.chistatic = None +# self.chi_Pvalue = None +# +# def pdf( +# self, +# loc: Union[float, int], +# scale: Union[float, int], +# plot_figure: bool = False, +# figsize: tuple = (6, 5), +# xlabel: str = "Actual data", +# ylabel: str = "pdf", +# fontsize: Union[float, int] = 15, +# actualdata: Union[bool, np.ndarray] = True, +# ) -> Union[Tuple[np.ndarray, Figure, Any], np.ndarray]: +# """pdf. +# +# Returns the value of Gumbel's pdf with parameters loc and scale at x . +# +# Parameters: +# ----------- +# loc : [numeric] +# location parameter of the gumbel distribution. +# scale : [numeric] +# scale parameter of the gumbel distribution. +# +# Returns +# ------- +# pdf : [array] +# probability density function pdf. +# """ +# if scale <= 0: +# raise ValueError("Scale parameter is negative") +# +# if isinstance(actualdata, bool): +# ts = self.data +# else: +# ts = actualdata +# +# # pdf = [] +# # +# # for i in ts: +# # Y = (i - loc) / scale +# # if Y <= 0: +# # pdf.append(0) +# # else: +# # pdf.append(np.exp(-Y) / scale) +# # +# # if len(pdf) == 1: +# # pdf = pdf[0] +# +# pdf = expon.pdf(ts, loc=loc, scale=scale) +# if plot_figure: +# Qx = np.linspace( +# float(self.data_sorted[0]), 1.5 * float(self.data_sorted[-1]), 10000 +# ) +# pdf_fitted = self.pdf(loc, scale, actualdata=Qx) +# +# fig, ax = Plot.pdf( +# Qx, +# pdf_fitted, +# self.data_sorted, +# figsize=figsize, +# xlabel=xlabel, +# ylabel=ylabel, +# fontsize=fontsize, +# ) +# return pdf, fig, ax +# else: +# return pdf +# +# def cdf( +# self, +# loc: Union[float, int], +# scale: Union[float, int], +# plot_figure: bool = False, +# figsize: tuple = (6, 5), +# xlabel: str = "data", +# ylabel: str = "cdf", +# fontsize: int = 15, +# actualdata: Union[bool, np.ndarray] = True, +# ) -> Union[Tuple[np.ndarray, Figure, Any], np.ndarray]: +# """cdf. +# +# cdf calculates the value of Gumbel's cdf with parameters loc and scale at x. +# +# parameter: +# ---------- +# loc : [numeric] +# location parameter of the gumbel distribution. +# scale : [numeric] +# scale parameter of the gumbel distribution. +# """ +# if scale <= 0: +# raise ValueError("Scale parameter is negative") +# if loc <= 0: +# raise ValueError("Threshold parameter should be greater than zero") +# +# if isinstance(actualdata, bool): +# ts = self.data +# else: +# ts = actualdata +# +# # Y = (ts - loc) / scale +# # cdf = 1 - np.exp(-Y) +# # +# # for i in range(0, len(cdf)): +# # if cdf[i] < 0: +# # cdf[i] = 0 +# cdf = expon.cdf(ts, loc=loc, scale=scale) +# +# if plot_figure: +# Qx = np.linspace( +# float(self.data_sorted[0]), 1.5 * float(self.data_sorted[-1]), 10000 +# ) +# cdf_fitted = self.cdf(loc, scale, actualdata=Qx) +# +# cdf_Weibul = PlottingPosition.weibul(self.data_sorted) +# +# fig, ax = Plot.cdf( +# Qx, +# cdf_fitted, +# self.data_sorted, +# cdf_Weibul, +# figsize=figsize, +# xlabel=xlabel, +# ylabel=ylabel, +# fontsize=fontsize, +# ) +# +# return cdf, fig, ax +# else: +# return cdf +# +# def estimateParameter( +# self, +# method: str = "mle", +# ObjFunc=None, +# threshold: Union[int, float, None] = None, +# test: bool = True, +# ) -> tuple: +# """estimateParameter. +# +# EstimateParameter estimate the distribution parameter based on MLM +# (Maximum liklihood method), if an objective function is entered as an input +# +# There are two likelihood functions (L1 and L2), one for values above some +# threshold (x>=C) and one for values below (x < C), now the likeliest parameters +# are those at the max value of mutiplication between two functions max(L1*L2). +# +# In this case the L1 is still the product of multiplication of probability +# density function's values at xi, but the L2 is the probability that threshold +# value C will be exceeded (1-F(C)). +# +# Parameters +# ---------- +# ObjFunc : [function] +# function to be used to get the distribution parameters. +# threshold : [numeric] +# Value you want to consider only the greater values. +# method : [string] +# 'mle', 'mm', 'lmoments', optimization +# test: bool +# Default is True +# +# Returns +# ------- +# Param : [list] +# shape, loc, scale parameter of the gumbel distribution in that order. +# """ +# # obj_func = lambda p, x: (-np.log(Gumbel.pdf(x, p[0], p[1]))).sum() +# # #first we make a simple Gumbel fit +# # Par1 = so.fmin(obj_func, [0.5,0.5], args=(np.array(data),)) +# method = method.lower() +# if method not in ["mle", "mm", "lmoments", "optimization"]: +# raise ValueError( +# method + "value should be 'mle', 'mm', 'lmoments' or 'optimization'" +# ) +# +# if method == "mle" or method == "mm": +# Param = list(expon.fit(self.data, method=method)) +# elif method == "lmoments": +# LM = Lmoments(self.data) +# LMU = LM.Lmom() +# Param = Lmoments.gev(LMU) +# elif method == "optimization": +# if ObjFunc is None or threshold is None: +# raise TypeError("ObjFunc and threshold should be numeric value") +# +# Param = expon.fit(self.data, method="mle") +# # then we use the result as starting value for your truncated Gumbel fit +# Param = so.fmin( +# ObjFunc, +# [threshold, Param[0], Param[1]], +# args=(self.data,), +# maxiter=500, +# maxfun=500, +# ) +# Param = [Param[1], Param[2]] +# +# self.loc = Param[0] +# self.scale = Param[1] +# +# if test: +# self.ks() +# try: +# self.chisquare() +# except ValueError: +# print("chisquare test failed") +# +# return Param +# +# @staticmethod +# def theporeticalEstimate( +# loc: Union[float, int], +# scale: Union[float, int], +# F: np.ndarray, +# ) -> np.ndarray: +# """TheporeticalEstimate. +# +# TheporeticalEstimate method calculates the theoretical values based on a given non exceedence probability +# +# Parameters: +# ----------- +# param : [list] +# location ans scale parameters of the gumbel distribution. +# F : [list] +# cummulative distribution function/ Non Exceedence probability. +# +# Return: +# ------- +# theoreticalvalue : [numeric] +# Value based on the theoretical distribution +# """ +# if scale <= 0: +# raise ValueError("Parameters Invalid") +# +# if any(F) < 0 or any(F) > 1: +# raise ValueError("cdf Value Invalid") +# +# # the main equation from scipy +# Qth = expon.ppf(F, loc=loc, scale=scale) +# return Qth + + class Exponential: """ @@ -1381,7 +1675,7 @@ def estimateParameter( elif method == "lmoments": LM = Lmoments(self.data) LMU = LM.Lmom() - Param = Lmoments.gev(LMU) + Param = Lmoments.exponential(LMU) elif method == "optimization": if ObjFunc is None or threshold is None: raise TypeError("ObjFunc and threshold should be numeric value") @@ -1441,6 +1735,57 @@ def theporeticalEstimate( Qth = expon.ppf(F, loc=loc, scale=scale) return Qth + def ks(self): + """Kolmogorov-Smirnov (KS) test. + + The smaller the D static the more likely that the two samples are drawn from the same distribution + IF Pvalue < signeficance level ------ reject + + returns: + -------- + Dstatic: [numeric] + The smaller the D static the more likely that the two samples are drawn from the same distribution + Pvalue : [numeric] + IF Pvalue < signeficance level ------ reject the null hypotethis + """ + if not hasattr(self, "loc") or not hasattr(self, "scale"): + raise ValueError( + "Value of loc/scale parameter is unknown please use " + "'EstimateParameter' to obtain them" + ) + Qth = self.theporeticalEstimate(self.loc, self.scale, self.cdf_Weibul) + + test = ks_2samp(self.data, Qth) + self.Dstatic = test.statistic + self.KS_Pvalue = test.pvalue + print("-----KS Test--------") + print("Statistic = " + str(test.statistic)) + if self.Dstatic < self.KStable: + print("Accept Hypothesis") + else: + print("reject Hypothesis") + print("P value = " + str(test.pvalue)) + + return test.statistic, test.pvalue + + def chisquare(self): + if not hasattr(self, "loc") or not hasattr(self, "scale"): + raise ValueError( + "Value of loc/scale parameter is unknown please use " + "'EstimateParameter' to obtain them" + ) + + Qth = self.theporeticalEstimate(self.loc, self.scale, self.cdf_Weibul) + + test = chisquare(st.standardize(Qth), st.standardize(self.data)) + self.chistatic = test.statistic + self.chi_Pvalue = test.pvalue + print("-----chisquare Test-----") + print("Statistic = " + str(test.statistic)) + print("P value = " + str(test.pvalue)) + + return test.statistic, test.pvalue + class Normal: @@ -1700,3 +2045,172 @@ def theporeticalEstimate( # the main equation from scipy Qth = norm.ppf(F, loc=loc, scale=scale) return Qth + + +class Pearson3: + + data: ndarray + + def __init__( + self, + data: Union[list, np.ndarray] = None, + shape: Union[int, float] = None, + loc: Union[int, float] = None, + scale: Union[int, float] = None, + ): + """GEV. + + Parameters + ---------- + data : [list] + data time series. + shape + loc + scale + """ + if isinstance(data, list) or isinstance(data, np.ndarray): + self.data = np.array(data) + self.data_sorted = np.sort(data) + self.cdf_Weibul = PlottingPosition.weibul(data) + self.KStable = 1.22 / np.sqrt(len(self.data)) + + self.loc = loc + self.scale = scale + self.Dstatic = None + self.KS_Pvalue = None + + self.chistatic = None + self.chi_Pvalue = None + pass + + def pdf( + self, + loc: Union[float, int], + scale: Union[float, int], + plot_figure: bool = False, + figsize: tuple = (6, 5), + xlabel: str = "Actual data", + ylabel: str = "pdf", + fontsize: int = 15, + actualdata: Union[bool, np.ndarray] = True, + ) -> Union[Tuple[np.ndarray, Figure, Any], np.ndarray]: + """pdf. + + Returns the value of GEV's pdf with parameters loc and scale at x . + + Parameters + ---------- + loc : [numeric] + location parameter. + scale : [numeric] + scale parameter. + plot_figure: [bool] + Default is False. + figsize: [tuple] + Default is (6, 5). + xlabel: [str] + Default is "Actual data". + ylabel: [str] + Default is "pdf". + fontsize: [int] + Default is 15. + actualdata : [bool/array] + true if you want to calculate the pdf for the actual time series, array + if you want to calculate the pdf for a theoretical time series + + Returns + ------- + TYPE + DESCRIPTION. + """ + if isinstance(actualdata, bool): + ts = self.data_sorted + else: + ts = actualdata + + pdf = pearson3.pdf(ts, loc=loc, scale=scale) + + if plot_figure: + Qx = np.linspace( + float(self.data_sorted[0]), 1.5 * float(self.data_sorted[-1]), 10000 + ) + pdf_fitted = self.pdf(loc, scale, actualdata=Qx) + + fig, ax = Plot.pdf( + Qx, + pdf_fitted, + self.data_sorted, + figsize=figsize, + xlabel=xlabel, + ylabel=ylabel, + fontsize=fontsize, + ) + return pdf, fig, ax + else: + return pdf + + def cdf( + self, + shape: Union[float, int], + loc: Union[float, int], + scale: Union[float, int], + plot_figure: bool = False, + figsize: tuple = (6, 5), + xlabel: str = "Actual data", + ylabel: str = "cdf", + fontsize: int = 15, + actualdata: Union[bool, np.ndarray] = True, + ) -> Union[Tuple[np.ndarray, Figure, Any], np.ndarray]: + """cdf. + + Returns the value of Gumbel's cdf with parameters loc and scale + at x. + """ + if scale <= 0: + raise ValueError("Scale parameter is negative") + + if isinstance(actualdata, bool): + ts = self.data + else: + ts = actualdata + + z = (ts - loc) / scale + if shape == 0: + # GEV is Gumbel distribution + cdf = np.exp(-np.exp(-z)) + else: + y = 1 - shape * z + cdf = list() + for y_i in y: + if y_i > ninf: + logY = -np.log(y_i) / shape + cdf.append(np.exp(-np.exp(-logY))) + elif shape < 0: + cdf.append(0) + else: + cdf.append(1) + + cdf = np.array(cdf) + + if plot_figure: + Qx = np.linspace( + float(self.data_sorted[0]), 1.5 * float(self.data_sorted[-1]), 10000 + ) + cdf_fitted = self.cdf(shape, loc, scale, actualdata=Qx) + + cdf_Weibul = PlottingPosition.weibul(self.data_sorted) + + fig, ax = Plot.cdf( + Qx, + cdf_fitted, + self.data_sorted, + cdf_Weibul, + figsize=figsize, + xlabel=xlabel, + ylabel=ylabel, + fontsize=fontsize, + ) + + return cdf, fig, ax + else: + return cdf diff --git a/statista/eva.py b/statista/eva.py index 1e890d9..62e13eb 100644 --- a/statista/eva.py +++ b/statista/eva.py @@ -1,7 +1,6 @@ """Extreme value analysis.""" -import os from typing import Union, Tuple - +from pathlib import Path import matplotlib.pyplot as plt import numpy as np import pandas as pd @@ -13,10 +12,11 @@ def ams_analysis( time_series_df: DataFrame, + ams: bool = False, ams_start: str = "A-OCT", save_plots: bool = False, save_to: str = None, - filter_out: Union[bool, float, int] = False, + filter_out: Union[float, int] = None, distribution: str = "GEV", method: str = "lmoments", estimate_parameters: bool = False, @@ -32,6 +32,8 @@ def ams_analysis( ---------- time_series_df : [DataFrame] DataFrame containing multiple time series to do the statistical analysis on. + ams: [bool] + True if the the given time series is annual mean series. Default is False. ams_start: [str] The beginning of the year which is used to resample the time series to get the annual maximum series. Default is"A-OCT". @@ -120,38 +122,42 @@ def ams_analysis( # Non Exceedance propabilities # F = [1/3, 0.5, 0.8, 0.9, 0.96, 0.98, 0.99, 0.995, 0.998] F = 1 - (1 / T) + save_to = Path(save_to) # Iteration over all the gauge numbers. if save_plots: - rpath = os.path.join(save_to, "figures") - if not os.path.exists(rpath): - os.mkdir(rpath) + rpath = save_to.joinpath("figures") + if not rpath.exists(): + # os.mkdir(rpath) + rpath.mkdir(parents=True, exist_ok=True) for i in gauges: QTS = time_series_df.loc[:, i] - # The time series is resampled to the annual maxima, and turned into a - # numpy array. + # The time series is resampled to the annual maxima, and turned into a numpy array. # The hydrological year is 1-Nov/31-Oct (from Petrow and Merz, 2009, JoH). - ams = QTS.resample(ams_start).max().values + if not ams: + ams_df = QTS.resample(ams_start).max().values + else: + ams_df = QTS.values - if not isinstance(filter_out, bool): - ams = ams[ams != filter_out] + if filter_out is not None: + ams_df = ams_df[ams_df != filter_out] if estimate_parameters: # TODO: still to be tested and prepared for GEV # estimate the parameters through an optimization - # alpha = (np.sqrt(6) / np.pi) * ams.std() - # beta = ams.mean() - 0.5772 * alpha + # alpha = (np.sqrt(6) / np.pi) * ams_df.std() + # beta = ams_df.mean() - 0.5772 * alpha # param_dist = [beta, alpha] - threshold = np.quantile(ams, quartile) + threshold = np.quantile(ams_df, quartile) if distribution == "GEV": - dist = GEV(ams) + dist = GEV(ams_df) param_dist = dist.estimateParameter( method="optimization", ObjFunc=Gumbel.ObjectiveFn, threshold=threshold, ) else: - dist = Gumbel(ams) + dist = Gumbel(ams_df) param_dist = dist.estimateParameter( method="optimization", ObjFunc=Gumbel.ObjectiveFn, @@ -161,12 +167,12 @@ def ams_analysis( # estimate the parameters through maximum liklehood method try: if distribution == "GEV": - dist = GEV(ams) + dist = GEV(ams_df) # defult parameter estimation method is maximum liklihood method param_dist = dist.estimateParameter(method=method) else: # A gumbel distribution is fitted to the annual maxima - dist = Gumbel(ams) + dist = Gumbel(ams_df) # defult parameter estimation method is maximum liklihood method param_dist = dist.estimateParameter(method=method) except Exception as e: @@ -197,10 +203,10 @@ def ams_analysis( Qrp = dist.theporeticalEstimate(param_dist[0], param_dist[1], F) # to get the Non Exceedance probability for a specific Value - # sort the ams - ams.sort() + # sort the ams_df + ams_df.sort() # calculate the F (Exceedence probability based on weibul) - cdf_Weibul = PlottingPosition.weibul(ams) + cdf_Weibul = PlottingPosition.weibul(ams_df) # Gumbel.probapilityPlot method calculates the theoretical values # based on the Gumbel distribution # parameters, theoretical cdf (or weibul), and calculate the confidence interval @@ -212,6 +218,7 @@ def ams_analysis( param_dist[2], cdf_Weibul, alpha=significance_level, + method=method, ) else: fig, ax = dist.probapilityPlot( @@ -238,10 +245,12 @@ def ams_analysis( statistical_properties.loc[i, "max"] = QTS.max() statistical_properties.loc[i, "t_beg"] = QTS.index.min() statistical_properties.loc[i, "t_end"] = QTS.index.max() - statistical_properties.loc[i, "nyr"] = ( - statistical_properties.loc[i, "t_end"] - - statistical_properties.loc[i, "t_beg"] - ).days / 365.25 + if not ams: + statistical_properties.loc[i, "nyr"] = ( + statistical_properties.loc[i, "t_end"] + - statistical_properties.loc[i, "t_beg"] + ).days / 365.25 + for irp, irp_name in zip(Qrp, rp_name): statistical_properties.loc[i, irp_name] = irp diff --git a/statista/metrics.py b/statista/metrics.py index 9e4c308..8f69c0a 100644 --- a/statista/metrics.py +++ b/statista/metrics.py @@ -132,51 +132,57 @@ def RMSELF( ------- error values """ - # input data validation - # data type - assert type(WStype) == int, ( - "Weighting scheme should be an integer number between 1 and 4 and you entered " - + str(WStype) - ) - assert isinstance(alpha, int) or isinstance( - alpha, float - ), "alpha should be a number and between 0 & 1" - assert isinstance(N, Number), "N should be a number and between 0 & 1" + if not isinstance(WStype, int): + raise TypeError( + f"Weighting scheme should be an integer number between 1 and 4 and you entered {WStype}" + ) + + if not (isinstance(alpha, int) or isinstance(alpha, float)): + raise TypeError("alpha should be a number and between 0 & 1") + + if not isinstance(N, Number): + raise TypeError("N should be a number and between 0 & 1") + # Input values - assert ( - 1 <= WStype <= 4 - ), f"Weighting scheme should be an integer number between 1 and 4 you have enters {WStype}" - assert ( - N >= 0 - ), f"Weighting scheme Power should be positive number you have entered {N}" - assert ( - 0 < alpha < 1 - ), f"alpha should be float number and between 0 & 1 you have entered {alpha}" + if not 1 <= WStype <= 4: + raise ValueError( + f"Weighting scheme should be an integer number between 1 and 4 you have enters {WStype}" + ) + + if not N >= 0: + raise ValueError( + f"Weighting scheme Power should be positive number you have entered {N}" + ) + + if not 0 < alpha < 1: + raise ValueError( + f"alpha should be float number and between 0 & 1 you have entered {alpha}" + ) # convert obs & sim into arrays obs = np.array(obs) Qsim = np.array(Qsim) Qmax = max(obs) # rational Discharge power N - l = (Qmax - obs) / Qmax + qr = (Qmax - obs) / Qmax if WStype == 1: - w = l**N + w = qr**N elif WStype == 2: # ------------------------------- N is not in the equation - # w=1-l*((0.50 - alpha)**N) - w = ((1 / (alpha**2)) * (1 - l) ** 2) - ((2 / alpha) * (1 - l)) + 1 - w[1 - l > alpha] = 0 + # w=1-qr*((0.50 - alpha)**N) + w = ((1 / (alpha**2)) * (1 - qr) ** 2) - ((2 / alpha) * (1 - qr)) + 1 + w[1 - qr > alpha] = 0 elif WStype == 3: # the same like WStype 2 - # w=1-l*((0.50 - alpha)**N) - w = ((1 / (alpha**2)) * (1 - l) ** 2) - ((2 / alpha) * (1 - l)) + 1 - w[1 - l > alpha] = 0 + # w=1-qr*((0.50 - alpha)**N) + w = ((1 / (alpha**2)) * (1 - qr) ** 2) - ((2 / alpha) * (1 - qr)) + 1 + w[1 - qr > alpha] = 0 elif WStype == 4: - # w = 1-l*(0.50 - alpha) - w = 1 - ((1 - l) / alpha) - w[1 - l > alpha] = 0 + # w = 1-qr*(0.50 - alpha) + w = 1 - ((1 - qr) / alpha) + w[1 - qr > alpha] = 0 else: # sigmoid function # w=1/(1+np.exp(10*h-5)) - w = 1 / (1 + np.exp(-10 * l + 5)) + w = 1 / (1 + np.exp(-10 * qr + 5)) a = (obs - Qsim) ** 2 b = a * w @@ -372,9 +378,31 @@ def MAE(obs: Union[list, np.ndarray], sim: Union[list, np.ndarray]): return np.abs(np.array(obs) - np.array(sim)).mean() -def PearsonCorre(obs: Union[list, np.ndarray], sim: Union[list, np.ndarray]): - """Pearson correlation coefficient r2 is independent of the magnitude of the numbers; it is sensitive to relative changes only.""" - return (np.corrcoef(np.array(obs), np.array(sim))[0][1]) ** 2 +def PearsonCorre(x: Union[list, np.ndarray], y: Union[list, np.ndarray]) -> Number: + """Pearson correlation coefficient. + + - Pearson correlation coefficient is independent of the magnitude of the numbers. + - it is sensitive to relative changes only. + + .. math:: R_{ij} = \\frac{ C_{ij} } { \\sqrt{ C_{ii} C_{jj} } } + + - covariance / std1 * std2 + + The values of `R` are between -1 and 1, inclusive. + + Parameters + ---------- + x : array_like + A 1-D array containing a variable. + y : array_like, + A 1-D array containing a variable. + + Returns + ------- + R : ndarray + The correlation coefficient of the variables. + """ + return np.corrcoef(np.array(x), np.array(y))[0][1] def R2(obs: Union[list, np.ndarray], sim: Union[list, np.ndarray]): diff --git a/statista/parameters.py b/statista/parameters.py index deaab94..cac30b1 100644 --- a/statista/parameters.py +++ b/statista/parameters.py @@ -65,13 +65,13 @@ def _samlmularge(self, nmom: int = 5) -> list[ndarray | float | int | Any]: if n < nmom: raise ValueError("Insufficient length of data for specified nmoments") - ## Calculate first order + # Calculate first order coefl1 = 1.0 / self._comb(n, 1) suml1 = sum(x) - l = [coefl1 * suml1] + lmoments = [coefl1 * suml1] if nmom == 1: - return l[0] + return lmoments[0] # Setup comb table, where comb[i][x] refers to comb(x,i) comb = [] @@ -81,12 +81,11 @@ def _samlmularge(self, nmom: int = 5) -> list[ndarray | float | int | Any]: comb[-1].append(self._comb(j, i)) for mom in range(2, nmom + 1): - ## print(mom) coefl = 1.0 / mom * 1.0 / self._comb(n, mom) xtrans = [] for i in range(0, n): coeftemp = [] - for j in range(0, mom): + for _ in range(0, mom): coeftemp.append(1) for j in range(0, mom - 1): @@ -104,10 +103,10 @@ def _samlmularge(self, nmom: int = 5) -> list[ndarray | float | int | Any]: xtrans.append(x[i] * coeftemp) if mom > 2: - l.append(coefl * sum(xtrans) / l[1]) + lmoments.append(coefl * sum(xtrans) / lmoments[1]) else: - l.append(coefl * sum(xtrans)) - return l + lmoments.append(coefl * sum(xtrans)) + return lmoments def _samlmusmall(self, nmom: int = 5) -> list[ndarray | float | int | Any]: """Small sample L-Moments.""" @@ -133,8 +132,8 @@ def _samlmusmall(self, nmom: int = 5) -> list[ndarray | float | int | Any]: # for nmom > 2, and shouldn't decrease time for nmom == 2 # comb(sample,1) = sample # for i in range(1,n+1): - ## comb1.append(comb(i-1,1)) - ## comb2.append(comb(n-i,1)) + # # comb1.append(comb(i-1,1)) + # # comb2.append(comb(n-i,1)) # Can be simplifed to comb1 = range(0,n) comb1 = range(0, n) @@ -151,7 +150,7 @@ def _samlmusmall(self, nmom: int = 5) -> list[ndarray | float | int | Any]: if nmom == 2: return [l_moment_1, l_moment_2] - ## Calculate Third order + # Calculate Third order # comb terms appear elsewhere, this will decrease calc time # for nmom > 2, and shouldn't decrease time for nmom == 2 # comb3 = comb(i-1,2) @@ -174,7 +173,7 @@ def _samlmusmall(self, nmom: int = 5) -> list[ndarray | float | int | Any]: if nmom == 3: return [l_moment_1, l_moment_2, l_moment_3] - ## Calculate Fourth order + # Calculate Fourth order # comb5 = comb(i-1,3) # comb6 = comb(n-i,3) comb5 = [] @@ -197,7 +196,7 @@ def _samlmusmall(self, nmom: int = 5) -> list[ndarray | float | int | Any]: if nmom == 4: return [l_moment_1, l_moment_2, l_moment_3, l_moment_4] - ## Calculate Fifth order + # Calculate Fifth order comb7 = [] comb8 = [] for i in range(0, n): @@ -275,7 +274,8 @@ def gev(lmoments: List[Union[float, int]]) -> List[Union[float, int]]: G = 1 - np.log(1 + T3) / DL2 T0 = (T3 + 3) * 0.5 - for IT in range(1, MAXIT): + + for _ in range(1, MAXIT): X2 = 2 ** (-G) X3 = 3 ** (-G) XX2 = 1 - X2 @@ -296,14 +296,18 @@ def gev(lmoments: List[Union[float, int]]) -> List[Union[float, int]]: Z = 1 - T3 G = (-1 + Z * (C1 + Z * (C2 + Z * C3))) / (1 + Z * (D1 + Z * D2)) if abs(G) < ninf: + # Gumbel scale = lmoments[1] / DL2 loc = lmoments[0] - EU * scale para = [0, loc, scale] else: + # GEV shape = G GAM = np.exp(sp.special.gammaln(1 + G)) scale = lmoments[1] * G / (GAM * (1 - 2 ** (-G))) loc = lmoments[0] - scale * (1 - GAM) / G + # multiply the shape by -1 to follow the + ve shape parameter equation (+ve value means heavy tail) + # para = [-1 * shape, loc, scale] para = [shape, loc, scale] return para @@ -344,10 +348,11 @@ def exponential(lmoments: List[Union[float, int]]) -> List[Union[float, int]]: """ if lmoments[1] <= 0: print("L-Moments Invalid") - return + para = None else: para = [lmoments[0] - 2 * lmoments[1], 2 * lmoments[1]] - return para + + return para @staticmethod def gamma(lmoments: List[Union[float, int]]) -> List[Union[float, int]]: @@ -372,16 +377,17 @@ def gamma(lmoments: List[Union[float, int]]) -> List[Union[float, int]]: if lmoments[0] <= lmoments[1] or lmoments[1] <= 0: print("L-Moments Invalid") - return - CV = lmoments[1] / lmoments[0] - if CV >= 0.5: - T = 1 - CV - ALPHA = T * (B1 + T * B2) / (1 + T * (B3 + T * B4)) + para = None else: - T = np.pi * CV**2 - ALPHA = (1 + A1 * T) / (T * (1 + T * (A2 + T * A3))) + CV = lmoments[1] / lmoments[0] + if CV >= 0.5: + T = 1 - CV + ALPHA = T * (B1 + T * B2) / (1 + T * (B3 + T * B4)) + else: + T = np.pi * CV**2 + ALPHA = (1 + A1 * T) / (T * (1 + T * (A2 + T * A3))) - para = [ALPHA, lmoments[0] / ALPHA] + para = [ALPHA, lmoments[0] / ALPHA] return para @staticmethod @@ -404,16 +410,16 @@ def generalized_logistic( G = -lmoments[2] if lmoments[1] <= 0 or abs(G) >= 1: print("L-Moments Invalid") - return - - if abs(G) <= SMALL: - para = [lmoments[0], lmoments[1], 0] - return para + para = None + else: + if abs(G) <= SMALL: + para = [lmoments[0], lmoments[1], 0] + return para - GG = G * np.pi / sp.sin(G * np.pi) - A = lmoments[1] / GG - para1 = lmoments[0] - A * (1 - GG) / G - para = [para1, A, G] + GG = G * np.pi / sp.sin(G * np.pi) + A = lmoments[1] / GG + para1 = lmoments[0] - A * (1 - GG) / G + para = [para1, A, G] return para @staticmethod diff --git a/statista/sensitivity.py b/statista/sensitivity.py index 6937418..f944c8e 100644 --- a/statista/sensitivity.py +++ b/statista/sensitivity.py @@ -2,6 +2,7 @@ @author: mofarrag """ +from typing import List import matplotlib.pyplot as plt import numpy as np @@ -31,7 +32,7 @@ class Sensitivity: ] def __init__( - self, parameter, LB, UB, function, positions=[], n_values=5, return_values=1 + self, parameter, LB, UB, function, positions=None, n_values=5, return_values=1 ): """Sensitivity. @@ -52,7 +53,7 @@ def __init__( positions : [list], optional position of the parameter in the list (the beginning of the list starts with 0), if the Position argument is empty list the sensitivity will - be done for all parameters. The default is []. + be done for all parameters. The default is None. n_values : [integer], optional number of parameter values between the bounds you want to calculate the metric for, if the values does not include the value if the given parameter @@ -82,7 +83,7 @@ def __init__( self.NoValues = n_values self.return_values = return_values # if the Position argument is empty list the sensitivity will be done for all parameters - if positions == []: + if positions is None: self.NoPar = len(parameter) self.Positions = list(range(len(parameter))) else: @@ -116,19 +117,19 @@ def OAT(self, *args, **kwargs): Parameters ---------- - parameter : [dataframe] - parameters dataframe including the parameters values in a column with - name 'value' and the parameters name as index. - LB : [List] - parameters upper bounds. - UB : [List] - parameters lower bounds. - function : [function] - the function you want to run it several times. *args : [positional argument] arguments of the function with the same exact names inside the function. **kwargs : [keyword argument] keyword arguments of the function with the same exact names inside the function. + - parameter : [dataframe] + parameters dataframe including the parameters values in a column with + name 'value' and the parameters name as index. + - LB : [List] + parameters upper bounds. + - UB : [List] + parameters lower bounds. + - function : [function] + the function you want to run it several times. Returns ------- @@ -172,7 +173,7 @@ def OAT(self, *args, **kwargs): the function should return only one value for return_values=1, or two values for return_values=2. """ - assert False, message + raise ValueError(message) # store the real values of the parameter in the third list in the dict self.sen[self.parameter.index[k]][2].append(round(rand_value[j], 4)) print(str(k) + "-" + self.parameter.index[k] + " -" + str(j)) @@ -190,7 +191,7 @@ def Sobol( title2: str = "", xlabel2: str = "xlabel2", ylabel2: str = "ylabel2", - spaces=[None, None, None, None, None, None], + spaces=List[float], ): """Sobol. @@ -332,9 +333,9 @@ def Sobol( ) except ValueError: - assert ( - False - ), "to plot Calculated Values you should choose return_values==2 in the sentivivity object" + assert ValueError( + "to plot Calculated Values you should choose return_values==2 in the sentivivity object" + ) plt.tight_layout() return fig, (ax1, ax2) diff --git a/tests/test_distributions.py b/tests/test_distributions.py index d2e4f23..bff807c 100644 --- a/tests/test_distributions.py +++ b/tests/test_distributions.py @@ -30,254 +30,276 @@ def test_plotting_position_rp( assert isinstance(rp, np.ndarray) -def test_create_gumbel_instance( - time_series1: list, -): - Gdist = Gumbel(time_series1) - assert isinstance(Gdist.data, np.ndarray) - assert isinstance(Gdist.data_sorted, np.ndarray) +class TestGumbel: + def test_create_gumbel_instance( + self, + time_series1: list, + ): + Gdist = Gumbel(time_series1) + assert isinstance(Gdist.data, np.ndarray) + assert isinstance(Gdist.data_sorted, np.ndarray) + def test_gumbel_estimate_parameter( + self, + time_series2: list, + dist_estimation_parameters: List[str], + ): + Gdist = Gumbel(time_series2) + for i in range(len(dist_estimation_parameters)): + param = Gdist.estimateParameter( + method=dist_estimation_parameters[i], test=False + ) + assert isinstance(param, list) + assert Gdist.loc + assert Gdist.scale -def test_gumbel_estimate_parameter( - time_series2: list, - dist_estimation_parameters: List[str], -): - Gdist = Gumbel(time_series2) - for i in range(len(dist_estimation_parameters)): + def test_parameter_estimation_optimization( + self, + time_series2: list, + dist_estimation_parameters: List[str], + parameter_estimation_optimization_threshold: int, + ): + Gdist = Gumbel(time_series2) param = Gdist.estimateParameter( - method=dist_estimation_parameters[i], test=False + method="optimization", + ObjFunc=Gumbel.ObjectiveFn, + threshold=parameter_estimation_optimization_threshold, ) assert isinstance(param, list) assert Gdist.loc assert Gdist.scale + def test_gumbel_ks( + self, + time_series2: list, + dist_estimation_parameters_ks: str, + ): + Gdist = Gumbel(time_series2) + Gdist.estimateParameter(method=dist_estimation_parameters_ks, test=False) + Gdist.ks() + assert Gdist.Dstatic + assert Gdist.KS_Pvalue -def test_parameter_estimation_optimization( - time_series2: list, - dist_estimation_parameters: List[str], - parameter_estimation_optimization_threshold: int, -): - Gdist = Gumbel(time_series2) - param = Gdist.estimateParameter( - method="optimization", - ObjFunc=Gumbel.ObjectiveFn, - threshold=parameter_estimation_optimization_threshold, - ) - assert isinstance(param, list) - assert Gdist.loc - assert Gdist.scale - - -def test_gumbel_ks( - time_series2: list, - dist_estimation_parameters_ks: str, -): - Gdist = Gumbel(time_series2) - Gdist.estimateParameter(method=dist_estimation_parameters_ks, test=False) - Gdist.ks() - assert Gdist.Dstatic - assert Gdist.KS_Pvalue - - -def test_gumbel_chisquare( - time_series2: list, - dist_estimation_parameters_ks: str, -): - Gdist = Gumbel(time_series2) - Gdist.estimateParameter(method=dist_estimation_parameters_ks, test=False) - Gdist.chisquare() - assert Gdist.chistatic - assert Gdist.chi_Pvalue - - -def test_gumbel_pdf( - time_series2: list, - dist_estimation_parameters_ks: str, -): - Gdist = Gumbel(time_series2) - Param = Gdist.estimateParameter(method=dist_estimation_parameters_ks, test=False) - pdf, fig, ax = Gdist.pdf(Param[0], Param[1], plot_figure=True) - assert isinstance(pdf, np.ndarray) - assert isinstance(fig, Figure) - - -def test_gumbel_cdf( - time_series2: list, - dist_estimation_parameters_ks: str, -): - Gdist = Gumbel(time_series2) - Param = Gdist.estimateParameter(method=dist_estimation_parameters_ks, test=False) - cdf, fig, ax = Gdist.cdf(Param[0], Param[1], plot_figure=True) - assert isinstance(cdf, np.ndarray) - assert isinstance(fig, Figure) - - -def test_gumbel_TheporeticalEstimate( - time_series2: list, - dist_estimation_parameters_ks: str, -): - Gdist = Gumbel(time_series2) - cdf_Weibul = PlottingPosition.weibul(time_series2) - Param = Gdist.estimateParameter(method=dist_estimation_parameters_ks, test=False) - Qth = Gdist.theporeticalEstimate(Param[0], Param[1], cdf_Weibul) - assert isinstance(Qth, np.ndarray) - - -def test_gumbel_confidence_interval( - time_series2: list, - dist_estimation_parameters_ks: str, - confidence_interval_alpha: float, -): - Gdist = Gumbel(time_series2) - cdf_Weibul = PlottingPosition.weibul(time_series2) - Param = Gdist.estimateParameter(method=dist_estimation_parameters_ks, test=False) - upper, lower = Gdist.confidenceInterval( - Param[0], Param[1], cdf_Weibul, alpha=confidence_interval_alpha - ) - assert isinstance(upper, np.ndarray) - assert isinstance(lower, np.ndarray) - - -def test_gumbel_probapility_plot( - time_series2: list, - dist_estimation_parameters_ks: str, - confidence_interval_alpha: float, -): - Gdist = Gumbel(time_series2) - cdf_Weibul = PlottingPosition.weibul(time_series2) - Param = Gdist.estimateParameter(method=dist_estimation_parameters_ks, test=False) - [fig1, fig2], [ax1, ax2] = Gdist.probapilityPlot( - Param[0], Param[1], cdf_Weibul, alpha=confidence_interval_alpha - ) - assert isinstance(fig1, Figure) - assert isinstance(fig2, Figure) + def test_gumbel_chisquare( + self, + time_series2: list, + dist_estimation_parameters_ks: str, + ): + Gdist = Gumbel(time_series2) + Gdist.estimateParameter(method=dist_estimation_parameters_ks, test=False) + Gdist.chisquare() + assert Gdist.chistatic + assert Gdist.chi_Pvalue + def test_gumbel_pdf( + self, + time_series2: list, + dist_estimation_parameters_ks: str, + ): + Gdist = Gumbel(time_series2) + Param = Gdist.estimateParameter( + method=dist_estimation_parameters_ks, test=False + ) + pdf, fig, ax = Gdist.pdf(Param[0], Param[1], plot_figure=True) + assert isinstance(pdf, np.ndarray) + assert isinstance(fig, Figure) -def test_create_gev_instance( - time_series1: list, -): - Gdist = GEV(time_series1) - assert isinstance(Gdist.data, np.ndarray) - assert isinstance(Gdist.data_sorted, np.ndarray) + def test_gumbel_cdf( + self, + time_series2: list, + dist_estimation_parameters_ks: str, + ): + Gdist = Gumbel(time_series2) + Param = Gdist.estimateParameter( + method=dist_estimation_parameters_ks, test=False + ) + cdf, fig, ax = Gdist.cdf(Param[0], Param[1], plot_figure=True) + assert isinstance(cdf, np.ndarray) + assert isinstance(fig, Figure) + def test_gumbel_TheporeticalEstimate( + self, + time_series2: list, + dist_estimation_parameters_ks: str, + ): + Gdist = Gumbel(time_series2) + cdf_Weibul = PlottingPosition.weibul(time_series2) + Param = Gdist.estimateParameter( + method=dist_estimation_parameters_ks, test=False + ) + Qth = Gdist.theporeticalEstimate(Param[0], Param[1], cdf_Weibul) + assert isinstance(Qth, np.ndarray) -def test_gev_estimate_parameter( - time_series1: list, - dist_estimation_parameters: List[str], -): - Gdist = GEV(time_series1) - for i in range(len(dist_estimation_parameters)): - param = Gdist.estimateParameter( - method=dist_estimation_parameters[i], test=False + def test_gumbel_confidence_interval( + self, + time_series2: list, + dist_estimation_parameters_ks: str, + confidence_interval_alpha: float, + ): + Gdist = Gumbel(time_series2) + cdf_Weibul = PlottingPosition.weibul(time_series2) + Param = Gdist.estimateParameter( + method=dist_estimation_parameters_ks, test=False ) - assert isinstance(param, list) - assert Gdist.loc - assert Gdist.scale - assert Gdist.shape + upper, lower = Gdist.confidenceInterval( + Param[0], Param[1], cdf_Weibul, alpha=confidence_interval_alpha + ) + assert isinstance(upper, np.ndarray) + assert isinstance(lower, np.ndarray) + def test_gumbel_probapility_plot( + self, + time_series2: list, + dist_estimation_parameters_ks: str, + confidence_interval_alpha: float, + ): + Gdist = Gumbel(time_series2) + cdf_Weibul = PlottingPosition.weibul(time_series2) + Param = Gdist.estimateParameter( + method=dist_estimation_parameters_ks, test=False + ) + [fig1, fig2], [ax1, ax2] = Gdist.probapilityPlot( + Param[0], Param[1], cdf_Weibul, alpha=confidence_interval_alpha + ) + assert isinstance(fig1, Figure) + assert isinstance(fig2, Figure) -def test_gev_ks( - time_series1: list, - dist_estimation_parameters_ks: str, -): - Gdist = GEV(time_series1) - Gdist.estimateParameter(method=dist_estimation_parameters_ks, test=False) - Gdist.ks() - assert Gdist.Dstatic - assert Gdist.KS_Pvalue +class TestGEV: + def test_create_gev_instance( + self, + time_series1: list, + ): + Gdist = GEV(time_series1) + assert isinstance(Gdist.data, np.ndarray) + assert isinstance(Gdist.data_sorted, np.ndarray) -def test_gev_chisquare( - time_series1: list, - dist_estimation_parameters_ks: str, -): - Gdist = GEV(time_series1) - Gdist.estimateParameter(method=dist_estimation_parameters_ks, test=False) - Gdist.chisquare() - assert Gdist.chistatic - assert Gdist.chi_Pvalue + def test_gev_estimate_parameter( + self, + time_series1: list, + dist_estimation_parameters: List[str], + ): + Gdist = GEV(time_series1) + for i in range(len(dist_estimation_parameters)): + param = Gdist.estimateParameter( + method=dist_estimation_parameters[i], test=False + ) + assert isinstance(param, list) + assert Gdist.loc + assert Gdist.scale + assert Gdist.shape + def test_gev_ks( + self, + time_series1: list, + dist_estimation_parameters_ks: str, + ): + Gdist = GEV(time_series1) + Gdist.estimateParameter(method=dist_estimation_parameters_ks, test=False) + Gdist.ks() + assert Gdist.Dstatic + assert Gdist.KS_Pvalue -def test_gev_pdf( - time_series1: list, - dist_estimation_parameters_ks: str, -): - Gdist = GEV(time_series1) - Param = Gdist.estimateParameter(method=dist_estimation_parameters_ks, test=False) - pdf, fig, ax = Gdist.pdf(Param[0], Param[1], Param[2], plot_figure=True) - assert isinstance(pdf, np.ndarray) - assert isinstance(fig, Figure) + def test_gev_chisquare( + self, + time_series1: list, + dist_estimation_parameters_ks: str, + ): + Gdist = GEV(time_series1) + Gdist.estimateParameter(method=dist_estimation_parameters_ks, test=False) + Gdist.chisquare() + assert Gdist.chistatic + assert Gdist.chi_Pvalue + def test_gev_pdf( + self, + time_series1: list, + dist_estimation_parameters_ks: str, + ): + Gdist = GEV(time_series1) + Param = Gdist.estimateParameter( + method=dist_estimation_parameters_ks, test=False + ) + pdf, fig, ax = Gdist.pdf(Param[0], Param[1], Param[2], plot_figure=True) + assert isinstance(pdf, np.ndarray) + assert isinstance(fig, Figure) -def test_gev_cdf( - time_series1: list, - dist_estimation_parameters_ks: str, -): - Gdist = GEV(time_series1) - Param = Gdist.estimateParameter(method=dist_estimation_parameters_ks, test=False) - cdf, fig, ax = Gdist.cdf(Param[0], Param[1], Param[2], plot_figure=True) - assert isinstance(cdf, np.ndarray) - assert isinstance(fig, Figure) + def test_gev_cdf( + self, + time_series1: list, + dist_estimation_parameters_ks: str, + ): + Gdist = GEV(time_series1) + Param = Gdist.estimateParameter( + method=dist_estimation_parameters_ks, test=False + ) + cdf, fig, ax = Gdist.cdf(Param[0], Param[1], Param[2], plot_figure=True) + assert isinstance(cdf, np.ndarray) + assert isinstance(fig, Figure) + def test_gev_TheporeticalEstimate( + self, + time_series1: list, + dist_estimation_parameters_ks: str, + ): + Gdist = GEV(time_series1) + cdf_Weibul = PlottingPosition.weibul(time_series1) + Param = Gdist.estimateParameter( + method=dist_estimation_parameters_ks, test=False + ) + Qth = Gdist.theporeticalEstimate(Param[0], Param[1], Param[2], cdf_Weibul) + assert isinstance(Qth, np.ndarray) -def test_gev_TheporeticalEstimate( - time_series1: list, - dist_estimation_parameters_ks: str, -): - Gdist = GEV(time_series1) - cdf_Weibul = PlottingPosition.weibul(time_series1) - Param = Gdist.estimateParameter(method=dist_estimation_parameters_ks, test=False) - Qth = Gdist.theporeticalEstimate(Param[0], Param[1], Param[2], cdf_Weibul) - assert isinstance(Qth, np.ndarray) + def test_gev_confidence_interval( + self, + time_series1: list, + dist_estimation_parameters_ks: str, + confidence_interval_alpha: float, + ): + Gdist = GEV(time_series1) + cdf_Weibul = PlottingPosition.weibul(time_series1) + Param = Gdist.estimateParameter( + method=dist_estimation_parameters_ks, test=False + ) + func = GEV.ci_func + upper, lower = Gdist.confidenceInterval( + Param[0], + Param[1], + Param[2], + F=cdf_Weibul, + alpha=confidence_interval_alpha, + statfunction=func, + n_samples=len(time_series1), + ) + assert isinstance(upper, np.ndarray) + assert isinstance(lower, np.ndarray) + def test_confidence_interval_directly( + self, + time_series1: list, + dist_estimation_parameters_ks: str, + confidence_interval_alpha: float, + ): + Gdist = GEV(time_series1) + cdf_Weibul = PlottingPosition.weibul(time_series1) + Param = Gdist.estimateParameter( + method=dist_estimation_parameters_ks, test=False + ) + func = GEV.ci_func + + CI = ConfidenceInterval.BootStrap( + time_series1, + statfunction=func, + gevfit=Param, + n_samples=len(time_series1), + F=cdf_Weibul, + method="lmoments", + ) + LB = CI["LB"] + UB = CI["UB"] -def test_gev_confidence_interval( - time_series1: list, - dist_estimation_parameters_ks: str, - confidence_interval_alpha: float, -): - Gdist = GEV(time_series1) - cdf_Weibul = PlottingPosition.weibul(time_series1) - Param = Gdist.estimateParameter(method=dist_estimation_parameters_ks, test=False) - func = GEV.ci_func - upper, lower = Gdist.confidenceInterval( - Param[0], - Param[1], - Param[2], - F=cdf_Weibul, - alpha=confidence_interval_alpha, - statfunction=func, - n_samples=len(time_series1), - ) - assert isinstance(upper, np.ndarray) - assert isinstance(lower, np.ndarray) - - -def test_confidence_interval_directly( - time_series1: list, - dist_estimation_parameters_ks: str, - confidence_interval_alpha: float, -): - Gdist = GEV(time_series1) - cdf_Weibul = PlottingPosition.weibul(time_series1) - Param = Gdist.estimateParameter(method=dist_estimation_parameters_ks, test=False) - func = GEV.ci_func - # upper, lower = Gdist.ConfidenceInterval( - # Param[0], Param[1], Param[2], F=cdf_Weibul, alpha=confidence_interval_alpha, - # statfunction=func, n_samples=len(time_series1) - # ) - CI = ConfidenceInterval.BootStrap( - time_series1, - statfunction=func, - gevfit=Param, - n_samples=len(time_series1), - F=cdf_Weibul, - ) - LB = CI["LB"] - UB = CI["UB"] - - assert isinstance(LB, np.ndarray) - assert isinstance(UB, np.ndarray) + assert isinstance(LB, np.ndarray) + assert isinstance(UB, np.ndarray) class TestExponential: