diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml new file mode 100644 index 000000000..5354d671d --- /dev/null +++ b/.github/dependabot.yaml @@ -0,0 +1,36 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +version: 2 +updates: + - package-ecosystem: "pip" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" + time: "09:00" + day: "monday" + timezone: "Europe/London" + commit-message: + prefix: "build" + include: "scope" + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + time: "09:30" + day: "monday" + timezone: "Europe/London" + commit-message: + prefix: "chore" + include: "scope" + + - package-ecosystem: "docker" + directory: "/src/airflow/" + schedule: + interval: "weekly" + time: "09:30" + day: "monday" + timezone: "Europe/London" + commit-message: + prefix: "build" + include: "scope" diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml deleted file mode 100644 index 90a9b71dd..000000000 --- a/.github/workflows/docs.yaml +++ /dev/null @@ -1,35 +0,0 @@ -name: docs -on: - push: - branches: - - main -jobs: - docs: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.10.8 - - name: Install and configure Poetry - uses: snok/install-poetry@v1 - with: - virtualenvs-create: true - virtualenvs-in-project: true - installer-parallel: true - - name: Load cached venv - id: cached-poetry-dependencies - uses: actions/cache@v2 - with: - path: .venv - key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }} - - name: Install dependencies - if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' - run: poetry install --no-interaction --no-root - - name: Install library - run: poetry install --without tests --no-interaction - - name: Publish docs - run: poetry run mkdocs gh-deploy --force diff --git a/.github/workflows/pytest.yaml b/.github/workflows/pr.yaml similarity index 70% rename from .github/workflows/pytest.yaml rename to .github/workflows/pr.yaml index b43bbc997..9cfe58485 100644 --- a/.github/workflows/pytest.yaml +++ b/.github/workflows/pr.yaml @@ -1,14 +1,20 @@ -name: tests -on: [push] +name: Checks + +"on": + pull_request: + +env: + PYTHON_VERSION_DEFAULT: "3.10.8" + jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 1 - name: Set up Python - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: 3.10.8 - name: Install and configure Poetry @@ -19,15 +25,19 @@ jobs: installer-parallel: true - name: Load cached venv id: cached-poetry-dependencies - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: .venv - key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }} + key: venv-${{ runner.os }}-${{ env.PYTHON_VERSION_DEFAULT }}-${{ hashFiles('**/poetry.lock') }} + - name: Validate project dependencies + run: poetry check - name: Install dependencies if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' run: poetry install --no-interaction --no-root - name: Install library run: poetry install --no-interaction + - name: Check dependencies + run: poetry run deptry . - name: Run tests run: poetry run pytest - name: Upload coverage to Codecov diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 000000000..4fe48f20f --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,107 @@ +name: Release + +"on": + push: + branches: ["main", "master", "release/**"] + +concurrency: + group: deploy + cancel-in-progress: false # prevent hickups with semantic-release + +env: + PYTHON_VERSION_DEFAULT: "3.10.8" + +jobs: + Release: + if: github.event_name == 'push' && !contains(github.event.head_commit.message, 'chore(release):') + runs-on: ubuntu-latest + permissions: + # NOTE: this enables trusted publishing. + # See https://github.com/pypa/gh-action-pypi-publish/tree/release/v1#trusted-publishing + # and https://blog.pypi.org/posts/2023-04-20-introducing-trusted-publishers/ + id-token: write + contents: write + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + repository: opentargets/genetics_etl_python + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION_DEFAULT }} + - name: Install and configure Poetry + uses: snok/install-poetry@v1 + with: + virtualenvs-create: true + virtualenvs-in-project: true + installer-parallel: true + - name: Load cached venv + id: cached-poetry-dependencies + uses: actions/cache@v3 + with: + path: .venv + key: | + venv-${{ runner.os }}-\ + ${{ env.PYTHON_VERSION_DEFAULT }}-\ + ${{ hashFiles('**/poetry.lock') }} + + - name: Validate project dependencies + run: poetry check + + - name: Install dependencies + if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' + run: poetry install --no-interaction --no-root + + - name: Python Semantic Release + id: release + uses: python-semantic-release/python-semantic-release@v8.7.0 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + + - name: Publish package distributions to GitHub Releases + if: steps.release.outputs.released == 'true' + # see https://github.com/python-semantic-release/upload-to-gh-release + uses: python-semantic-release/upload-to-gh-release@main + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + tag: ${{ steps.release.outputs.tag }} + + Documentation: + needs: Release + runs-on: ubuntu-latest + if: github.ref == 'refs/heads/main' + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: ${{ env.PYTHON_VERSION_DEFAULT }} + - name: Install and configure Poetry + uses: snok/install-poetry@v1 + with: + virtualenvs-create: true + virtualenvs-in-project: true + installer-parallel: true + - name: Load cached venv + id: cached-poetry-dependencies + uses: actions/cache@v3 + with: + path: .venv + key: | + venv-${{ runner.os }}-\ + ${{ env.PYTHON_VERSION_DEFAULT }}-\ + ${{ hashFiles('**/poetry.lock') }} + - name: Install dependencies + if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' + run: poetry install --no-interaction --no-root + - name: Install library + run: poetry install --without tests --no-interaction + - name: Publish docs + run: poetry run mkdocs gh-deploy --force diff --git a/.gitignore b/.gitignore index a32879400..07c8bef82 100644 --- a/.gitignore +++ b/.gitignore @@ -7,5 +7,7 @@ outputs/ coverage.xml docs/assets/schemas/ .cache/ -src/airflow/logs/ +src/airflow/logs/* +!src/airflow/logs/.gitkeep site/ +.env diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 11abbedf6..2a7d9b00f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,4 +1,13 @@ repos: + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.1.6 + hooks: + - id: ruff + args: + - --fix + - id: ruff-format + files: ^((otg|utils|tests)/.+)?[^/]+\.py$ + - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.5.0 hooks: @@ -8,16 +17,20 @@ repos: - id: check-merge-conflict - id: check-case-conflict - id: check-json + exclude: (.vscode|.devcontainer) + - id: no-commit-to-branch + args: + - --branch=dev + - --branch=main - id: check-toml - id: check-yaml - - id: pretty-format-json - args: - - --autofix - - --no-ensure-ascii - - --no-sort-keys - id: check-ast - id: debug-statements - id: check-docstring-first + - repo: https://github.com/adrienverge/yamllint.git + rev: v1.32.0 + hooks: + - id: yamllint - repo: https://github.com/pre-commit/pygrep-hooks rev: v1.10.0 @@ -27,39 +40,39 @@ repos: - id: python-check-blanket-noqa - repo: https://github.com/hadialqattan/pycln - rev: v2.2.2 + rev: v2.4.0 hooks: - id: pycln args: [--all] - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.0.292 + - repo: https://github.com/pre-commit/mirrors-prettier + rev: "v3.0.3" hooks: - - id: ruff - - - repo: https://github.com/pycqa/isort - rev: 5.12.0 - hooks: - - id: isort - args: [--add-import, from __future__ import annotations, --profile, black] - - - - repo: https://github.com/psf/black - rev: 23.9.1 - hooks: - - id: black + - id: prettier + args: ["--staged"] - repo: https://github.com/alessandrojcm/commitlint-pre-commit-hook - rev: v9.5.0 + rev: v9.10.0 hooks: - id: commitlint - additional_dependencies: ['@commitlint/config-conventional'] + additional_dependencies: ["@commitlint/config-conventional"] stages: [commit-msg] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.5.1' + rev: "v1.7.1" hooks: - id: mypy + args: + - "--ignore-missing-imports" + - "--check-untyped-defs" + - "--disallow-any-generics" + - "--disallow-incomplete-defs" + - "--no-implicit-optional" + - "--no-implicit-reexport" + - "--strict-equality" + - "--warn-redundant-casts" + - "--warn-unused-ignores" + - "--disallow-untyped-defs" - repo: https://github.com/econchick/interrogate rev: 1.5.0 @@ -71,8 +84,14 @@ repos: rev: 6.3.0 hooks: - id: pydocstyle - args: [--convention=google] + args: [--convention=google, --add-ignore=D107] + - repo: https://github.com/lovesegfault/beautysh rev: v6.2.1 hooks: - id: beautysh + + - repo: https://github.com/jsh9/pydoclint + rev: 0.3.8 + hooks: + - id: pydoclint diff --git a/.vscode/extensions.json b/.vscode/extensions.json index e434673de..1be2f117e 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,12 +1,11 @@ { "recommendations": [ "charliermarsh.ruff", - "ms-python.isort", "ms-python.mypy-type-checker", "ms-python.python", - "ms-python.black-formatter" + "esbenp.prettier-vscode", + "redhat.vscode-yaml", + "fnando.linter" ], - "unwantedRecommendations": [ - "ms-python.flake8" - ] + "unwantedRecommendations": ["ms-python.flake8"] } diff --git a/.vscode/launch.json b/.vscode/launch.json index 796274c77..1d3659207 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -8,9 +8,7 @@ "program": "${file}", "console": "integratedTerminal", "justMyCode": true, - "args": [ - "--config-dir=./configs" - ] + "args": ["--config-dir=./configs"] }, { "name": "Python: Current File [local]", @@ -19,10 +17,7 @@ "program": "${file}", "console": "integratedTerminal", "justMyCode": true, - "args": [ - "--config-dir=./configs", - "environment=local" - ] + "args": ["--config-dir=./configs", "environment=local"] } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 727b1d959..aaafda97f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,43 +1,29 @@ { "[python]": { - "editor.defaultFormatter": "ms-python.black-formatter", + "editor.defaultFormatter": "charliermarsh.ruff", "editor.formatOnPaste": false, "editor.formatOnSave": true, "editor.codeActionsOnSave": { - "source.fixAll": false, - "source.organizeImports": true + "source.fixAll": "never", + "source.organizeImports": "explicit" } }, - "python.terminal.launchArgs": [ - "-m", - "IPython", - "--no-autoindent" - ], + "python.terminal.launchArgs": ["-m", "IPython", "--no-autoindent"], "[jsonc]": { "editor.tabSize": 2, "editor.insertSpaces": true, "editor.detectIndentation": false, "editor.formatOnSave": true, "editor.codeActionsOnSave": { - "source.organizeImports": true + "source.organizeImports": "explicit" } }, "json.format.keepLines": true, - "isort.args": [ - "--profile", - "black" - ], "autoDocstring.docstringFormat": "google", - "python.testing.pytestArgs": [ - ".", - "--doctest-modules", - "--cov=src/" - ], + "python.testing.pytestArgs": [".", "--doctest-modules", "--cov=src/"], "python.testing.unittestEnabled": false, "python.testing.pytestEnabled": true, "mypy-type-checker.severity": { "error": "Information" - }, - "ruff.fixAll": false, - "ruff.organizeImports": false + } } diff --git a/.yamllint b/.yamllint new file mode 100644 index 000000000..0148408de --- /dev/null +++ b/.yamllint @@ -0,0 +1,59 @@ +rules: + braces: + level: error + min-spaces-inside: 0 + max-spaces-inside: 1 + min-spaces-inside-empty: -1 + max-spaces-inside-empty: -1 + brackets: + level: error + min-spaces-inside: 0 + max-spaces-inside: 0 + min-spaces-inside-empty: -1 + max-spaces-inside-empty: -1 + colons: + level: error + max-spaces-before: 0 + max-spaces-after: 1 + commas: + level: error + max-spaces-before: 0 + min-spaces-after: 1 + max-spaces-after: 1 + comments: + level: error + require-starting-space: true + min-spaces-from-content: 1 + comments-indentation: + level: error + document-end: + level: error + present: false + document-start: + level: error + present: false + empty-lines: + level: error + max: 1 + max-start: 0 + max-end: 1 + hyphens: + level: error + max-spaces-after: 1 + indentation: + level: error + spaces: 2 + indent-sequences: true + check-multi-line-strings: false + key-duplicates: + level: error + line-length: disable + new-line-at-end-of-file: + level: error + new-lines: + level: error + type: unix + trailing-spaces: + level: error + truthy: + level: error diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..afaa98fe5 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +- Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, and sexual attention or + advances of any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email + address, without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/LICENSE.md b/LICENSE.md index 261eeb9e9..c61b66391 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -2,180 +2,180 @@ Version 2.0, January 2004 http://www.apache.org/licenses/ - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" @@ -186,16 +186,16 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] +Copyright [yyyy] [name of copyright owner] - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/Makefile b/Makefile index 49bba7b4a..627385541 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ PROJECT_ID ?= open-targets-genetics-dev REGION ?= europe-west1 -APP_NAME ?= $$(cat pyproject.toml| grep name | cut -d" " -f3 | sed 's/"//g') +APP_NAME ?= $$(cat pyproject.toml| grep -m 1 "name" | cut -d" " -f3 | sed 's/"//g') VERSION_NO ?= $$(poetry version --short) CLEAN_VERSION_NO := $(shell echo "$(VERSION_NO)" | tr -cd '[:alnum:]') BUCKET_NAME=gs://genetics_etl_python_playground/initialisation/${VERSION_NO}/ @@ -21,11 +21,11 @@ setup-dev: ## Setup development environment @. utils/install_dependencies.sh check: ## Lint and format code - @echo "Linting..." + @echo "Linting API..." @poetry run ruff src/otg . - @echo "Formatting..." - @poetry run black src/otg . - @poetry run isort src/otg . + @echo "Linting docstrings..." + @poetry run pydoclint --config=pyproject.toml src + @poetry run pydoclint --config=pyproject.toml --skip-checking-short-docstrings=true tests test: ## Run tests @echo "Running Tests..." @@ -35,8 +35,7 @@ build-documentation: ## Create local server with documentation @echo "Building Documentation..." @poetry run mkdocs serve -create-dev-cluster: ## Spin up a simple dataproc cluster with all dependencies for development purposes - @${MAKE} build +create-dev-cluster: build ## Spin up a simple dataproc cluster with all dependencies for development purposes @echo "Creating Dataproc Dev Cluster" @gcloud config set project ${PROJECT_ID} @gcloud dataproc clusters create "ot-genetics-dev-${CLEAN_VERSION_NO}" \ @@ -46,10 +45,10 @@ create-dev-cluster: ## Spin up a simple dataproc cluster with all dependencies f --initialization-actions=gs://genetics_etl_python_playground/initialisation/${VERSION_NO}/install_dependencies_on_cluster.sh \ --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${VERSION_NO}/otgenetics-${VERSION_NO}-py3-none-any.whl,CONFIGTAR=gs://genetics_etl_python_playground/initialisation/${VERSION_NO}/config.tar.gz" \ --single-node \ + --optional-components=JUPYTER \ --enable-component-gateway -make update-dev-cluster: ## Reinstalls the package on the dev-cluster - @${MAKE} build +make update-dev-cluster: build ## Reinstalls the package on the dev-cluster @echo "Updating Dataproc Dev Cluster" @gcloud config set project ${PROJECT_ID} gcloud dataproc jobs submit pig --cluster="ot-genetics-dev-${CLEAN_VERSION_NO}" \ @@ -60,7 +59,6 @@ make update-dev-cluster: ## Reinstalls the package on the dev-cluster build: clean ## Build Python package with dependencies @gcloud config set project ${PROJECT_ID} @echo "Packaging Code and Dependencies for ${APP_NAME}-${VERSION_NO}" - @rm -rf ./dist @poetry build @tar -czf dist/config.tar.gz config/ @echo "Uploading to Dataproc" diff --git a/Makefile_deprecated b/Makefile_deprecated deleted file mode 100644 index df9617ce9..000000000 --- a/Makefile_deprecated +++ /dev/null @@ -1,186 +0,0 @@ -PROJECT_ID ?= open-targets-genetics-dev -REGION ?= europe-west1 -CLUSTER_NAME ?= ${USER}-genetics-etl -PROJECT_NUMBER ?= $$(gcloud projects list --filter=${PROJECT_ID} --format="value(PROJECT_NUMBER)") -APP_NAME ?= $$(cat pyproject.toml| grep name | cut -d" " -f3 | sed 's/"//g') -VERSION_NO ?= $$(poetry version --short) -SRC_WITH_DEPS ?= code_bundle - -.PHONY: $(shell sed -n -e '/^$$/ { n ; /^[^ .\#][^ ]*:/ { s/:.*$$// ; p ; } ; }' $(MAKEFILE_LIST)) - -.DEFAULT_GOAL := help - -help: ## This is help - @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) - -clean: ## CleanUp Prior to Build - @rm -Rf ./dist - @rm -Rf ./${SRC_WITH_DEPS} - @rm -f requirements.txt - -setup-dev: SHELL:=/bin/bash -setup-dev: ## Setup dev environment - @. utils/install_dependencies.sh - -build: clean ## Build Python Package with Dependencies - @echo "Packaging Code and Dependencies for ${APP_NAME}-${VERSION_NO}" - @rm -rf ./dist - @poetry build - @cp ./src/*.py ./dist - @poetry run python ./utils/configure.py --cfg job > ./dist/config.yaml - @echo "Uploading to Dataproc" - @gsutil cp ./dist/${APP_NAME}-${VERSION_NO}-py3-none-any.whl gs://genetics_etl_python_playground/initialisation/ - @gsutil cp ./utils/initialise_cluster.sh gs://genetics_etl_python_playground/initialisation/ - -prepare_pics: ## Create cluster for variant annotation: - gcloud dataproc clusters create ${CLUSTER_NAME} \ - --image-version=2.0 \ - --project=${PROJECT_ID} \ - --region=${REGION} \ - --master-machine-type=n1-highmem-96 \ - --enable-component-gateway \ - --num-master-local-ssds=1 \ - --master-local-ssd-interface=NVME \ - --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ - --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ - --single-node \ - --max-idle=10m - -prepare_variant_annotation: ## Create cluster for variant annotation - gcloud dataproc clusters create ${CLUSTER_NAME} \ - --image-version=2.0 \ - --project=${PROJECT_ID} \ - --region=${REGION} \ - --master-machine-type=n1-highmem-96 \ - --enable-component-gateway \ - --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ - --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ - --single-node \ - --max-idle=10m - -prepare_variant_index: ## Create cluster for variant index generation - gcloud dataproc clusters create ${CLUSTER_NAME} \ - --image-version=2.0 \ - --project=${PROJECT_ID} \ - --region=${REGION} \ - --master-machine-type=n1-highmem-32 \ - --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ - --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ - --enable-component-gateway \ - --single-node \ - --max-idle=10m - -prepare_v2g: ## Create cluster for variant to gene data generation - gcloud dataproc clusters create ${CLUSTER_NAME} \ - --image-version=2.0 \ - --project=${PROJECT_ID} \ - --region=${REGION} \ - --master-machine-type=n1-highmem-64 \ - --enable-component-gateway \ - --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ - --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ - --single-node \ - --max-idle=10m - -prepare_v2g: ## Create cluster for variant to gene data generation - gcloud dataproc clusters create ${CLUSTER_NAME} \ - --image-version=2.0 \ - --project=${PROJECT_ID} \ - --region=${REGION} \ - --master-machine-type=n1-highmem-64 \ - --enable-component-gateway \ - --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ - --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ - --single-node \ - --max-idle=10m - -prepare_coloc: ## Create cluster for coloc - gcloud dataproc clusters create ${CLUSTER_NAME} \ - --image-version=2.0 \ - --project=${PROJECT_ID} \ - --region=${REGION} \ - --master-machine-type=n1-highmem-64 \ - --num-master-local-ssds=1 \ - --master-local-ssd-interface=NVME \ - --enable-component-gateway \ - --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ - --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ - --single-node \ - --max-idle=10m - -prepare_gwas: ## Create cluster for gwas data generation - gcloud dataproc clusters create ${CLUSTER_NAME} \ - --image-version=2.0 \ - --project=${PROJECT_ID} \ - --region=${REGION} \ - --master-machine-type=n1-highmem-32 \ - --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ - --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ - --enable-component-gateway \ - --single-node \ - --max-idle=10m - -run_coloc: ## Generate coloc results - gcloud dataproc jobs submit pyspark ./dist/run_coloc.py \ - --cluster=${CLUSTER_NAME} \ - --files=./dist/config.yaml \ - --py-files=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl \ - --project=${PROJECT_ID} \ - --region=${REGION} - -run_v2g: ## Generate V2G dataset - gcloud dataproc jobs submit pyspark ./dist/run_v2g.py \ - --cluster=${CLUSTER_NAME} \ - --files=./dist/config.yaml \ - --py-files=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl \ - --project=${PROJECT_ID} \ - --region=${REGION} - -run_v2g: ## Generate V2G dataset - gcloud dataproc jobs submit pyspark ./dist/run_v2g.py \ - --cluster=${CLUSTER_NAME} \ - --files=./dist/config.yaml \ - --py-files=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl \ - --project=${PROJECT_ID} \ - --region=${REGION} - -run_variant_annotation: ## Generate variant annotation dataset - gcloud dataproc jobs submit pyspark ./dist/run_variant_annotation.py \ - --cluster=${CLUSTER_NAME} \ - --files=./dist/config.yaml \ - --properties='spark.jars=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.driver.extraClassPath=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.executor.extraClassPath=./hail-all-spark.jar,spark.serializer=org.apache.spark.serializer.KryoSerializer,spark.kryo.registrator=is.hail.kryo.HailKryoRegistrator' \ - --project=${PROJECT_ID} \ - --region=${REGION} - -run_variant_index: ## Generate variant index dataset - gcloud dataproc jobs submit pyspark ./dist/run_variant_index.py \ - --cluster=${CLUSTER_NAME} \ - --files=./dist/config.yaml \ - --py-files=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl \ - --project=${PROJECT_ID} \ - --region=${REGION} - -run_gwas: ## Ingest gwas dataset on a dataproc cluster - gcloud dataproc jobs submit pyspark ./dist/run_gwas_ingest.py \ - --cluster=${CLUSTER_NAME} \ - --files=./dist/config.yaml \ - --properties='spark.jars=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.driver.extraClassPath=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.executor.extraClassPath=./hail-all-spark.jar,spark.serializer=org.apache.spark.serializer.KryoSerializer,spark.kryo.registrator=is.hail.kryo.HailKryoRegistrator' \ - --py-files=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl \ - --project=${PROJECT_ID} \ - --region=${REGION} - -run_pics: ## Run pics method - gcloud dataproc jobs submit pyspark ./dist/pics_experiment.py \ - --cluster=${CLUSTER_NAME} \ - --files=./dist/config.yaml \ - --properties='spark.jars=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.driver.extraClassPath=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.executor.extraClassPath=./hail-all-spark.jar,spark.serializer=org.apache.spark.serializer.KryoSerializer,spark.kryo.registrator=is.hail.kryo.HailKryoRegistrator' \ - --project=${PROJECT_ID} \ - --region=${REGION} - -run_precompute_ld_index: ## Precompute ld-index information - gcloud dataproc jobs submit pyspark ./dist/run_precompute_ld_indexes.py \ - --cluster=${CLUSTER_NAME} \ - --files=./dist/config.yaml \ - --properties='spark.jars=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.driver.extraClassPath=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.executor.extraClassPath=./hail-all-spark.jar,spark.serializer=org.apache.spark.serializer.KryoSerializer,spark.kryo.registrator=is.hail.kryo.HailKryoRegistrator' \ - --project=${PROJECT_ID} \ - --region=${REGION} diff --git a/README.md b/README.md index b1ec5ba19..5be708d82 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ [![docs](https://github.com/opentargets/genetics_etl_python/actions/workflows/docs.yaml/badge.svg)](https://opentargets.github.io/genetics_etl_python/) [![codecov](https://codecov.io/gh/opentargets/genetics_etl_python/branch/main/graph/badge.svg?token=5ixzgu8KFP)](https://codecov.io/gh/opentargets/genetics_etl_python) [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) -[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/opentargets/genetics_etl_python/main.svg)](https://results.pre-commit.ci/badge/github/opentargets/genetics_etl_python) # Genetics Portal Data Pipeline (experimental) + - [Documentation](https://opentargets.github.io/genetics_etl_python/) diff --git a/codecov.yml b/codecov.yml index d817e3746..945dba691 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,8 +1,10 @@ +codecov: + branch: dev comment: layout: "reach, diff, flags, files" behavior: default - require_changes: false # if true: only post the comment if coverage changes + require_changes: false # if true: only post the comment if coverage changes coverage: status: diff --git a/commitlint.config.js b/commitlint.config.js index 3347cb961..5073c20db 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -1 +1 @@ -module.exports = {extends: ['@commitlint/config-conventional']}; +module.exports = { extends: ["@commitlint/config-conventional"] }; diff --git a/config/my_config.yaml b/config/config.yaml similarity index 60% rename from config/my_config.yaml rename to config/config.yaml index 8a4d21399..1e524ed5f 100644 --- a/config/my_config.yaml +++ b/config/config.yaml @@ -1,4 +1,4 @@ defaults: - datasets: gcp - - session: dataproc + - step/session: dataproc - step: ??? diff --git a/config/datasets/gcp.yaml b/config/datasets/gcp.yaml index 9b7af54a0..e8d949ecd 100644 --- a/config/datasets/gcp.yaml +++ b/config/datasets/gcp.yaml @@ -1,47 +1,49 @@ - # Input/Output paths version: XX.XX inputs: gs://genetics_etl_python_playground/input outputs: gs://genetics_etl_python_playground/output/python_etl/parquet/${datasets.version} # Input datasets -gnomad_gnomes: gs://gcp-public-data--gnomad/release/3.1.2/ht/genomes/gnomad.genomes.v3.1.2.sites.ht -chain_hail_38_37: gs://hail-common/references/grch38_to_grch37.over.chain.gz -chain_hail_37_38: gs://hail-common/references/grch37_to_grch38.over.chain.gz chain_37_38: ${datasets.inputs}/v2g_input/grch37_to_grch38.over.chain target_index: ${datasets.inputs}/v2g_input/targets_correct_tss vep_consequences: gs://genetics-portal-data/lut/vep_consequences.tsv anderson: gs://genetics-portal-input/v2g_input/andersson2014/enhancer_tss_associations.bed javierre: gs://genetics-portal-input/v2g_input/javierre_2016_preprocessed.parquet jung: gs://genetics-portal-raw/pchic_jung2019/jung2019_pchic_tableS3.csv -thrunman: gs://genetics-portal-input/v2g_input/thurman2012/genomewideCorrs_above0.7_promoterPlusMinus500kb_withGeneNames_32celltypeCategories.bed8.gz -catalog_associations: ${datasets.inputs}/v2d/gwas_catalog_v1.0.2-associations_e110_r2023-09-11.tsv -catalog_studies: ${datasets.inputs}/v2d/gwas-catalog-v1.0.3-studies-r2023-09-11.tsv -catalog_ancestries: ${datasets.inputs}/v2d/gwas-catalog-v1.0.3-ancestries-r2023-09-11.tsv -catalog_sumstats_lut: ${datasets.inputs}/v2d/harmonised_list-r2023-09-11.txt -finngen_phenotype_table_url: https://r9.finngen.fi/api/phenos +thurman: gs://genetics-portal-input/v2g_input/thurman2012/genomewideCorrs_above0.7_promoterPlusMinus500kb_withGeneNames_32celltypeCategories.bed8.gz +catalog_associations: ${datasets.inputs}/v2d/gwas_catalog_v1.0.2-associations_e110_r2023-11-24.tsv +catalog_studies: + # To get a complete representation of all GWAS Catalog studies, we need to + # ingest the list of unpublished studies from a different file. + - ${datasets.inputs}/v2d/gwas-catalog-v1.0.3-studies-r2023-11-24.tsv + - ${datasets.inputs}/v2d/gwas-catalog-v1.0.3-unpublished-studies-r2023-11-24.tsv +catalog_ancestries: + - ${datasets.inputs}/v2d/gwas-catalog-v1.0.3-ancestries-r2023-11-24.tsv + - ${datasets.inputs}/v2d/gwas-catalog-v1.0.3-unpublished-ancestries-r2023-11-24.tsv +catalog_sumstats_lut: ${datasets.inputs}/v2d/harmonised_list-r2023-11-24a.txt ukbiobank_manifest: gs://genetics-portal-input/ukb_phenotypes/neale2_saige_study_manifest.190430.tsv - -# Templates -ld_index_raw_template: gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.ld.variant_indices.ht -ld_matrix_template: gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.adj.ld.bm +l2g_gold_standard_curation: ${datasets.inputs}/l2g/gold_standard/curation.json +gene_interactions: ${datasets.inputs}/l2g/interaction # 23.09 data +eqtl_catalogue_paths_imported: ${datasets.inputs}/preprocess/eqtl_catalogue/tabix_ftp_paths_imported.tsv # Output datasets -gene_index: ${datasets.outputs}/gene_index/gene_index +gene_index: ${datasets.outputs}/gene_index variant_annotation: ${datasets.outputs}/variant_annotation variant_index: ${datasets.outputs}/variant_index +study_index: ${datasets.outputs}/study_index study_locus: ${datasets.outputs}/study_locus +credible_set: ${datasets.outputs}/credible_set +summary_statistics: ${datasets.outputs}/summary_statistics study_locus_overlap: ${datasets.outputs}/study_locus_overlap colocalisation: ${datasets.outputs}/colocalisation v2g: ${datasets.outputs}/v2g ld_index: ${datasets.outputs}/ld_index -catalog_study_index: ${datasets.outputs}/catalog_study_index -catalog_study_locus: ${datasets.outputs}/catalog_study_locus -finngen_study_index: ${datasets.outputs}/finngen_study_index -finngen_summary_stats: ${datasets.outputs}/finngen_summary_stats -ukbiobank_study_index: ${datasets.outputs}/ukbiobank_study_index - -# Constants -finngen_release_prefix: FINNGEN_R9 -finngen_sumstat_url_prefix: https://storage.googleapis.com/finngen-public-data-r9/summary_stats/finngen_R9_ -finngen_sumstat_url_suffix: .gz +catalog_study_index: ${datasets.study_index}/catalog +catalog_study_locus: ${datasets.study_locus}/catalog_study_locus +finngen_study_index: ${datasets.study_index}/finngen +finngen_summary_stats: ${datasets.summary_statistics}/finngen +from_sumstats_study_locus: ${datasets.study_locus}/from_sumstats +from_sumstats_pics: ${datasets.credible_set}/from_sumstats +ukbiobank_study_index: ${datasets.study_index}/ukbiobank +l2g_model: ${datasets.outputs}/l2g_model +l2g_predictions: ${datasets.outputs}/l2g_predictions diff --git a/config/step/clump.yaml b/config/step/clump.yaml new file mode 100644 index 000000000..04790663f --- /dev/null +++ b/config/step/clump.yaml @@ -0,0 +1,6 @@ +_target_: otg.clump.ClumpStep +input_path: ??? +ld_index_path: null +study_index_path: null +locus_collect_distance: null +clumped_study_locus_path: ??? diff --git a/config/step/my_colocalisation.yaml b/config/step/colocalisation.yaml similarity index 55% rename from config/step/my_colocalisation.yaml rename to config/step/colocalisation.yaml index af05c2d66..0a39dd338 100644 --- a/config/step/my_colocalisation.yaml +++ b/config/step/colocalisation.yaml @@ -1,6 +1,3 @@ -# Default config -defaults: - - colocalisation -# Additional config +_target_: otg.colocalisation.ColocalisationStep study_locus_path: ${datasets.study_locus} coloc_path: ${datasets.colocalisation} diff --git a/config/step/eqtl_catalogue.yaml b/config/step/eqtl_catalogue.yaml new file mode 100644 index 000000000..04a958993 --- /dev/null +++ b/config/step/eqtl_catalogue.yaml @@ -0,0 +1,4 @@ +_target_: otg.eqtl_catalogue.EqtlCatalogueStep +eqtl_catalogue_paths_imported: ${datasets.eqtl_catalogue_paths_imported} +eqtl_catalogue_study_index_out: ${datasets.eqtl_catalogue_study_index_out} +eqtl_catalogue_summary_stats_out: ${datasets.eqtl_catalogue_summary_stats_out} diff --git a/config/step/finngen_studies.yaml b/config/step/finngen_studies.yaml new file mode 100644 index 000000000..23b58c443 --- /dev/null +++ b/config/step/finngen_studies.yaml @@ -0,0 +1,2 @@ +_target_: otg.finngen_studies.FinnGenStudiesStep +finngen_study_index_out: ${datasets.finngen_study_index} diff --git a/config/step/finngen_sumstat_preprocess.yaml b/config/step/finngen_sumstat_preprocess.yaml new file mode 100644 index 000000000..319e7af63 --- /dev/null +++ b/config/step/finngen_sumstat_preprocess.yaml @@ -0,0 +1,3 @@ +_target_: otg.finngen_sumstat_preprocess.FinnGenSumstatPreprocessStep +raw_sumstats_path: ??? +out_sumstats_path: ??? diff --git a/config/step/my_gene_index.yaml b/config/step/gene_index.yaml similarity index 55% rename from config/step/my_gene_index.yaml rename to config/step/gene_index.yaml index 20c2bc3b7..20de8dfbe 100644 --- a/config/step/my_gene_index.yaml +++ b/config/step/gene_index.yaml @@ -1,6 +1,3 @@ -# Default config -defaults: - - gene_index -# Additional config +_target_: otg.gene_index.GeneIndexStep target_path: ${datasets.target_index} gene_index_path: ${datasets.gene_index} diff --git a/config/step/my_gwas_catalog.yaml b/config/step/gwas_catalog_ingestion.yaml similarity index 58% rename from config/step/my_gwas_catalog.yaml rename to config/step/gwas_catalog_ingestion.yaml index 70fab08d3..863c75ac2 100644 --- a/config/step/my_gwas_catalog.yaml +++ b/config/step/gwas_catalog_ingestion.yaml @@ -1,12 +1,8 @@ -# Default config -defaults: - - gwas_catalog -# Additional config -catalog_studies_file: ${datasets.catalog_studies} -catalog_ancestry_file: ${datasets.catalog_ancestries} +_target_: otg.gwas_catalog.GWASCatalogStep +catalog_study_files: ${datasets.catalog_studies} +catalog_ancestry_files: ${datasets.catalog_ancestries} catalog_associations_file: ${datasets.catalog_associations} catalog_sumstats_lut: ${datasets.catalog_sumstats_lut} variant_annotation_path: ${datasets.variant_annotation} -ld_index_path: ${datasets.ld_index} catalog_studies_out: ${datasets.catalog_study_index} catalog_associations_out: ${datasets.catalog_study_locus} diff --git a/config/step/gwas_catalog_sumstat_preprocess.yaml b/config/step/gwas_catalog_sumstat_preprocess.yaml new file mode 100644 index 000000000..29d3486e8 --- /dev/null +++ b/config/step/gwas_catalog_sumstat_preprocess.yaml @@ -0,0 +1,3 @@ +_target_: otg.gwas_catalog_sumstat_preprocess.GWASCatalogSumstatsPreprocessStep +raw_sumstats_path: ??? +out_sumstats_path: ??? diff --git a/config/step/ld_index.yaml b/config/step/ld_index.yaml new file mode 100644 index 000000000..86f595076 --- /dev/null +++ b/config/step/ld_index.yaml @@ -0,0 +1,6 @@ +_target_: otg.ld_index.LDIndexStep + +session: + start_hail: true + +ld_index_out: ${datasets.ld_index} diff --git a/config/step/locus_to_gene.yaml b/config/step/locus_to_gene.yaml new file mode 100644 index 000000000..471ef5195 --- /dev/null +++ b/config/step/locus_to_gene.yaml @@ -0,0 +1,20 @@ +_target_: otg.l2g.LocusToGeneStep + +session: + extended_spark_conf: + spark.dynamicAllocation.enabled: false +run_mode: train +wandb_run_name: null +perform_cross_validation: false +model_path: ${datasets.l2g_model} +predictions_path: ${datasets.l2g_predictions} +credible_set_path: ${datasets.credible_set} +variant_gene_path: ${datasets.v2g} +colocalisation_path: ${datasets.colocalisation} +study_index_path: ${datasets.study_index} +study_locus_overlap_path: ${datasets.study_locus_overlap} +gold_standard_curation_path: ${datasets.l2g_gold_standard_curation} +gene_interactions_path: ${datasets.gene_interactions} +hyperparameters: + max_depth: 5 + loss_function: binary:logistic diff --git a/config/step/my_finngen.yaml b/config/step/my_finngen.yaml deleted file mode 100644 index 93cb2b3ce..000000000 --- a/config/step/my_finngen.yaml +++ /dev/null @@ -1,10 +0,0 @@ -# Default config -defaults: - - finngen -# Additional config -finngen_phenotype_table_url: ${datasets.finngen_phenotype_table_url} -finngen_release_prefix: ${datasets.finngen_release_prefix} -finngen_sumstat_url_prefix: ${datasets.finngen_sumstat_url_prefix} -finngen_sumstat_url_suffix: ${datasets.finngen_sumstat_url_suffix} -finngen_study_index_out: ${datasets.finngen_study_index} -finngen_summary_stats_out: ${datasets.finngen_summary_stats} diff --git a/config/step/my_ld_index.yaml b/config/step/my_ld_index.yaml deleted file mode 100644 index 400451194..000000000 --- a/config/step/my_ld_index.yaml +++ /dev/null @@ -1,7 +0,0 @@ -# Default config -defaults: - - ld_index -# Additional config -grch37_to_grch38_chain_path: ${datasets.chain_hail_37_38} -ld_index_raw_template: ${datasets.ld_index_raw_template} -ld_index_out: ${datasets.ld_index} diff --git a/config/step/my_study_locus_overlap.yaml b/config/step/my_study_locus_overlap.yaml deleted file mode 100644 index d895174df..000000000 --- a/config/step/my_study_locus_overlap.yaml +++ /dev/null @@ -1,7 +0,0 @@ -# Default config -defaults: - - study_locus_overlap -# Additional config -study_locus_path: ${datasets.outputs}/catalog_study_locus -study_index_path: ${datasets.outputs}/catalog_study_index -overlaps_index_out: ${datasets.outputs}/study_locus_overlap diff --git a/config/step/my_variant_annotation.yaml b/config/step/my_variant_annotation.yaml deleted file mode 100644 index f57722aca..000000000 --- a/config/step/my_variant_annotation.yaml +++ /dev/null @@ -1,7 +0,0 @@ -# Default config -defaults: - - variant_annotation -# Additional config -gnomad_genomes: ${datasets.gnomad_gnomes} -chain_38_to_37: ${datasets.chain_hail_38_37} -variant_annotation_path: ${datasets.variant_annotation} diff --git a/config/step/my_variant_index.yaml b/config/step/my_variant_index.yaml deleted file mode 100644 index 625d00afa..000000000 --- a/config/step/my_variant_index.yaml +++ /dev/null @@ -1,7 +0,0 @@ -# Default config -defaults: - - variant_index -# Additional config -variant_annotation_path: ${datasets.variant_annotation} -study_locus_path: ${datasets.study_locus} -variant_index_path: ${datasets.variant_index} diff --git a/config/step/pics.yaml b/config/step/pics.yaml new file mode 100644 index 000000000..4a656a876 --- /dev/null +++ b/config/step/pics.yaml @@ -0,0 +1,3 @@ +_target_: otg.pics.PICSStep +study_locus_ld_annotated_in: ??? +picsed_study_locus_out: ??? diff --git a/config/session/dataproc.yaml b/config/step/session/dataproc.yaml similarity index 56% rename from config/session/dataproc.yaml rename to config/step/session/dataproc.yaml index 96b2ff07a..0c8b1208a 100644 --- a/config/session/dataproc.yaml +++ b/config/step/session/dataproc.yaml @@ -1,5 +1,4 @@ -defaults: - - session_config +_target_: otg.common.session.Session spark_uri: yarn -write_mode: overwrite hail_home: /opt/conda/miniconda3/lib/python3.10/site-packages/hail +write_mode: errorifexists diff --git a/config/step/session/local.yaml b/config/step/session/local.yaml new file mode 100644 index 000000000..ac7f42591 --- /dev/null +++ b/config/step/session/local.yaml @@ -0,0 +1,4 @@ +_target_: otg.common.session.Session +spark_uri: local[*] +hail_home: ??? +write_mode: errorifexists diff --git a/config/step/study_locus_overlap.yaml b/config/step/study_locus_overlap.yaml new file mode 100644 index 000000000..02f9cd83d --- /dev/null +++ b/config/step/study_locus_overlap.yaml @@ -0,0 +1,4 @@ +_target_: otg.overlaps.OverlapsIndexStep +study_locus_path: ${datasets.outputs}/credible_set +study_index_path: ${datasets.outputs}/study_index +overlaps_index_out: ${datasets.outputs}/study_locus_overlap diff --git a/config/step/my_ukbiobank.yaml b/config/step/ukbiobank.yaml similarity index 64% rename from config/step/my_ukbiobank.yaml rename to config/step/ukbiobank.yaml index 7e8af4723..fc7d7fb19 100644 --- a/config/step/my_ukbiobank.yaml +++ b/config/step/ukbiobank.yaml @@ -1,6 +1,3 @@ -# Default config -defaults: - - ukbiobank -# Additional config +_target_: otg.ukbiobank.UKBiobankStep ukbiobank_manifest: ${datasets.ukbiobank_manifest} ukbiobank_study_index_out: ${datasets.ukbiobank_study_index} diff --git a/config/step/my_v2g.yaml b/config/step/v2g.yaml similarity index 58% rename from config/step/my_v2g.yaml rename to config/step/v2g.yaml index 6e506c5a9..bdd003861 100644 --- a/config/step/my_v2g.yaml +++ b/config/step/v2g.yaml @@ -1,14 +1,12 @@ -# Default config -defaults: - - v2g -# Additional config +_target_: otg.v2g.V2GStep variant_index_path: ${datasets.variant_index} variant_annotation_path: ${datasets.variant_annotation} gene_index_path: ${datasets.gene_index} vep_consequences_path: ${datasets.vep_consequences} liftover_chain_file_path: ${datasets.chain_37_38} -anderson_path: ${datasets.anderson} -javierre_path: ${datasets.javierre} -jung_path: ${datasets.jung} -thurnman_path: ${datasets.thurnman} +intervals: + andersson: ${datasets.anderson} + javierre: ${datasets.javierre} + jung: ${datasets.jung} + thurman: ${datasets.thurman} v2g_path: ${datasets.v2g} diff --git a/config/step/variant_annotation.yaml b/config/step/variant_annotation.yaml new file mode 100644 index 000000000..1a8042ddb --- /dev/null +++ b/config/step/variant_annotation.yaml @@ -0,0 +1,6 @@ +_target_: otg.variant_annotation.VariantAnnotationStep + +session: + start_hail: true + +variant_annotation_path: ${datasets.variant_annotation} diff --git a/config/step/variant_index.yaml b/config/step/variant_index.yaml new file mode 100644 index 000000000..88f84690b --- /dev/null +++ b/config/step/variant_index.yaml @@ -0,0 +1,4 @@ +_target_: otg.variant_index.VariantIndexStep +variant_annotation_path: ${datasets.variant_annotation} +credible_set_path: ${datasets.study_locus} +variant_index_path: ${datasets.variant_index} diff --git a/docs/assets/genetics_portal_logo-1.png b/docs/assets/genetics_portal_logo-1.png deleted file mode 100644 index 999714271..000000000 Binary files a/docs/assets/genetics_portal_logo-1.png and /dev/null differ diff --git a/docs/assets/imgs/GWAS_Catalog_circle_178x178.png b/docs/assets/imgs/GWAS_Catalog_circle_178x178.png new file mode 100644 index 000000000..3cfa2a747 Binary files /dev/null and b/docs/assets/imgs/GWAS_Catalog_circle_178x178.png differ diff --git a/docs/assets/Open_Targets_Genetics_Portal_Logo_v2_font.svg b/docs/assets/imgs/Open_Targets_Genetics_Portal_Logo_v2_font.svg similarity index 100% rename from docs/assets/Open_Targets_Genetics_Portal_Logo_v2_font.svg rename to docs/assets/imgs/Open_Targets_Genetics_Portal_Logo_v2_font.svg diff --git a/docs/assets/imgs/UK_biobank_logo.png b/docs/assets/imgs/UK_biobank_logo.png new file mode 100644 index 000000000..7faa2f97b Binary files /dev/null and b/docs/assets/imgs/UK_biobank_logo.png differ diff --git a/docs/assets/favicon.png b/docs/assets/imgs/favicon.png similarity index 100% rename from docs/assets/favicon.png rename to docs/assets/imgs/favicon.png diff --git a/docs/assets/imgs/finngen.svg b/docs/assets/imgs/finngen.svg new file mode 100644 index 000000000..e5fcfb4f3 --- /dev/null +++ b/docs/assets/imgs/finngen.svg @@ -0,0 +1,27 @@ + + + Page 1 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/imgs/gnomad.svg b/docs/assets/imgs/gnomad.svg new file mode 100644 index 000000000..b066ef269 --- /dev/null +++ b/docs/assets/imgs/gnomad.svg @@ -0,0 +1,4 @@ + + + + diff --git a/docs/assets/imgs/open_targets_platform.svg b/docs/assets/imgs/open_targets_platform.svg new file mode 100644 index 000000000..8d17ee1d8 --- /dev/null +++ b/docs/assets/imgs/open_targets_platform.svg @@ -0,0 +1 @@ + diff --git a/docs/assets/otlogo.png b/docs/assets/imgs/otlogo.png similarity index 100% rename from docs/assets/otlogo.png rename to docs/assets/imgs/otlogo.png diff --git a/docs/assets/javascripts/extra.js b/docs/assets/javascripts/extra.js index dfc99ea08..808fdb8c1 100644 --- a/docs/assets/javascripts/extra.js +++ b/docs/assets/javascripts/extra.js @@ -1,4 +1,4 @@ -$('.contributors img[data-src]').each(function () { - src = $(this).attr("data-src"); - $(this).attr('src', src); +$(".contributors img[data-src]").each(function () { + src = $(this).attr("data-src"); + $(this).attr("src", src); }); diff --git a/docs/assets/overrides/partials/source-file.html b/docs/assets/overrides/partials/source-file.html index fdda516dc..a8d89b766 100644 --- a/docs/assets/overrides/partials/source-file.html +++ b/docs/assets/overrides/partials/source-file.html @@ -1,46 +1,50 @@
- -
diff --git a/docs/assets/stylesheets/extra.css b/docs/assets/stylesheets/extra.css index 1073b23b9..5712dc8ea 100644 --- a/docs/assets/stylesheets/extra.css +++ b/docs/assets/stylesheets/extra.css @@ -1,79 +1,75 @@ .metadata { - list-style: none; - padding: 0; - margin: 0; - margin-bottom: 15px; - color: #999; + list-style: none; + padding: 0; + margin: 0; + margin-bottom: 15px; + color: #999; } .metadata.page-metadata .contributors-text { - margin-right: 5px; - display: inline-block; + margin-right: 5px; + display: inline-block; } .metadata.page-metadata { - display: flex !important; - flex-direction: row; - align-items: center; - font-size: 1.2em; + display: flex !important; + flex-direction: row; + align-items: center; + font-size: 1.2em; } - .metadata.page-metadata li { - list-style: none; - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - margin-bottom: 0 !important; + list-style: none; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + margin-bottom: 0 !important; } - .metadata.page-metadata li .icon { - width: 1.1rem; - height: 1.1rem; - margin-right: 2px; + width: 1.1rem; + height: 1.1rem; + margin-right: 2px; } - .metadata.page-metadata li .icon svg { - fill: #999; + fill: #999; } - .page-metadata .contributors-holder { - margin: 0 !important; - margin-left: 1em; + margin: 0 !important; + margin-left: 1em; } .page-metadata .contributors { - margin-right: 5px; - display: inline-block; - list-style: none; - display: flex; - flex-direction: row; + margin-right: 5px; + display: inline-block; + list-style: none; + display: flex; + flex-direction: row; } .page-metadata .contributors li { - display: inline-flex; - margin: 0 !important; - padding: 0 !important; + display: inline-flex; + margin: 0 !important; + padding: 0 !important; } .page-metadata .contributors li img { - border-radius: 50%; - filter: grayscale(100%); - -webkit-filter: grayscale(100%); - opacity: 0.8; - vertical-align: middle; - width: 1.6rem; - transition: all 0.2s ease-in-out; + border-radius: 50%; + filter: grayscale(100%); + -webkit-filter: grayscale(100%); + opacity: 0.8; + vertical-align: middle; + width: 1.6rem; + transition: all 0.2s ease-in-out; } .page-metadata .contributors li img:hover { - opacity: 1; - filter: grayscale(0%); - -webkit-filter: grayscale(0%); - vertical-align: middle; - transform: scale(1.2); + opacity: 1; + filter: grayscale(0%); + -webkit-filter: grayscale(0%); + vertical-align: middle; + transform: scale(1.2); } diff --git a/docs/components/dataset/gene_index.md b/docs/components/dataset/gene_index.md deleted file mode 100644 index 1885f2dad..000000000 --- a/docs/components/dataset/gene_index.md +++ /dev/null @@ -1,7 +0,0 @@ -::: otg.dataset.gene_index.GeneIndex - -___ - -## Schema - ---8<-- "assets/schemas/targets.md" diff --git a/docs/components/dataset/study_index.md b/docs/components/dataset/study_index.md deleted file mode 100644 index 0318babb8..000000000 --- a/docs/components/dataset/study_index.md +++ /dev/null @@ -1,7 +0,0 @@ -::: otg.dataset.study_index.StudyIndex - -___ - -## Schema - ---8<-- "assets/schemas/studies.md" diff --git a/docs/components/datasource/finngen/_finngen.md b/docs/components/datasource/finngen/_finngen.md deleted file mode 100644 index e3017fbec..000000000 --- a/docs/components/datasource/finngen/_finngen.md +++ /dev/null @@ -1 +0,0 @@ -# FinnGen diff --git a/docs/components/datasource/gnomad/_gnomad.md b/docs/components/datasource/gnomad/_gnomad.md deleted file mode 100644 index dbfa3a229..000000000 --- a/docs/components/datasource/gnomad/_gnomad.md +++ /dev/null @@ -1 +0,0 @@ -# GnomAD diff --git a/docs/components/datasource/gwas_catalog/_gwas_catalog.md b/docs/components/datasource/gwas_catalog/_gwas_catalog.md deleted file mode 100644 index 00a668fbb..000000000 --- a/docs/components/datasource/gwas_catalog/_gwas_catalog.md +++ /dev/null @@ -1 +0,0 @@ -# GWAS Catalog diff --git a/docs/components/datasource/gwas_catalog/associations.md b/docs/components/datasource/gwas_catalog/associations.md deleted file mode 100644 index c49f34517..000000000 --- a/docs/components/datasource/gwas_catalog/associations.md +++ /dev/null @@ -1 +0,0 @@ -::: otg.datasource.gwas_catalog.associations.GWASCatalogAssociations diff --git a/docs/components/datasource/gwas_catalog/study_index.md b/docs/components/datasource/gwas_catalog/study_index.md deleted file mode 100644 index e42faa6a7..000000000 --- a/docs/components/datasource/gwas_catalog/study_index.md +++ /dev/null @@ -1 +0,0 @@ -::: otg.datasource.gwas_catalog.study_index.GWASCatalogStudyIndex diff --git a/docs/components/datasource/intervals/_intervals.md b/docs/components/datasource/intervals/_intervals.md deleted file mode 100644 index b41dee39d..000000000 --- a/docs/components/datasource/intervals/_intervals.md +++ /dev/null @@ -1 +0,0 @@ -# Chromatin intervals diff --git a/docs/components/datasource/intervals/thurnman.md b/docs/components/datasource/intervals/thurnman.md deleted file mode 100644 index bc8cab313..000000000 --- a/docs/components/datasource/intervals/thurnman.md +++ /dev/null @@ -1 +0,0 @@ -::: otg.datasource.intervals.thurnman.IntervalsThurnman diff --git a/docs/components/datasource/open_targets/_open_targets.md b/docs/components/datasource/open_targets/_open_targets.md deleted file mode 100644 index 916b22c92..000000000 --- a/docs/components/datasource/open_targets/_open_targets.md +++ /dev/null @@ -1 +0,0 @@ -# Open Targets Platform diff --git a/docs/components/datasource/ukbiobank/_ukbiobank.md b/docs/components/datasource/ukbiobank/_ukbiobank.md deleted file mode 100644 index 16c076b4a..000000000 --- a/docs/components/datasource/ukbiobank/_ukbiobank.md +++ /dev/null @@ -1 +0,0 @@ -# UK Biobank diff --git a/docs/components/datasource/ukbiobank/study_index.md b/docs/components/datasource/ukbiobank/study_index.md deleted file mode 100644 index 0cd24cf87..000000000 --- a/docs/components/datasource/ukbiobank/study_index.md +++ /dev/null @@ -1 +0,0 @@ -::: otg.datasource.ukbiobank.study_index.UKBiobankStudyIndex diff --git a/docs/components/method/_method.md b/docs/components/method/_method.md deleted file mode 100644 index eef793d4c..000000000 --- a/docs/components/method/_method.md +++ /dev/null @@ -1,2 +0,0 @@ - -Methods used accross the Open Targets Genetics Pipeline diff --git a/docs/components/step/colocalisation.md b/docs/components/step/colocalisation.md deleted file mode 100644 index e78403d2b..000000000 --- a/docs/components/step/colocalisation.md +++ /dev/null @@ -1,4 +0,0 @@ -# Colocalisation - -::: otg.colocalisation.ColocalisationStep -::: otg.config.ColocalisationStepConfig diff --git a/docs/components/step/finngen.md b/docs/components/step/finngen.md deleted file mode 100644 index a5391601f..000000000 --- a/docs/components/step/finngen.md +++ /dev/null @@ -1,4 +0,0 @@ -# FinnGen - -::: otg.finngen.FinnGenStep -::: otg.config.FinnGenStepConfig diff --git a/docs/components/step/gene_index.md b/docs/components/step/gene_index.md deleted file mode 100644 index 4a4c73e61..000000000 --- a/docs/components/step/gene_index.md +++ /dev/null @@ -1,4 +0,0 @@ -# Gene index - -::: otg.gene_index.GeneIndexStep -::: otg.config.GeneIndexStepConfig diff --git a/docs/components/step/gwas_catalog.md b/docs/components/step/gwas_catalog.md deleted file mode 100644 index c9cff9f11..000000000 --- a/docs/components/step/gwas_catalog.md +++ /dev/null @@ -1,4 +0,0 @@ -# GWAS Catalog - -::: otg.gwas_catalog.GWASCatalogStep -::: otg.config.GWASCatalogStepConfig diff --git a/docs/components/step/gwas_catalog_sumstat_preprocess.md b/docs/components/step/gwas_catalog_sumstat_preprocess.md deleted file mode 100644 index 413c812ec..000000000 --- a/docs/components/step/gwas_catalog_sumstat_preprocess.md +++ /dev/null @@ -1,4 +0,0 @@ -# GWAS Catalog sumstat preprocess - -::: otg.gwas_catalog_sumstat_preprocess.GWASCatalogSumstatsPreprocessStep -::: otg.config.GWASCatalogSumstatsPreprocessConfig diff --git a/docs/components/step/ld_index.md b/docs/components/step/ld_index.md deleted file mode 100644 index c6e4106d4..000000000 --- a/docs/components/step/ld_index.md +++ /dev/null @@ -1,4 +0,0 @@ -# LD index - -::: otg.ld_index.LDIndexStep -::: otg.config.LDIndexStepConfig diff --git a/docs/components/step/ukbiobank.md b/docs/components/step/ukbiobank.md deleted file mode 100644 index 4ffddf342..000000000 --- a/docs/components/step/ukbiobank.md +++ /dev/null @@ -1,4 +0,0 @@ -# UKBiobank - -::: otg.ukbiobank.UKBiobankStep -::: otg.config.UKBiobankStepConfig diff --git a/docs/components/step/variant_annotation_step.md b/docs/components/step/variant_annotation_step.md deleted file mode 100644 index 0a5aacc1e..000000000 --- a/docs/components/step/variant_annotation_step.md +++ /dev/null @@ -1,4 +0,0 @@ -# Variant annotation - -::: otg.variant_annotation.VariantAnnotationStep -::: otg.config.VariantAnnotationStepConfig diff --git a/docs/components/step/variant_index_step.md b/docs/components/step/variant_index_step.md deleted file mode 100644 index be34cc431..000000000 --- a/docs/components/step/variant_index_step.md +++ /dev/null @@ -1,4 +0,0 @@ -# Variant index - -::: otg.variant_index.VariantIndexStep -::: otg.config.VariantIndexStepConfig diff --git a/docs/components/step/variant_to_gene_step.md b/docs/components/step/variant_to_gene_step.md deleted file mode 100644 index 59724f9c4..000000000 --- a/docs/components/step/variant_to_gene_step.md +++ /dev/null @@ -1,4 +0,0 @@ -# V2G - -::: otg.v2g.V2GStep -::: otg.config.V2GStepConfig diff --git a/docs/contributing.md b/docs/contributing.md deleted file mode 100644 index 52c06078b..000000000 --- a/docs/contributing.md +++ /dev/null @@ -1,71 +0,0 @@ -# Environment configuration and contributing changes - -## One-time configuration -The steps in this section only ever need to be done once on any particular system. - -Google Cloud configuration: -1. Install Google Cloud SDK: https://cloud.google.com/sdk/docs/install. -1. Log in to your work Google Account: run `gcloud auth login` and follow instructions. -1. Obtain Google application credentials: run `gcloud auth application-default login` and follow instructions. - -Check that you have the `make` utility installed, and if not (which is unlikely), install it using your system package manager. - -Check that you have `java` installed. - -## Environment configuration -Run `make setup-dev` to install/update the necessary packages and activate the development environment. You need to do this every time you open a new shell. - -It is recommended to use VS Code as an IDE for development. - -## How to run the code -All pipelines in this repository are intended to be run in Google Dataproc. Running them locally is not currently supported. - -In order to run the code: - -1. Manually edit your local `workflow/dag.yaml` file and comment out the steps you do not want to run. - -2. Manually edit your local `pyproject.toml` file and modify the version of the code. - - This must be different from the version used by any other people working on the repository to avoid any deployment conflicts, so it's a good idea to use your name, for example: `1.2.3+jdoe`. - - You can also add a brief branch description, for example: `1.2.3+jdoe.myfeature`. - - Note that the version must comply with [PEP440 conventions](https://peps.python.org/pep-0440/#normalization), otherwise Poetry will not allow it to be deployed. - - Do not use underscores or hyphens in your version name. When building the WHL file, they will be automatically converted to dots, which means the file name will no longer match the version and the build will fail. Use dots instead. - -3. Run `make build`. - - This will create a bundle containing the neccessary code, configuration and dependencies to run the ETL pipeline, and then upload this bundle to Google Cloud. - - A version specific subpath is used, so uploading the code will not affect any branches but your own. - - If there was already a code bundle uploaded with the same version number, it will be replaced. - -4. Submit the Dataproc job with `poetry run python workflow/workflow_template.py` - - You will need to specify additional parameters, some are mandatory and some are optional. Run with `--help` to see usage. - - The script will provision the cluster and submit the job. - - The cluster will take a few minutes to get provisioned and running, during which the script will not output anything, this is normal. - - Once submitted, you can monitor the progress of your job on this page: https://console.cloud.google.com/dataproc/jobs?project=open-targets-genetics-dev. - - On completion (whether successful or a failure), the cluster will be automatically removed, so you don't have to worry about shutting it down to avoid incurring charges. - -## Contributing checklist -When making changes, and especially when implementing a new module or feature, it's essential to ensure that all relevant sections of the code base are modified. -- [ ] Run `make check`. This will run the linter and formatter to ensure that the code is compliant with the project conventions. -- [ ] Develop unit tests for your code and run `make test`. This will run all unit tests in the repository, including the examples appended in the docstrings of some methods. -- [ ] Update the configuration if necessary. -- [ ] Update the documentation and check it with `run build-documentation`. This will start a local server to browse it (URL will be printed, usually `http://127.0.0.1:8000/`) - -For more details on each of these steps, see the sections below. -### Documentation -* If during development you had a question which wasn't covered in the documentation, and someone explained it to you, add it to the documentation. The same applies if you encountered any instructions in the documentation which were obsolete or incorrect. -* Documentation autogeneration expressions start with `:::`. They will automatically generate sections of the documentation based on class and method docstrings. Be sure to update them for: - + Dataset definitions in `docs/reference/dataset` (example: `docs/reference/dataset/study_index/study_index_finngen.md`) - + Step definitions in `docs/reference/step` (example: `docs/reference/step/finngen.md`) - -### Configuration -* Input and output paths in `config/datasets/gcp.yaml` -* Step configuration in `config/step/my_STEP.yaml` (example: `config/step/my_finngen.yaml`) - -### Classes -* Step configuration class in `src/org/config.py` (example: `FinnGenStepConfig` class in that module) -* Dataset class in `src/org/dataset/` (example: `src/otg/dataset/study_index.py` → `StudyIndexFinnGen`) -* Step main running class in `src/org/STEP.py` (example: `src/org/finngen.py`) - -### Tests -* Test study fixture in `tests/conftest.py` (example: `mock_study_index_finngen` in that module) -* Test sample data in `tests/data_samples` (example: `tests/data_samples/finngen_studies_sample.json`) -* Test definition in `tests/` (example: `tests/dataset/test_study_index.py` → `test_study_index_finngen_creation`) diff --git a/docs/development/_development.md b/docs/development/_development.md new file mode 100644 index 000000000..be1e3426c --- /dev/null +++ b/docs/development/_development.md @@ -0,0 +1 @@ +This section contains various technical information on how to develop and run the code. diff --git a/docs/development/airflow.md b/docs/development/airflow.md new file mode 100644 index 000000000..9768bf961 --- /dev/null +++ b/docs/development/airflow.md @@ -0,0 +1,120 @@ +# Airflow configuration + +This section describes how to set up a local Airflow server which will orchestrate running workflows in Google Cloud Platform. This is useful for testing and debugging, but for production use, it is recommended to run Airflow on a dedicated server. + +## Install pre-requisites + +- [Docker](https://docs.docker.com/get-docker/) +- [Google Cloud SDK](https://cloud.google.com/sdk/docs/install) + +!!!warning macOS Docker memory allocation +On macOS, the default amount of memory available for Docker might not be enough to get Airflow up and running. Allocate at least 4GB of memory for the Docker Engine (ideally 8GB). [More info](https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#) + +## Configure Airflow access to Google Cloud Platform + +!!!warning Specifying Google Cloud parameters +Run the next two command with the appropriate Google Cloud project ID and service account name to ensure the correct Google default application credentials are set up. + +Authenticate to Google Cloud: + +```bash +gcloud auth application-default login --project= +``` + +Create the service account key file that will be used by Airflow to access Google Cloud Platform resources: + +```bash +gcloud iam service-accounts keys create ~/.config/gcloud/service_account_credentials.json --iam-account=@appspot.gserviceaccount.com +``` + +## Set up Airflow + +Change the working directory so that all subsequent commands will work: + +```bash +cd src/airflow +``` + +### Build Docker image + +!!!note Custom Docker image for Airflow +The custom Dockerfile built by the command below extends the official [Airflow Docker Compose YAML](https://airflow.apache.org/docs/apache-airflow/stable/docker-compose.yaml). We add support for Google Cloud SDK, Google Dataproc operators, and access to GCP credentials. + +```bash +docker build . --tag extending_airflow:latest +``` + +### Set Airflow user ID + +!!!note Setting Airflow user ID +These commands allow Airflow running inside Docker to access the credentials file which was generated earlier. + +```bash +# If any user ID is already specified in .env, remove it. +grep -v "AIRFLOW_UID" .env > .env.tmp +# Add the correct user ID. +echo "AIRFLOW_UID=$(id -u)" >> .env.tmp +# Move the file. +mv .env.tmp .env +``` + +### Initialise + +Before starting Airflow, initialise the database: + +```bash +docker compose up airflow-init +``` + +Now start all services: + +```bash +docker compose up -d +``` + +Airflow UI will now be available at `http://localhost:8080/`. Default username and password are both `airflow`. + +For additional information on how to use Airflow visit the [official documentation](https://airflow.apache.org/docs/apache-airflow/stable/index.html). + +### Cleaning up + +At any time, you can check the status of your containers with: + +```bash +docker ps +``` + +To stop Airflow, run: + +```bash +docker compose down +``` + +To cleanup the Airflow database, run: + +```bash +docker compose down --volumes --remove-orphans +``` + +### Advanced configuration + +More information on running Airflow with Docker Compose can be found in the [official docs](https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html). + +1. **Increase Airflow concurrency**. Modify the `docker-compose.yaml` and add the following to the x-airflow-common → environment section: + + ```yaml + AIRFLOW__CORE__PARALLELISM: 32 + AIRFLOW__CORE__MAX_ACTIVE_TASKS_PER_DAG: 32 + AIRFLOW__SCHEDULER__MAX_TIS_PER_QUERY: 16 + AIRFLOW__CORE__MAX_ACTIVE_RUNS_PER_DAG: 1 + # Also add the following line if you are using CeleryExecutor (by default, LocalExecutor is used). + AIRFLOW__CELERY__WORKER_CONCURRENCY: 32 + ``` + +1. **Additional pip packages**. They can be added to the `requirements.txt` file. + +## Troubleshooting + +Note that when you a a new workflow under `dags/`, Airflow will not pick that up immediately. By default the filesystem is only scanned for new DAGs every 300s. However, once the DAG is added, updates are applied nearly instantaneously. + +Also, if you edit the DAG while an instance of it is running, it might cause problems with the run, as Airflow will try to update the tasks and their properties in DAG according to the file changes. diff --git a/docs/development/contributing.md b/docs/development/contributing.md new file mode 100644 index 000000000..a2eaa6aae --- /dev/null +++ b/docs/development/contributing.md @@ -0,0 +1,86 @@ +--- +title: Contributing guidelines +--- + +# Contributing guidelines + +## One-time configuration + +The steps in this section only ever need to be done once on any particular system. + +Google Cloud configuration: + +1. Install Google Cloud SDK: https://cloud.google.com/sdk/docs/install. + +1. Log in to your work Google Account: run `gcloud auth login` and follow instructions. + +1. Obtain Google application credentials: run `gcloud auth application-default login` and follow instructions. + +Check that you have the `make` utility installed, and if not (which is unlikely), install it using your system package manager. + +Check that you have `java` installed. + +## Environment configuration + +Run `make setup-dev` to install/update the necessary packages and activate the development environment. You need to do this every time you open a new shell. + +It is recommended to use VS Code as an IDE for development. + +## How to run the code + +All pipelines in this repository are intended to be run in Google Dataproc. Running them locally is not currently supported. + +In order to run the code: + +1. Manually edit your local `src/airflow/dags/*` file and comment out the steps you do not want to run. + +2. Manually edit your local `pyproject.toml` file and modify the version of the code. + + - This must be different from the version used by any other people working on the repository to avoid any deployment conflicts, so it's a good idea to use your name, for example: `1.2.3+jdoe`. + - You can also add a brief branch description, for example: `1.2.3+jdoe.myfeature`. + - Note that the version must comply with [PEP440 conventions](https://peps.python.org/pep-0440/#normalization), otherwise Poetry will not allow it to be deployed. + - Do not use underscores or hyphens in your version name. When building the WHL file, they will be automatically converted to dots, which means the file name will no longer match the version and the build will fail. Use dots instead. + +3. Manually edit your local `src/airflow/dags/common_airflow.py` and set `OTG_VERSION` to the same version as you did in the previous step. + +4. Run `make build`. + + - This will create a bundle containing the neccessary code, configuration and dependencies to run the ETL pipeline, and then upload this bundle to Google Cloud. + - A version specific subpath is used, so uploading the code will not affect any branches but your own. + - If there was already a code bundle uploaded with the same version number, it will be replaced. + +5. Open Airflow UI and run the DAG. + +## Contributing checklist + +When making changes, and especially when implementing a new module or feature, it's essential to ensure that all relevant sections of the code base are modified. + +- [ ] Run `make check`. This will run the linter and formatter to ensure that the code is compliant with the project conventions. +- [ ] Develop unit tests for your code and run `make test`. This will run all unit tests in the repository, including the examples appended in the docstrings of some methods. +- [ ] Update the configuration if necessary. +- [ ] Update the documentation and check it with `make build-documentation`. This will start a local server to browse it (URL will be printed, usually `http://127.0.0.1:8000/`) + +For more details on each of these steps, see the sections below. + +### Documentation + +- If during development you had a question which wasn't covered in the documentation, and someone explained it to you, add it to the documentation. The same applies if you encountered any instructions in the documentation which were obsolete or incorrect. +- Documentation autogeneration expressions start with `:::`. They will automatically generate sections of the documentation based on class and method docstrings. Be sure to update them for: + - Dataset definitions in `docs/python_api/datasource/STEP` (example: `docs/python_api/datasource/finngen/study_index.md`) + - Step definition in `docs/python_api/step/STEP.md` (example: `docs/python_api/step/finngen.md`) + +### Configuration + +- Input and output paths in `config/datasets/gcp.yaml` +- Step configuration in `config/step/STEP.yaml` (example: `config/step/finngen.yaml`) + +### Classes + +- Dataset class in `src/otg/datasource/STEP` (example: `src/otg/datasource/finngen/study_index.py` → `FinnGenStudyIndex`) +- Step main running class in `src/otg/STEP.py` (example: `src/otg/finngen.py`) + +### Tests + +- Test study fixture in `tests/conftest.py` (example: `mock_study_index_finngen` in that module) +- Test sample data in `tests/data_samples` (example: `tests/data_samples/finngen_studies_sample.json`) +- Test definition in `tests/` (example: `tests/dataset/test_study_index.py` → `test_study_index_finngen_creation`) diff --git a/docs/troubleshooting.md b/docs/development/troubleshooting.md similarity index 98% rename from docs/troubleshooting.md rename to docs/development/troubleshooting.md index 9d1156765..b9f7385da 100644 --- a/docs/troubleshooting.md +++ b/docs/development/troubleshooting.md @@ -1,3 +1,7 @@ +--- +title: Troubleshooting +--- + # Troubleshooting ## BLAS/LAPACK diff --git a/docs/development/workflows.md b/docs/development/workflows.md new file mode 100644 index 000000000..2269041d8 --- /dev/null +++ b/docs/development/workflows.md @@ -0,0 +1,27 @@ +# Pipeline workflows + +This page describes the high level components of the pipeline, which are organised as Airflow DAGs (directed acyclic graphs). + +## Note on DAGs and Dataproc clusters + +Each DAG consists of the following general stages: + +1. Create cluster (if it already exists, this step is skipped) + +1. Install dependencies on the cluster + +1. Run data processing steps for this DAG + +1. Delete the cluster + +Within a DAG, all data processing steps run on the same Dataproc cluster as separate jobs. + +There is no need to configure DAGs or steps depending on the size of the input data. Clusters have autoscaling enabled, which means they will increase or decrease the number of worker VMs to accommodate the load. + +## DAG 1: Preprocess + +This DAG contains steps which are only supposed to be run once, or very rarely. They ingest external data and apply bespoke transformations specific for each particular data source. The output is normalised according to the data schemas used by the pipeline. + +## DAG 2: ETL + +The ETL DAG takes the inputs of the previous step and performs the main algorithmic processing. This processing is supposed to be data source agnostic. diff --git a/docs/index.md b/docs/index.md index 697cde46e..006477ec3 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,12 @@ +--- +title: Open Targets Genetics +hide: + - navigation + - toc +---

- +

+ +[FinnGen](https://www.finngen.fi/en) is a research project in genomics and personalized medicine, representing a large public-private partnership. The project has collected and analyzed genome and health data from 500,000 Finnish biobank donors to understand the genetic basis of diseases. FinnGen is now expanding its focus to comprehend the progression and biological mechanisms of diseases. This initiative provides a world-class resource for further breakthroughs in disease prevention, diagnosis, and treatment, offering insights into our genetic makeup. + +For a comprehensive understanding of the dataset and methods, refer to [Kurki et al., 2023](https://www.nature.com/articles/s41586-022-05473-8). diff --git a/docs/components/datasource/finngen/study_index.md b/docs/python_api/datasource/finngen/study_index.md similarity index 67% rename from docs/components/datasource/finngen/study_index.md rename to docs/python_api/datasource/finngen/study_index.md index 165148be3..cd298e07c 100644 --- a/docs/components/datasource/finngen/study_index.md +++ b/docs/python_api/datasource/finngen/study_index.md @@ -1 +1,5 @@ +--- +title: Study Index +--- + ::: otg.datasource.finngen.study_index.FinnGenStudyIndex diff --git a/docs/python_api/datasource/gnomad/_gnomad.md b/docs/python_api/datasource/gnomad/_gnomad.md new file mode 100644 index 000000000..aee2de8ad --- /dev/null +++ b/docs/python_api/datasource/gnomad/_gnomad.md @@ -0,0 +1,19 @@ +--- +title: GnomAD +--- + +

+ +

+ + +[GnomAD](https://gnomad.broadinstitute.org/) (Genome Aggregation Database) is a comprehensive resource that provides aggregated genomic data from large-scale sequencing projects. It encompasses variants from diverse populations and is widely used for variant annotation and population genetics studies. + +We use **GnomAD v4.0** as a source for variant annotation, offering detailed information about the prevalence and distribution of genetic variants across different populations. This version of GnomAD provides valuable insights into the genomic landscape, aiding in the interpretation of genetic variants and their potential functional implications. + +Additionally, [**GnomAD v2.1.1**](https://gnomad.broadinstitute.org/news/2018-10-gnomad-v2-1/) is utilized as a source for linkage disequilibrium (LD) information. diff --git a/docs/components/datasource/gnomad/gnomad_ld.md b/docs/python_api/datasource/gnomad/gnomad_ld.md similarity index 62% rename from docs/components/datasource/gnomad/gnomad_ld.md rename to docs/python_api/datasource/gnomad/gnomad_ld.md index 18304b5c8..a6a6a8050 100644 --- a/docs/components/datasource/gnomad/gnomad_ld.md +++ b/docs/python_api/datasource/gnomad/gnomad_ld.md @@ -1 +1,5 @@ +--- +title: LD Matrix +--- + ::: otg.datasource.gnomad.ld.GnomADLDMatrix diff --git a/docs/components/datasource/gnomad/gnomad_variants.md b/docs/python_api/datasource/gnomad/gnomad_variants.md similarity index 66% rename from docs/components/datasource/gnomad/gnomad_variants.md rename to docs/python_api/datasource/gnomad/gnomad_variants.md index a1ba603b4..ae1bbd6dc 100644 --- a/docs/components/datasource/gnomad/gnomad_variants.md +++ b/docs/python_api/datasource/gnomad/gnomad_variants.md @@ -1 +1,5 @@ +--- +title: Variants +--- + ::: otg.datasource.gnomad.variants.GnomADVariants diff --git a/docs/python_api/datasource/gwas_catalog/_gwas_catalog.md b/docs/python_api/datasource/gwas_catalog/_gwas_catalog.md new file mode 100644 index 000000000..4f05a4047 --- /dev/null +++ b/docs/python_api/datasource/gwas_catalog/_gwas_catalog.md @@ -0,0 +1,22 @@ +--- +title: GWAS Catalog +--- + +
+ +

GWAS Catalog

+
+ +The [GWAS Catalog](https://www.ebi.ac.uk/gwas/) is a comprehensive resource that aims to provide a curated collection of Genome-Wide Association Studies (GWAS) (including harmonized full GWAS summary statistics) across various traits and diseases in humans. + +It serves as a valuable repository of genetic associations identified in diverse populations, offering insights into the genetic basis of complex traits and diseases. + +We rely on the GWAS Catalog for a rich source of genetic associations, utilizing the data for analysis and interpretation. + +For detailed information on specific genetic associations, their significance, and associated studies, refer to the [GWAS Catalog](https://www.ebi.ac.uk/gwas/). + +Within our analyses, we leverage two different types of studies from the GWAS Catalog: + +1. **Studies with (full) GWAS summary stats** + +2. **Studies with top hits only - GWAS curated studies** diff --git a/docs/python_api/datasource/gwas_catalog/associations.md b/docs/python_api/datasource/gwas_catalog/associations.md new file mode 100644 index 000000000..3439e0779 --- /dev/null +++ b/docs/python_api/datasource/gwas_catalog/associations.md @@ -0,0 +1,9 @@ +--- +title: Associations +--- + +::: otg.datasource.gwas_catalog.associations.GWASCatalogCuratedAssociationsParser + +--- + +::: otg.datasource.gwas_catalog.associations.StudyLocusGWASCatalog diff --git a/docs/python_api/datasource/gwas_catalog/study_index.md b/docs/python_api/datasource/gwas_catalog/study_index.md new file mode 100644 index 000000000..b9ae0463c --- /dev/null +++ b/docs/python_api/datasource/gwas_catalog/study_index.md @@ -0,0 +1,9 @@ +--- +title: Study Index +--- + +::: otg.datasource.gwas_catalog.study_index.StudyIndexGWASCatalogParser + +--- + +::: otg.datasource.gwas_catalog.study_index.StudyIndexGWASCatalog diff --git a/docs/components/datasource/gwas_catalog/study_splitter.md b/docs/python_api/datasource/gwas_catalog/study_splitter.md similarity index 69% rename from docs/components/datasource/gwas_catalog/study_splitter.md rename to docs/python_api/datasource/gwas_catalog/study_splitter.md index ba8241851..4ad7e5627 100644 --- a/docs/components/datasource/gwas_catalog/study_splitter.md +++ b/docs/python_api/datasource/gwas_catalog/study_splitter.md @@ -1 +1,5 @@ +--- +title: Study Splitter +--- + ::: otg.datasource.gwas_catalog.study_splitter.GWASCatalogStudySplitter diff --git a/docs/components/datasource/gwas_catalog/summary_statistics.md b/docs/python_api/datasource/gwas_catalog/summary_statistics.md similarity index 69% rename from docs/components/datasource/gwas_catalog/summary_statistics.md rename to docs/python_api/datasource/gwas_catalog/summary_statistics.md index 3da1bd129..45294256a 100644 --- a/docs/components/datasource/gwas_catalog/summary_statistics.md +++ b/docs/python_api/datasource/gwas_catalog/summary_statistics.md @@ -1 +1,5 @@ +--- +title: Summary statistics +--- + :::otg.datasource.gwas_catalog.summary_statistics.GWASCatalogSummaryStatistics diff --git a/docs/python_api/datasource/intervals/_intervals.md b/docs/python_api/datasource/intervals/_intervals.md new file mode 100644 index 000000000..f5e91028b --- /dev/null +++ b/docs/python_api/datasource/intervals/_intervals.md @@ -0,0 +1,25 @@ +--- +title: Interaction and Interval-based Studies +--- + +# List of Interaction and Interval-based Studies + +In this section, we provide a list of studies that focus on interaction and interval-based investigations, shedding light on the intricate relationships between genetic elements and their functional implications. + +1. **Promoter Capture Hi-C (Javierre et al., 2016):** + _Title:_ "Lineage-Specific Genome Architecture Links Enhancers and Non-coding Disease Variants to Target Gene Promoters". + This study presents evidence linking genetic variation to genes through the application of Promoter Capture Hi-C across each of the 17 human primary hematopoietic cell types. The method captures interactions between promoters and distal regulatory elements, providing valuable insights into the three-dimensional chromatin architecture. DOI: 10.1016/j.cell.2016.09.037 + +2. **Enhancer-TSS Correlation (Andersson et al., 2014):** + _Title:_ "An Atlas of Active Enhancers across Human Cell Types and Tissues". + This study explores genetic variation's impact on genes by examining the correlation between the transcriptional activity of enhancers and transcription start sites. The findings are documented in the FANTOM5 CAGE expression atlas, offering a comprehensive view of the regulatory landscape. DOI: 10.1038/nature12787 + +3. **DHS-Promoter Correlation (Thurman et al., 2012):** + _Title:_ "The accessible chromatin landscape of the human genome". + Investigating genetic variation's connection to genes, this study employs the correlation of DNase I hypersensitive sites (DHS) and gene promoters. The analysis spans 125 cell and tissue types from the ENCODE project, providing a broad understanding of the regulatory interactions across diverse biological contexts. DOI: 10.1038/nature11232 + +4. **Promoter Capture Hi-C (Jung et al., 2019):** + _Title:_ "A compendium of promoter-centered long-range chromatin interactions in the human genome". + This study compiles a compendium of promoter-centered long-range chromatin interactions in the human genome. By focusing on the three-dimensional organization of chromatin, the research contributes to our understanding of the spatial arrangement of genetic elements and their implications in gene regulation. DOI: 10.1038/s41588-019-0494-8 + +For in-depth details on each study, you may refer to the respective publications. diff --git a/docs/components/datasource/intervals/andersson.md b/docs/python_api/datasource/intervals/andersson.md similarity index 63% rename from docs/components/datasource/intervals/andersson.md rename to docs/python_api/datasource/intervals/andersson.md index bc0637335..f9037613e 100644 --- a/docs/components/datasource/intervals/andersson.md +++ b/docs/python_api/datasource/intervals/andersson.md @@ -1 +1,5 @@ +--- +title: Andersson et al. +--- + ::: otg.datasource.intervals.andersson.IntervalsAndersson diff --git a/docs/components/datasource/intervals/javierre.md b/docs/python_api/datasource/intervals/javierre.md similarity index 63% rename from docs/components/datasource/intervals/javierre.md rename to docs/python_api/datasource/intervals/javierre.md index 8a9f0e650..3349465c8 100644 --- a/docs/components/datasource/intervals/javierre.md +++ b/docs/python_api/datasource/intervals/javierre.md @@ -1 +1,5 @@ +--- +title: Javierre et al. +--- + ::: otg.datasource.intervals.javierre.IntervalsJavierre diff --git a/docs/components/datasource/intervals/jung.md b/docs/python_api/datasource/intervals/jung.md similarity index 63% rename from docs/components/datasource/intervals/jung.md rename to docs/python_api/datasource/intervals/jung.md index 78eb8e1ba..7cb5adc8d 100644 --- a/docs/components/datasource/intervals/jung.md +++ b/docs/python_api/datasource/intervals/jung.md @@ -1 +1,5 @@ +--- +title: Jung et al. +--- + ::: otg.datasource.intervals.jung.IntervalsJung diff --git a/docs/python_api/datasource/intervals/thurman.md b/docs/python_api/datasource/intervals/thurman.md new file mode 100644 index 000000000..ff13e8ea3 --- /dev/null +++ b/docs/python_api/datasource/intervals/thurman.md @@ -0,0 +1,5 @@ +--- +title: Thurman et al. +--- + +::: otg.datasource.intervals.thurman.IntervalsThurman diff --git a/docs/python_api/datasource/open_targets/_open_targets.md b/docs/python_api/datasource/open_targets/_open_targets.md new file mode 100644 index 000000000..4138f6597 --- /dev/null +++ b/docs/python_api/datasource/open_targets/_open_targets.md @@ -0,0 +1,23 @@ +--- +title: Open Targets +--- + +

+ +

+ + +The Open Targets Platform is a comprehensive resource that aims to aggregate and harmonize various types of data to facilitate the identification, prioritization, and validation of drug targets. By integrating publicly available datasets, including data generated by the Open Targets consortium, the Platform builds and scores target-disease associations to assist in drug target identification and prioritization. It also integrates relevant annotation information about targets, diseases, phenotypes, and drugs, as well as their most relevant relationships. + +Within our analyses, we utilize Open Targets to infer two datasets: + +1. **The list of targets:** + This dataset provides a compilation of targets. In the Open Targets Platform, a target is understood as any naturally-occurring molecule that can be targeted by a medicinal product. The EMBL-EBI Ensembl database serves as the source for human targets in the Platform, with the Ensembl gene ID as the primary identifier. For more details, refer to [this link](https://platform-docs.opentargets.org/target). + +2. **The list of Gold Standard Positives:** + We use this dataset for training the Locus-to-Gene model. The current list contains 496 Gold Standard Positives. diff --git a/docs/python_api/datasource/open_targets/l2g_gold_standard.md b/docs/python_api/datasource/open_targets/l2g_gold_standard.md new file mode 100644 index 000000000..406b0f51c --- /dev/null +++ b/docs/python_api/datasource/open_targets/l2g_gold_standard.md @@ -0,0 +1,5 @@ +--- +title: L2G Gold Standard +--- + +::: otg.datasource.open_targets.l2g_gold_standard.OpenTargetsL2GGoldStandard diff --git a/docs/components/datasource/open_targets/target.md b/docs/python_api/datasource/open_targets/target.md similarity index 71% rename from docs/components/datasource/open_targets/target.md rename to docs/python_api/datasource/open_targets/target.md index b6dcc93a6..969618381 100644 --- a/docs/components/datasource/open_targets/target.md +++ b/docs/python_api/datasource/open_targets/target.md @@ -1 +1,5 @@ +--- +title: Target +--- + ::: otg.datasource.open_targets.target.OpenTargetsTarget diff --git a/docs/python_api/method/_method.md b/docs/python_api/method/_method.md new file mode 100644 index 000000000..94a1008c9 --- /dev/null +++ b/docs/python_api/method/_method.md @@ -0,0 +1,7 @@ +--- +title: Method +--- + +# Method + +TBC diff --git a/docs/components/method/clumping.md b/docs/python_api/method/clumping.md similarity index 92% rename from docs/components/method/clumping.md rename to docs/python_api/method/clumping.md index 18895c502..2975b010e 100644 --- a/docs/components/method/clumping.md +++ b/docs/python_api/method/clumping.md @@ -1,8 +1,11 @@ +--- +title: Clumping +--- + # Clumping Clumping is a commonly used post-processing method that allows for identification of independent association signals from GWAS summary statistics and curated associations. This process is critical because of the complex linkage disequilibrium (LD) structure in human populations, which can result in multiple statistically significant associations within the same genomic region. Clumping methods help reduce redundancy in GWAS results and ensure that each reported association represents an independent signal. We have implemented 2 clumping methods: -## Clumping based on Linkage Disequilibrium (LD) ::: otg.method.clump.LDclumping diff --git a/docs/components/method/coloc.md b/docs/python_api/method/coloc.md similarity index 63% rename from docs/components/method/coloc.md rename to docs/python_api/method/coloc.md index 4629c092b..56e9e0b7c 100644 --- a/docs/components/method/coloc.md +++ b/docs/python_api/method/coloc.md @@ -1,3 +1,5 @@ -# coloc +--- +title: Coloc +--- ::: otg.method.colocalisation.Coloc diff --git a/docs/components/method/ecaviar.md b/docs/python_api/method/ecaviar.md similarity index 62% rename from docs/components/method/ecaviar.md rename to docs/python_api/method/ecaviar.md index 3b6482dd1..de10b0d91 100644 --- a/docs/components/method/ecaviar.md +++ b/docs/python_api/method/ecaviar.md @@ -1,3 +1,5 @@ -# eCAVIAR +--- +title: eCAVIAR +--- :::otg.method.colocalisation.ECaviar diff --git a/docs/python_api/method/l2g/_l2g.md b/docs/python_api/method/l2g/_l2g.md new file mode 100644 index 000000000..d62ab9588 --- /dev/null +++ b/docs/python_api/method/l2g/_l2g.md @@ -0,0 +1,5 @@ +--- +title: Locus to Gene (L2G) classifier +--- + +TBC diff --git a/docs/python_api/method/l2g/evaluator.md b/docs/python_api/method/l2g/evaluator.md new file mode 100644 index 000000000..dfa4d128c --- /dev/null +++ b/docs/python_api/method/l2g/evaluator.md @@ -0,0 +1,5 @@ +--- +title: W&B evaluator +--- + +::: otg.method.l2g.evaluator.WandbEvaluator diff --git a/docs/python_api/method/l2g/feature_factory.md b/docs/python_api/method/l2g/feature_factory.md new file mode 100644 index 000000000..d0cf7014a --- /dev/null +++ b/docs/python_api/method/l2g/feature_factory.md @@ -0,0 +1,7 @@ +--- +title: L2G Feature Factory +--- + +::: otg.method.l2g.feature_factory.ColocalisationFactory + +::: otg.method.l2g.feature_factory.StudyLocusFactory diff --git a/docs/python_api/method/l2g/model.md b/docs/python_api/method/l2g/model.md new file mode 100644 index 000000000..7f4ef1023 --- /dev/null +++ b/docs/python_api/method/l2g/model.md @@ -0,0 +1,5 @@ +--- +title: L2G Model +--- + +::: otg.method.l2g.model.LocusToGeneModel diff --git a/docs/python_api/method/l2g/trainer.md b/docs/python_api/method/l2g/trainer.md new file mode 100644 index 000000000..8901e3e5f --- /dev/null +++ b/docs/python_api/method/l2g/trainer.md @@ -0,0 +1,5 @@ +--- +title: L2G Trainer +--- + +::: otg.method.l2g.trainer.LocusToGeneTrainer diff --git a/docs/components/method/ld_annotator.md b/docs/python_api/method/ld_annotator.md similarity index 52% rename from docs/components/method/ld_annotator.md rename to docs/python_api/method/ld_annotator.md index 831516a75..69ccd4463 100644 --- a/docs/components/method/ld_annotator.md +++ b/docs/python_api/method/ld_annotator.md @@ -1,3 +1,5 @@ -# LD annotator +--- +title: LDAnnotator +--- :::otg.method.ld.LDAnnotator diff --git a/docs/components/method/pics.md b/docs/python_api/method/pics.md similarity index 55% rename from docs/components/method/pics.md rename to docs/python_api/method/pics.md index 4e8051ad2..462c430be 100644 --- a/docs/components/method/pics.md +++ b/docs/python_api/method/pics.md @@ -1,3 +1,5 @@ -# PICS +--- +title: PICS +--- :::otg.method.pics.PICS diff --git a/docs/components/method/window_based_clumping.md b/docs/python_api/method/window_based_clumping.md similarity index 60% rename from docs/components/method/window_based_clumping.md rename to docs/python_api/method/window_based_clumping.md index 6c4329f8c..43c1e888d 100644 --- a/docs/components/method/window_based_clumping.md +++ b/docs/python_api/method/window_based_clumping.md @@ -1,3 +1,5 @@ -# Window-based clumping +--- +title: Window-based clumping +--- :::otg.method.window_based_clumping.WindowBasedClumping diff --git a/docs/python_api/step/_step.md b/docs/python_api/step/_step.md new file mode 100644 index 000000000..987f31b91 --- /dev/null +++ b/docs/python_api/step/_step.md @@ -0,0 +1,7 @@ +--- +title: Step +--- + +# Step + +TBC diff --git a/docs/python_api/step/clump.md b/docs/python_api/step/clump.md new file mode 100644 index 000000000..aae56ad9e --- /dev/null +++ b/docs/python_api/step/clump.md @@ -0,0 +1,5 @@ +--- +title: Clump +--- + +::: otg.clump.ClumpStep diff --git a/docs/python_api/step/colocalisation.md b/docs/python_api/step/colocalisation.md new file mode 100644 index 000000000..7a7012bb5 --- /dev/null +++ b/docs/python_api/step/colocalisation.md @@ -0,0 +1,5 @@ +--- +title: Colocalisation +--- + +::: otg.colocalisation.ColocalisationStep diff --git a/docs/python_api/step/eqtl_catalogue.md b/docs/python_api/step/eqtl_catalogue.md new file mode 100644 index 000000000..e152c8ac8 --- /dev/null +++ b/docs/python_api/step/eqtl_catalogue.md @@ -0,0 +1,5 @@ +--- +title: eQTL Catalogue +--- + +::: otg.eqtl_catalogue.EqtlCatalogueStep diff --git a/docs/python_api/step/finngen_studies.md b/docs/python_api/step/finngen_studies.md new file mode 100644 index 000000000..cfd7342e9 --- /dev/null +++ b/docs/python_api/step/finngen_studies.md @@ -0,0 +1,5 @@ +--- +title: FinnGen Studies +--- + +::: otg.finngen_studies.FinnGenStudiesStep diff --git a/docs/python_api/step/finngen_sumstat_preprocess.md b/docs/python_api/step/finngen_sumstat_preprocess.md new file mode 100644 index 000000000..0b374a278 --- /dev/null +++ b/docs/python_api/step/finngen_sumstat_preprocess.md @@ -0,0 +1,5 @@ +--- +title: FinnGen Preprocess Summary Stats +--- + +::: otg.finngen_sumstat_preprocess.FinnGenSumstatPreprocessStep diff --git a/docs/python_api/step/gene_index.md b/docs/python_api/step/gene_index.md new file mode 100644 index 000000000..dad07417c --- /dev/null +++ b/docs/python_api/step/gene_index.md @@ -0,0 +1,5 @@ +--- +title: Gene Index +--- + +::: otg.gene_index.GeneIndexStep diff --git a/docs/python_api/step/gwas_catalog_ingestion.md b/docs/python_api/step/gwas_catalog_ingestion.md new file mode 100644 index 000000000..ecac99f8c --- /dev/null +++ b/docs/python_api/step/gwas_catalog_ingestion.md @@ -0,0 +1,5 @@ +--- +title: GWAS Catalog +--- + +::: otg.gwas_catalog_ingestion.GWASCatalogIngestionStep diff --git a/docs/python_api/step/gwas_catalog_sumstat_preprocess.md b/docs/python_api/step/gwas_catalog_sumstat_preprocess.md new file mode 100644 index 000000000..1dd1d7c79 --- /dev/null +++ b/docs/python_api/step/gwas_catalog_sumstat_preprocess.md @@ -0,0 +1,5 @@ +--- +title: GWAS Catalog sumstat preprocess +--- + +::: otg.gwas_catalog_sumstat_preprocess.GWASCatalogSumstatsPreprocessStep diff --git a/docs/python_api/step/l2g.md b/docs/python_api/step/l2g.md new file mode 100644 index 000000000..2364c797a --- /dev/null +++ b/docs/python_api/step/l2g.md @@ -0,0 +1,5 @@ +--- +title: Locus-to-gene (L2G) +--- + +::: otg.l2g.LocusToGeneStep diff --git a/docs/python_api/step/ld_index.md b/docs/python_api/step/ld_index.md new file mode 100644 index 000000000..5f769422a --- /dev/null +++ b/docs/python_api/step/ld_index.md @@ -0,0 +1,5 @@ +--- +title: LD Index +--- + +::: otg.ld_index.LDIndexStep diff --git a/docs/python_api/step/pics.md b/docs/python_api/step/pics.md new file mode 100644 index 000000000..c4b7c4291 --- /dev/null +++ b/docs/python_api/step/pics.md @@ -0,0 +1,5 @@ +--- +title: PICS +--- + +::: otg.pics.PICSStep diff --git a/docs/python_api/step/ukbiobank.md b/docs/python_api/step/ukbiobank.md new file mode 100644 index 000000000..34724ea51 --- /dev/null +++ b/docs/python_api/step/ukbiobank.md @@ -0,0 +1,5 @@ +--- +title: UK Biobank +--- + +::: otg.ukbiobank.UKBiobankStep diff --git a/docs/python_api/step/variant_annotation_step.md b/docs/python_api/step/variant_annotation_step.md new file mode 100644 index 000000000..1b3eff6f8 --- /dev/null +++ b/docs/python_api/step/variant_annotation_step.md @@ -0,0 +1,5 @@ +--- +title: Variant Annotation +--- + +::: otg.variant_annotation.VariantAnnotationStep diff --git a/docs/python_api/step/variant_index_step.md b/docs/python_api/step/variant_index_step.md new file mode 100644 index 000000000..345f98401 --- /dev/null +++ b/docs/python_api/step/variant_index_step.md @@ -0,0 +1,5 @@ +--- +title: Variant Index +--- + +::: otg.variant_index.VariantIndexStep diff --git a/docs/python_api/step/variant_to_gene_step.md b/docs/python_api/step/variant_to_gene_step.md new file mode 100644 index 000000000..198ab01ec --- /dev/null +++ b/docs/python_api/step/variant_to_gene_step.md @@ -0,0 +1,5 @@ +--- +title: Variant-to-gene +--- + +::: otg.v2g.V2GStep diff --git a/docs/roadmap.md b/docs/roadmap.md index ff7e99be4..33ddf5eb2 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -1,3 +1,9 @@ +--- +title: Roadmap +hide: + - navigation + - toc +--- # Roadmap diff --git a/docs/usage.md b/docs/usage.md new file mode 100644 index 000000000..4d6c97d1b --- /dev/null +++ b/docs/usage.md @@ -0,0 +1,10 @@ +--- +Title: How-to +hide: + - navigation + - toc +--- + +# How-to + +TBC diff --git a/mkdocs.yml b/mkdocs.yml index 8e0d41f32..e15a1af8d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,14 +1,21 @@ -site_name: Genetics Portal Pipeline +site_name: Open Targets Genetics + +nav: + - installation.md + - usage.md + - ... | development/** + - ... | python_api/** plugins: - search - awesome-pages - mkdocstrings: handlers: - crystal: - selection: - filters: - - "!^_[^_]" + python: + options: + filters: ["!^_", "!__new__"] + show_signature_annotations: true + show_root_heading: true - section-index - git-revision-date-localized: type: timeago @@ -16,8 +23,6 @@ plugins: exclude: - index.md - autolinks - - minify: - minify_html: true - exclude: glob: - assets/schemas/* @@ -32,26 +37,31 @@ markdown_extensions: - pymdownx.superfences - pymdownx.snippets: base_path: "docs" + - pymdownx.highlight + - pymdownx.superfences + - toc: + permalink: true hooks: - - src/scripts/schemadocs.py + - src/utils/schemadocs.py repo_name: opentargets/genetics_etl_python repo_url: https://github.com/opentargets/genetics_etl_python theme: name: "material" - favicon: assets/favicon.png - logo: assets/otlogo.png + favicon: assets/imgs/favicon.png + logo: assets/imgs/otlogo.png custom_dir: docs/assets/overrides features: - navigation.instant - navigation.top + - navigation.tabs + - navigation.tabs.sticky - content.code.annotate - search.suggest - search.highlight - palette: # Light mode - media: "(prefers-color-scheme: light)" diff --git a/notebooks/Finngen_PICS_run.ipynb b/notebooks/Finngen_PICS_run.ipynb new file mode 100644 index 000000000..3dc6ec0d7 --- /dev/null +++ b/notebooks/Finngen_PICS_run.ipynb @@ -0,0 +1,1572 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2dd3bf11", + "metadata": {}, + "source": [ + "# Running PICS finemapping on Finngen summary statistics\n", + "\n", + "1. Read summary stats.\n", + "2. Apply window based clumping.\n", + "3. LD expansion.\n", + "4. lD clumping.\n", + "5. PICS." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "0deeb686", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-13T09:53:43.429135Z", + "start_time": "2023-10-13T09:53:23.566141Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " Loading BokehJS ...\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "(function(root) {\n", + " function now() {\n", + " return new Date();\n", + " }\n", + "\n", + " const force = true;\n", + "\n", + " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n", + " root._bokeh_onload_callbacks = [];\n", + " root._bokeh_is_loading = undefined;\n", + " }\n", + "\n", + "const JS_MIME_TYPE = 'application/javascript';\n", + " const HTML_MIME_TYPE = 'text/html';\n", + " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", + " const CLASS_NAME = 'output_bokeh rendered_html';\n", + "\n", + " /**\n", + " * Render data to the DOM node\n", + " */\n", + " function render(props, node) {\n", + " const script = document.createElement(\"script\");\n", + " node.appendChild(script);\n", + " }\n", + "\n", + " /**\n", + " * Handle when an output is cleared or removed\n", + " */\n", + " function handleClearOutput(event, handle) {\n", + " const cell = handle.cell;\n", + "\n", + " const id = cell.output_area._bokeh_element_id;\n", + " const server_id = cell.output_area._bokeh_server_id;\n", + " // Clean up Bokeh references\n", + " if (id != null && id in Bokeh.index) {\n", + " Bokeh.index[id].model.document.clear();\n", + " delete Bokeh.index[id];\n", + " }\n", + "\n", + " if (server_id !== undefined) {\n", + " // Clean up Bokeh references\n", + " const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", + " cell.notebook.kernel.execute(cmd_clean, {\n", + " iopub: {\n", + " output: function(msg) {\n", + " const id = msg.content.text.trim();\n", + " if (id in Bokeh.index) {\n", + " Bokeh.index[id].model.document.clear();\n", + " delete Bokeh.index[id];\n", + " }\n", + " }\n", + " }\n", + " });\n", + " // Destroy server and session\n", + " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", + " cell.notebook.kernel.execute(cmd_destroy);\n", + " }\n", + " }\n", + "\n", + " /**\n", + " * Handle when a new output is added\n", + " */\n", + " function handleAddOutput(event, handle) {\n", + " const output_area = handle.output_area;\n", + " const output = handle.output;\n", + "\n", + " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", + " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n", + " return\n", + " }\n", + "\n", + " const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", + "\n", + " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", + " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", + " // store reference to embed id on output_area\n", + " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", + " }\n", + " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", + " const bk_div = document.createElement(\"div\");\n", + " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", + " const script_attrs = bk_div.children[0].attributes;\n", + " for (let i = 0; i < script_attrs.length; i++) {\n", + " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", + " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n", + " }\n", + " // store reference to server id on output_area\n", + " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", + " }\n", + " }\n", + "\n", + " function register_renderer(events, OutputArea) {\n", + "\n", + " function append_mime(data, metadata, element) {\n", + " // create a DOM node to render to\n", + " const toinsert = this.create_output_subarea(\n", + " metadata,\n", + " CLASS_NAME,\n", + " EXEC_MIME_TYPE\n", + " );\n", + " this.keyboard_manager.register_events(toinsert);\n", + " // Render to node\n", + " const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", + " render(props, toinsert[toinsert.length - 1]);\n", + " element.append(toinsert);\n", + " return toinsert\n", + " }\n", + "\n", + " /* Handle when an output is cleared or removed */\n", + " events.on('clear_output.CodeCell', handleClearOutput);\n", + " events.on('delete.Cell', handleClearOutput);\n", + "\n", + " /* Handle when a new output is added */\n", + " events.on('output_added.OutputArea', handleAddOutput);\n", + "\n", + " /**\n", + " * Register the mime type and append_mime function with output_area\n", + " */\n", + " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", + " /* Is output safe? */\n", + " safe: true,\n", + " /* Index of renderer in `output_area.display_order` */\n", + " index: 0\n", + " });\n", + " }\n", + "\n", + " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", + " if (root.Jupyter !== undefined) {\n", + " const events = require('base/js/events');\n", + " const OutputArea = require('notebook/js/outputarea').OutputArea;\n", + "\n", + " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", + " register_renderer(events, OutputArea);\n", + " }\n", + " }\n", + " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", + " root._bokeh_timeout = Date.now() + 5000;\n", + " root._bokeh_failed_load = false;\n", + " }\n", + "\n", + " const NB_LOAD_WARNING = {'data': {'text/html':\n", + " \"
\\n\"+\n", + " \"

\\n\"+\n", + " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", + " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", + " \"

\\n\"+\n", + " \"
    \\n\"+\n", + " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", + " \"
  • use INLINE resources instead, as so:
  • \\n\"+\n", + " \"
\\n\"+\n", + " \"\\n\"+\n", + " \"from bokeh.resources import INLINE\\n\"+\n", + " \"output_notebook(resources=INLINE)\\n\"+\n", + " \"\\n\"+\n", + " \"
\"}};\n", + "\n", + " function display_loaded() {\n", + " const el = document.getElementById(\"cb01f13c-6396-4b85-99db-68f8056c07dd\");\n", + " if (el != null) {\n", + " el.textContent = \"BokehJS is loading...\";\n", + " }\n", + " if (root.Bokeh !== undefined) {\n", + " if (el != null) {\n", + " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n", + " }\n", + " } else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(display_loaded, 100)\n", + " }\n", + " }\n", + "\n", + " function run_callbacks() {\n", + " try {\n", + " root._bokeh_onload_callbacks.forEach(function(callback) {\n", + " if (callback != null)\n", + " callback();\n", + " });\n", + " } finally {\n", + " delete root._bokeh_onload_callbacks\n", + " }\n", + " console.debug(\"Bokeh: all callbacks have finished\");\n", + " }\n", + "\n", + " function load_libs(css_urls, js_urls, callback) {\n", + " if (css_urls == null) css_urls = [];\n", + " if (js_urls == null) js_urls = [];\n", + "\n", + " root._bokeh_onload_callbacks.push(callback);\n", + " if (root._bokeh_is_loading > 0) {\n", + " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", + " return null;\n", + " }\n", + " if (js_urls == null || js_urls.length === 0) {\n", + " run_callbacks();\n", + " return null;\n", + " }\n", + " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", + " root._bokeh_is_loading = css_urls.length + js_urls.length;\n", + "\n", + " function on_load() {\n", + " root._bokeh_is_loading--;\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", + " run_callbacks()\n", + " }\n", + " }\n", + "\n", + " function on_error(url) {\n", + " console.error(\"failed to load \" + url);\n", + " }\n", + "\n", + " for (let i = 0; i < css_urls.length; i++) {\n", + " const url = css_urls[i];\n", + " const element = document.createElement(\"link\");\n", + " element.onload = on_load;\n", + " element.onerror = on_error.bind(null, url);\n", + " element.rel = \"stylesheet\";\n", + " element.type = \"text/css\";\n", + " element.href = url;\n", + " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", + " document.body.appendChild(element);\n", + " }\n", + "\n", + " for (let i = 0; i < js_urls.length; i++) {\n", + " const url = js_urls[i];\n", + " const element = document.createElement('script');\n", + " element.onload = on_load;\n", + " element.onerror = on_error.bind(null, url);\n", + " element.async = false;\n", + " element.src = url;\n", + " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " document.head.appendChild(element);\n", + " }\n", + " };\n", + "\n", + " function inject_raw_css(css) {\n", + " const element = document.createElement(\"style\");\n", + " element.appendChild(document.createTextNode(css));\n", + " document.body.appendChild(element);\n", + " }\n", + "\n", + " const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.2.2.min.js\"];\n", + " const css_urls = [];\n", + "\n", + " const inline_js = [ function(Bokeh) {\n", + " Bokeh.set_log_level(\"info\");\n", + " },\n", + "function(Bokeh) {\n", + " }\n", + " ];\n", + "\n", + " function run_inline_js() {\n", + " if (root.Bokeh !== undefined || force === true) {\n", + " for (let i = 0; i < inline_js.length; i++) {\n", + " inline_js[i].call(root, root.Bokeh);\n", + " }\n", + "if (force === true) {\n", + " display_loaded();\n", + " }} else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(run_inline_js, 100);\n", + " } else if (!root._bokeh_failed_load) {\n", + " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", + " root._bokeh_failed_load = true;\n", + " } else if (force !== true) {\n", + " const cell = $(document.getElementById(\"cb01f13c-6396-4b85-99db-68f8056c07dd\")).parents('.cell').data().cell;\n", + " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", + " }\n", + " }\n", + "\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", + " run_inline_js();\n", + " } else {\n", + " load_libs(css_urls, js_urls, function() {\n", + " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", + " run_inline_js();\n", + " });\n", + " }\n", + "}(window));" + ], + "application/vnd.bokehjs_load.v0+json": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n const el = document.getElementById(\"cb01f13c-6396-4b85-99db-68f8056c07dd\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.2.2.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\nif (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"cb01f13c-6396-4b85-99db-68f8056c07dd\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", + "23/10/13 09:53:40 INFO SparkEnv: Registering MapOutputTracker\n", + "23/10/13 09:53:40 INFO SparkEnv: Registering BlockManagerMaster\n", + "23/10/13 09:53:40 INFO SparkEnv: Registering BlockManagerMasterHeartbeat\n", + "23/10/13 09:53:40 INFO SparkEnv: Registering OutputCommitCoordinator\n", + "23/10/13 09:53:42 WARN GhfsStorageStatistics: Detected potential high latency for operation op_get_file_status. latencyMs=198; previousMaxLatencyMs=0; operationCount=1; context=gs://dataproc-temp-europe-west1-426265110888-ymkbpaze/64dcfdf8-46d3-4b5c-aad4-0a12ee0ba91a/spark-job-history\n", + "23/10/13 09:53:42 WARN GhfsStorageStatistics: Detected potential high latency for operation op_mkdirs. latencyMs=166; previousMaxLatencyMs=0; operationCount=1; context=gs://dataproc-temp-europe-west1-426265110888-ymkbpaze/64dcfdf8-46d3-4b5c-aad4-0a12ee0ba91a/spark-job-history\n" + ] + } + ], + "source": [ + "# Import:\n", + "from pyspark.sql import functions as f, types as t\n", + "\n", + "from otg.common.session import Session\n", + "\n", + "from otg.dataset.summary_statistics import SummaryStatistics\n", + "from otg.dataset.study_locus import StudyLocus\n", + "from otg.dataset.study_index import StudyIndex\n", + "from otg.dataset.ld_index import LDIndex\n", + "from otg.method.ld import LDAnnotator\n", + "\n", + "from otg.method.pics import PICS\n", + "\n", + "# Initialize session:\n", + "session = Session()\n", + "\n", + "# Input:\n", + "sumstats = 'gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/*'\n", + "ld_index_path = 'gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/ld_index/'\n", + "\n", + "# Parameters:\n", + "clump_window_length = 500_000 # Distance between semi-indices.\n", + "locus_window_length = 250_000 # Distance around semi-indices from where the tags are collected.\n", + "\n", + "# Output:\n", + "window_based_clumped_output = 'gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus'\n", + "ld_clumped_output = 'gs://ot-team/dsuveges/finngen/2023.10.13_ld_clumped_w_locus'\n", + "picsed_output = 'gs://ot-team/dsuveges/finngen/2023.10.06_PICSed'\n" + ] + }, + { + "cell_type": "markdown", + "id": "3bdbcfbf", + "metadata": {}, + "source": [ + "## 1. Read summary statistics" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "c893433c", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T08:46:39.186806Z", + "start_time": "2023-10-06T08:46:04.601886Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/10/06 08:46:37 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=236; previousMaxLatencyMs=147; operationCount=276; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_AB1_ACTINOMYCOSIS/chromosome=1/part-00011-33e31f88-435f-4200-9adc-3e909d706910.c000.snappy.parquet\n", + "23/10/06 08:46:37 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=269; previousMaxLatencyMs=236; operationCount=282; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_HEIGHT_IRN/chromosome=2/part-00020-774f0990-ad3d-46ae-9648-f39c18fae314.c000.snappy.parquet\n", + "23/10/06 08:46:38 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=417; previousMaxLatencyMs=269; operationCount=288; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_HEIGHT_IRN/chromosome=2/part-00020-774f0990-ad3d-46ae-9648-f39c18fae314.c000.snappy.parquet\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+-----------+--------+--------------+--------------+-----------+-------------+-------------------------------+---------------------------+---------------------------+----------+\n", + "| studyId| variantId|position|pValueMantissa|pValueExponent| beta|standardError|effectAlleleFrequencyFromSource|betaConfidenceIntervalLower|betaConfidenceIntervalUpper|chromosome|\n", + "+--------------------+-----------+--------+--------------+--------------+-----------+-------------+-------------------------------+---------------------------+---------------------------+----------+\n", + "|FINNGEN_R9_HEIGHT...|2_10603_A_C| 10603| 8.515| -1| 0.0117813| 0.0629271| 2.30629E-4| -0.0511458| 0.0747084| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_10610_G_A| 10610| 8.814| -3| 0.0187529| 0.00715985| 0.0194828| 0.01159305| 0.02591275| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_10659_G_A| 10659| 9.292| -1|-0.00289323| 0.0325443| 8.5694E-4| -0.03543752999999...| 0.029651069999999998| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_10756_T_C| 10756| 2.368| -1| -0.180083| 0.15223| 5.62468E-5| -0.33231299999999997| -0.02785299999999999| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_10797_C_T| 10797| 8.506| -1|-0.00190634| 0.01012| 0.00847354| -0.01202634| 0.008213660000000001| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_10823_G_C| 10823| 6.834| -2| -0.259102| 0.142146| 1.48813E-4| -0.401248| -0.116956| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_10847_C_T| 10847| 5.97| -1| 0.0487634| 0.0922252| 1.03478E-4| -0.04346179999999...| 0.1409886| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11305_G_C| 11305| 6.992| -1|-0.00333638| 0.00863326| 0.013513| -0.01196964| 0.00529688| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11311_C_G| 11311| 1.676| -1| 0.112938| 0.0818501| 1.30145E-4| 0.0310879| 0.1947881| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11320_G_A| 11320| 2.484| -7| -0.0106449| 0.0020634| 0.302909| -0.0127083| -0.0085815| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11486_A_G| 11486| 6.829| -3| 0.0135765| 0.00501887| 0.035261| 0.00855763| 0.01859537| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11573_A_C| 11573| 7.428| -1| 0.00483333| 0.0147283| 0.00424829| -0.00989497| 0.01956163| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11594_G_T| 11594| 5.291| -1|-0.00908649| 0.014438| 0.0045864| -0.02352449| 0.00535151| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11607_T_C| 11607| 5.666| -3| 0.0139369| 0.00503765| 0.0350636| 0.008899250000000001| 0.01897455| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11609_T_G| 11609| 8.231| -2| -0.065766| 0.0378528| 7.11595E-4| -0.10361880000000001| -0.02791320000000...| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11620_G_C| 11620| 5.866| -1| -0.0235368| 0.0432809| 5.48483E-4| -0.0668177| 0.019744099999999997| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11677_C_G| 11677| 3.944| -1| -0.0888112| 0.104287| 1.01977E-4| -0.1930982| 0.015475799999999998| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11694_C_T| 11694| 8.855| -2| -0.0468924| 0.0275339| 0.00127759| -0.0744263| -0.0193585| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11696_C_T| 11696| 2.446| -1| -0.0384871| 0.0330789| 8.17298E-4| -0.071566| -0.00540820000000...| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11834_A_G| 11834| 5.664| -3| 0.0139372| 0.00503766| 0.0350634| 0.008899540000000001| 0.01897486| 2|\n", + "+--------------------+-----------+--------+--------------+--------------+-----------+-------------+-------------------------------+---------------------------+---------------------------+----------+\n", + "only showing top 20 rows\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "finngen_sumstats = SummaryStatistics(\n", + " _df=(\n", + " session.spark.read.parquet(sumstats, recursiveFileLookup=True)\n", + " # We need to add chromosome column as this is a partition column:\n", + " .withColumn('chromosome',f.split(f.col('variantId'), '_')[0])\n", + " ),\n", + " _schema=SummaryStatistics.get_schema()\n", + ")\n", + "finngen_sumstats.df.show()\n", + "print(finngen_sumstats.df.count())" + ] + }, + { + "cell_type": "markdown", + "id": "a76b27ce", + "metadata": {}, + "source": [ + "## 2. Apply window based clumping.\n", + "\n", + "- Clumping distance: +/-500kbp\n", + "- Locus collected: +/-250kbp" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "fc0dd4f0", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T10:22:38.264681Z", + "start_time": "2023-10-06T10:10:29.768171Z" + }, + "scrolled": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/10/06 10:22:32 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=1812; previousMaxLatencyMs=253; operationCount=415; context=gs://ot-team/dsuveges/finngen/2023.10.06_window_clumped/_temporary/0/_temporary/attempt_202310061022254599137247441201519_0051_m_000011_106753/part-00011-53e48f6d-d432-40c5-9201-d4c8f03e6dee-c000.snappy.parquet\n", + " \r" + ] + } + ], + "source": [ + "# This process takes ~1h on a 32 cores:\n", + "(\n", + " SummaryStatistics(\n", + " _df=(\n", + " session.spark.read.parquet(sumstats, recursiveFileLookup=True)\n", + " .withColumn(\n", + " 'chromosome',\n", + " f.split(f.col('variantId'), '_')[0]\n", + " )\n", + " ),\n", + " _schema=SummaryStatistics.get_schema()\n", + " )\n", + " .window_based_clumping(\n", + " distance=clump_window_length,\n", + " locus_collect_distance=locus_window_length,\n", + " with_locus=True\n", + " )\n", + " .df.write.mode('overwrite')\n", + " .parquet(window_based_clumped_output)\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a1cd0172", + "metadata": {}, + "source": [ + "## 3. LD expansion\n", + "\n", + "- For FINNGEN, study table needs to be mocked." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "1305f6c3", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T08:13:10.050554Z", + "start_time": "2023-10-06T08:13:05.901762Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 5:===============================================> (15 + 3) / 18]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+---------------------+---------+---------+---------------+\n", + "| studyId|ldPopulationStructure|projectId|studyType|traitFromSource|\n", + "+--------------------+---------------------+---------+---------+---------------+\n", + "|FINNGEN_R9_K11_EN...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_P16_IN...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "| FINNGEN_R9_C_STROKE| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_G6_HER...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_RHEUMA...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_N14_EN...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "| FINNGEN_R9_PAIN| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_D3_COA...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_F5_UNSORG| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_HEIGHT...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_M13_SY...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_APPEND...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_ALLERG...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_M13_FI...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_E4_DM2...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_AUTOIM...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_CD2_BE...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_F5_DIS...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_E4_DMN...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_E4_FH_IHD| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "+--------------------+---------------------+---------+---------+---------------+\n", + "only showing top 20 rows\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "# Generating a \"fake\" study index, just for providing ld_population structure for each finngen study:\n", + "studies_df = (\n", + " session.spark.read.parquet('gs://ot-team/dsuveges/finngen_semi_indices_250kbp')\n", + " # Generating a list of study identifiers:\n", + " .select('studyId')\n", + " .distinct()\n", + " # Adding fabricated values required to parse as gwas catalog study:\n", + " .select(\n", + " 'studyId',\n", + " StudyIndex.aggregate_and_map_ancestries(\n", + " f.array(\n", + " f.struct(\n", + " f.lit('Finnish').alias('ancestry'),\n", + " f.lit(100).cast('long').alias('sampleSize')\n", + " )\n", + " )\n", + " ).alias('ldPopulationStructure'),\n", + " f.lit('FINNGEN').alias('projectId'),\n", + " f.lit('gwas').alias('studyType'),\n", + " f.lit('cicaful').alias('traitFromSource')\n", + " )\n", + ")\n", + "\n", + "study_index = (\n", + " StudyIndex(\n", + " _df=studies_df,\n", + " _schema=StudyIndex.get_schema()\n", + " )\n", + ")\n", + "\n", + "study_index.df.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "cb2d5030", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T09:09:22.063715Z", + "start_time": "2023-10-06T09:09:21.359206Z" + } + }, + "outputs": [], + "source": [ + "# Loading ld index:\n", + "ld_index = LDIndex.from_parquet(session, ld_index_path)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "3d13ae41", + "metadata": {}, + "source": [ + "## 4. LD based clumping.\n", + "\n", + "- Persist resulting dataset.\n", + "- Save dataset." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "20449e76", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T09:42:11.040193Z", + "start_time": "2023-10-06T09:09:52.968139Z" + }, + "scrolled": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/10/06 09:11:42 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=1312; previousMaxLatencyMs=1306; operationCount=59583672; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_RX_N05C/chromosome=1/part-00012-a13aba14-79f4-45c0-9af0-937d599fa3f0.c000.snappy.parquet\n", + "23/10/06 09:11:43 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=1316; previousMaxLatencyMs=1312; operationCount=59631953; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_RX_CODEINE_TRAMADOL/chromosome=1/part-00012-36e099c5-3f60-4091-bf73-6fa15d48af6c.c000.snappy.parquet\n", + "23/10/06 09:16:19 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=1489; previousMaxLatencyMs=1316; operationCount=76331604; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/ld_index/chromosome=7/part-00010-ff42773a-494c-46d2-bc22-322062b5e715.c000.snappy.parquet\n", + "23/10/06 09:16:21 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=1735; previousMaxLatencyMs=1489; operationCount=76482674; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/ld_index/chromosome=7/part-00010-ff42773a-494c-46d2-bc22-322062b5e715.c000.snappy.parquet\n", + "23/10/06 09:16:23 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_operations. latencyMs=460; previousMaxLatencyMs=337; operationCount=17471; context=gs://dataproc-temp-europe-west1-426265110888-ymkbpaze/64dcfdf8-46d3-4b5c-aad4-0a12ee0ba91a/spark-job-history/local-1696579691428.inprogress\n", + "23/10/06 09:27:35 WARN GhfsStorageStatistics: Detected potential high latency for operation op_open. latencyMs=1041; previousMaxLatencyMs=1034; operationCount=215062; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_M13_DORSOPATHYNAS/chromosome=19/part-00009-09e75b10-c64d-4b79-9c84-6b0ca039c439.c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=126; previousMaxLatencyMs=93; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552056325521918358154_0027_m_000008_57347/part-00008-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=134; previousMaxLatencyMs=126; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555844252084106444775_0027_m_000028_57367/part-00028-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=134; previousMaxLatencyMs=126; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556216099889261123757_0027_m_000015_57354/part-00015-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=137; previousMaxLatencyMs=134; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909553770650668910223592_0027_m_000020_57359/part-00020-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=134; previousMaxLatencyMs=126; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552371970894888794726_0027_m_000025_57364/part-00025-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=136; previousMaxLatencyMs=134; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955320032532820679068_0027_m_000009_57348/part-00009-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=139; previousMaxLatencyMs=136; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554704118087127617221_0027_m_000031_57370/part-00031-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=139; previousMaxLatencyMs=136; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955146935648450954616_0027_m_000021_57360/part-00021-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=140; previousMaxLatencyMs=139; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557457999139377546046_0027_m_000026_57365/part-00026-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=141; previousMaxLatencyMs=140; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557648490159907156305_0027_m_000017_57356/part-00017-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=144; previousMaxLatencyMs=141; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556136722862237844168_0027_m_000013_57352/part-00013-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=143; previousMaxLatencyMs=141; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955993438161489409499_0027_m_000016_57355/part-00016-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=144; previousMaxLatencyMs=141; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552708616931813844767_0027_m_000006_57345/part-00006-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=145; previousMaxLatencyMs=144; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555919710644676214353_0027_m_000004_57343/part-00004-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=145; previousMaxLatencyMs=144; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551292246187607294419_0027_m_000002_57341/part-00002-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=146; previousMaxLatencyMs=145; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551853556311935071964_0027_m_000030_57369/part-00030-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=147; previousMaxLatencyMs=146; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555640079838863826112_0027_m_000022_57361/part-00022-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=147; previousMaxLatencyMs=146; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955962380753726438814_0027_m_000000_57339/part-00000-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=149; previousMaxLatencyMs=147; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551603246466691698658_0027_m_000001_57340/part-00001-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=150; previousMaxLatencyMs=149; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554079176040000118228_0027_m_000027_57366/part-00027-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=154; previousMaxLatencyMs=150; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909553545408253172771512_0027_m_000005_57344/part-00005-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=156; previousMaxLatencyMs=154; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556087040172921209608_0027_m_000018_57357/part-00018-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=160; previousMaxLatencyMs=156; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955995307818437095879_0027_m_000024_57363/part-00024-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=161; previousMaxLatencyMs=160; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552743075067405201713_0027_m_000014_57353/part-00014-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=106; previousMaxLatencyMs=95; operationCount=30; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551603246466691698658_0027_m_000001_57340/part-00001-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=138; previousMaxLatencyMs=106; operationCount=31; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552371970894888794726_0027_m_000025_57364/part-00025-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=165; previousMaxLatencyMs=0; operationCount=30; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955320032532820679068_0027_m_000009_57348/part-00009-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00009-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=183; previousMaxLatencyMs=165; operationCount=30; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955962380753726438814_0027_m_000000_57339/part-00000-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00000-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=186; previousMaxLatencyMs=183; operationCount=30; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552708616931813844767_0027_m_000006_57345/part-00006-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00006-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=191; previousMaxLatencyMs=186; operationCount=30; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555919710644676214353_0027_m_000004_57343/part-00004-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00004-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=227; previousMaxLatencyMs=186; operationCount=30; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554079176040000118228_0027_m_000027_57366/part-00027-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00027-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=233; previousMaxLatencyMs=227; operationCount=30; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556216099889261123757_0027_m_000015_57354/part-00015-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00015-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=239; previousMaxLatencyMs=233; operationCount=31; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554704118087127617221_0027_m_000031_57370/part-00031-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00031-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=284; previousMaxLatencyMs=239; operationCount=31; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551853556311935071964_0027_m_000030_57369/part-00030-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00030-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=128; previousMaxLatencyMs=0; operationCount=28; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555919710644676214353_0027_m_000004_57343\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=318; previousMaxLatencyMs=284; operationCount=31; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955146935648450954616_0027_m_000021_57360/part-00021-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00021-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=150; previousMaxLatencyMs=128; operationCount=29; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555920613268130744433_0027_m_000010_57349\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=190; previousMaxLatencyMs=150; operationCount=29; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955320032532820679068_0027_m_000009_57348\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=226; previousMaxLatencyMs=190; operationCount=30; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554079176040000118228_0027_m_000027_57366\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=172; previousMaxLatencyMs=161; operationCount=53; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557479860471944928338_0027_m_000035_57374/part-00035-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=146; previousMaxLatencyMs=138; operationCount=53; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557479860471944928338_0027_m_000035_57374/part-00035-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:58 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=150; previousMaxLatencyMs=146; operationCount=60; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551578112291921242039_0027_m_000054_57393/part-00054-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:58 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=1259; previousMaxLatencyMs=226; operationCount=53; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551853556311935071964_0027_m_000030_57369\n", + "23/10/06 09:41:58 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=1497; previousMaxLatencyMs=1259; operationCount=56; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557355876953011052025_0027_m_000019_57358\n", + "23/10/06 09:41:58 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=711; previousMaxLatencyMs=318; operationCount=75; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557693125728422191174_0027_m_000050_57389/part-00050-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00050-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:59 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=157; previousMaxLatencyMs=150; operationCount=93; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551476648569527086024_0027_m_000080_57419/part-00080-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:59 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=752; previousMaxLatencyMs=711; operationCount=91; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554631887941475021153_0027_m_000057_57396/part-00057-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00057-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:59 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=182; previousMaxLatencyMs=157; operationCount=96; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556932256815778386100_0027_m_000093_57432/part-00093-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:42:00 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=201; previousMaxLatencyMs=182; operationCount=128; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554714655772639032866_0027_m_000122_57461/part-00122-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:42:01 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=253; previousMaxLatencyMs=201; operationCount=187; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555299227751328654817_0027_m_000175_57513/part-00175-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:42:02 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=1159; previousMaxLatencyMs=752; operationCount=198; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556191692784728530413_0027_m_000172_57510/part-00172-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00172-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:42:02 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=1051; previousMaxLatencyMs=172; operationCount=200; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955452778920582844510_0027_m_000198_57536/part-00198-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:42:08 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=11057; previousMaxLatencyMs=1497; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557457999139377546046_0027_m_000026_57365\n", + "23/10/06 09:42:08 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=11233; previousMaxLatencyMs=11057; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551292246187607294419_0027_m_000002_57341\n", + "23/10/06 09:42:08 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=11402; previousMaxLatencyMs=11233; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552371970894888794726_0027_m_000025_57364\n", + "23/10/06 09:42:08 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=11583; previousMaxLatencyMs=11402; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556136722862237844168_0027_m_000013_57352\n", + "23/10/06 09:42:09 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=12651; previousMaxLatencyMs=11583; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909553722108484298157195_0027_m_000023_57362\n", + "23/10/06 09:42:10 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=13120; previousMaxLatencyMs=12651; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554704118087127617221_0027_m_000031_57370\n", + "23/10/06 09:42:10 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=13440; previousMaxLatencyMs=13120; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909553545408253172771512_0027_m_000005_57344\n", + " \r" + ] + } + ], + "source": [ + "(\n", + " # To annotate study/locus, study level info and ld panel is needed:\n", + " LDAnnotator.ld_annotate(\n", + " StudyLocus.from_parquet(session, window_based_clumped_output),\n", + " study_index, \n", + " ld_index\n", + " )\n", + " # Clumping linked study-loci together:\n", + " .clump()\n", + " .df.write.mode('overwrite').parquet(ld_clumped_output)\n", + ")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "3ec08141", + "metadata": {}, + "source": [ + "## 5. PICS - finemapping." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "aab9d72e", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T09:50:46.179833Z", + "start_time": "2023-10-06T09:49:25.408253Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/10/06 09:50:16 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=1081; previousMaxLatencyMs=1051; operationCount=396; context=gs://ot-team/dsuveges/finngen/2023.10.06_PICSed/_temporary/0/_temporary/attempt_202310060949259143728196112407547_0033_m_000193_57732/part-00193-9d4ae5b4-a18c-4406-bd26-9387e62477de-c000.snappy.parquet\n", + " \r" + ] + } + ], + "source": [ + "(\n", + " # The previously generated LD clumped dataset is read as StudyLocus:\n", + " PICS.finemap(StudyLocus.from_parquet(session, ld_clumped_output))\n", + " .annotate_credible_sets()\n", + " .df.write.mode('overwrite').parquet(picsed_output)\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "0bc2cb6e", + "metadata": {}, + "source": [ + "## QC results - Sumstats" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "7cbeab8b", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T10:40:53.295506Z", + "start_time": "2023-10-06T10:26:04.284592Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/10/06 10:26:41 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_operations. latencyMs=572; previousMaxLatencyMs=460; operationCount=925353; context=gs://dataproc-temp-europe-west1-426265110888-ymkbpaze/64dcfdf8-46d3-4b5c-aad4-0a12ee0ba91a/spark-job-history/local-1696579691428.inprogress\n", + "[Stage 57:===========================================> (3 + 1) / 4]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "In the Finngen dataset, there are 45,820,490,260 associations from 2,272 studies.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "assoc_count = finngen_sumstats.df.count()\n", + "study_count = finngen_sumstats.df.select('studyId').distinct().count()\n", + "\n", + "print(f'In the Finngen dataset, there are {assoc_count:,} associations from {study_count:,} studies.')" + ] + }, + { + "cell_type": "markdown", + "id": "19f94399", + "metadata": {}, + "source": [ + "## QC results - Window based clumping" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "5ff794d4", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T10:41:39.724996Z", + "start_time": "2023-10-06T10:41:38.322389Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "In the window based cluped dataset, there are 19,005 semi-indices, from 1,387 studies.\n" + ] + } + ], + "source": [ + "windowed_count = session.spark.read.parquet(window_based_clumped_output).count()\n", + "windowed_studies = session.spark.read.parquet(window_based_clumped_output).select('studyId').distinct().count()\n", + "\n", + "print(f'In the window based cluped dataset, there are {windowed_count:,} semi-indices, from {windowed_studies:,} studies.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "d88b0d87", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T10:08:22.129308Z", + "start_time": "2023-10-06T10:08:18.802493Z" + } + }, + "source": [ + "## QC results - LD clumping" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "3cd88471", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T10:43:29.370733Z", + "start_time": "2023-10-06T10:43:26.646342Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 87:======================================================> (28 + 1) / 29]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "In the LD based cluped dataset, there are 19,005 semi-indices, from 1,387 studies.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "ld_clumped_df = session.spark.read.parquet(ld_clumped_output)\n", + "\n", + "windowed_count = ld_clumped_df.count()\n", + "windowed_studies = ld_clumped_df.select('studyId').distinct().count()\n", + "\n", + "print(f'In the LD based cluped dataset, there are {windowed_count:,} semi-indices, from {windowed_studies:,} studies.')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "d9d002d0", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T10:44:36.008520Z", + "start_time": "2023-10-06T10:44:34.483964Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 93:====================================================> (27 + 2) / 29]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------------------------------------------------+-----+\n", + "|qualityControls |count|\n", + "+--------------------------------------------------------------+-----+\n", + "|[Variant not found in LD reference] |4706 |\n", + "|[] |13714|\n", + "|[Explained by a more significant variant in high LD (clumped)]|585 |\n", + "+--------------------------------------------------------------+-----+\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "ld_clumped_df.groupBy('qualityControls').count().show(truncate=False)" + ] + }, + { + "cell_type": "markdown", + "id": "7a3be915", + "metadata": {}, + "source": [ + "## QC results - PICS" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "b1ddd53c", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T10:59:16.339543Z", + "start_time": "2023-10-06T10:59:15.930105Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0-----------------------------------------------\n", + " variantId | 20_35437976_G_A \n", + " chromosome | 20 \n", + " studyId | FINNGEN_R9_HEIGHT... \n", + " position | 35437976 \n", + " pValueMantissa | 3.811 \n", + " pValueExponent | -193 \n", + " beta | -0.0551669 \n", + " standardError | 0.00186085 \n", + " effectAlleleFrequencyFromSource | 0.5599 \n", + " betaConfidenceIntervalLower | -0.05702774999999... \n", + " betaConfidenceIntervalUpper | -0.05330605 \n", + " studyLocusId | 5242723067793949472 \n", + " qualityControls | [Variant not foun... \n", + " ldSet | null \n", + " locus | null \n", + "only showing top 1 row\n", + "\n", + "root\n", + " |-- variantId: string (nullable = true)\n", + " |-- chromosome: string (nullable = true)\n", + " |-- studyId: string (nullable = true)\n", + " |-- position: integer (nullable = true)\n", + " |-- pValueMantissa: float (nullable = true)\n", + " |-- pValueExponent: integer (nullable = true)\n", + " |-- beta: double (nullable = true)\n", + " |-- standardError: double (nullable = true)\n", + " |-- effectAlleleFrequencyFromSource: float (nullable = true)\n", + " |-- betaConfidenceIntervalLower: double (nullable = true)\n", + " |-- betaConfidenceIntervalUpper: double (nullable = true)\n", + " |-- studyLocusId: long (nullable = true)\n", + " |-- qualityControls: array (nullable = true)\n", + " | |-- element: string (containsNull = true)\n", + " |-- ldSet: array (nullable = true)\n", + " | |-- element: struct (containsNull = true)\n", + " | | |-- tagVariantId: string (nullable = true)\n", + " | | |-- r2Overall: double (nullable = true)\n", + " |-- locus: array (nullable = true)\n", + " | |-- element: struct (containsNull = true)\n", + " | | |-- variantId: string (nullable = true)\n", + " | | |-- r2Overall: double (nullable = true)\n", + " | | |-- posteriorProbability: double (nullable = true)\n", + " | | |-- standardError: double (nullable = true)\n", + " | | |-- is95CredibleSet: boolean (nullable = true)\n", + " | | |-- is99CredibleSet: boolean (nullable = true)\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/10/06 10:59:16 WARN CacheManager: Asked to cache already cached data.\n" + ] + }, + { + "data": { + "text/plain": [ + "19005" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "picsed_df = session.spark.read.parquet(picsed_output).persist()\n", + "picsed_df.show(1, vertical=True)\n", + "picsed_df.printSchema()\n", + "picsed_df.count()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "937e1eb0", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T11:11:55.487431Z", + "start_time": "2023-10-06T11:11:54.898030Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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zZs317Rp02Sz2RQdHa1du3bp7bffNts8cOBApa6gTJkyRS+//LIef/xxSdLbb7+tdevWafr06frjH/9Y6XE7f/683n//fd1+++2SpBEjRuj111+XJNWvX18+Pj4qLS1VSEhIpdusiloViAAAqMsWLFigp59+Wrfeeqs8PDx0zz33KCkpSTt27JAkDRgwwKyNiYlRbGysIiIitGLFCvXr10+GYVzT98XGxpr//vrrr3Xu3DkzIF1UVlamu+++W9KPDytu3769y13WF8PTRZW5m7u4uFhHjx5Vx44dXfZ37NhRX3755TWdg6+vrxmGJCk0NFSFhYXX1IY7EIgAAHCT22+/XRs2bNDp06dVXFys0NBQDRgwQJGRkZetDw0NVUREhDkzdPEOsn//+98Vgsrl+Pn5mf++cOGCJGnFihW69dZbXersdrskVSpwRUVFae/evT9bJ1390Ti33HJLhe88f/58hTa8vLwqtHmtwdAdavxJ1QAA3Gz8/PwUGhqqoqIirVq16rLrcSTpxIkTOnz4sPl4mYSEBAUGBmry5MmXrb/as4Jat24tu92ub7/9Vi1atHDZLj42pnXr1hVu8b/0c1JSkvbv369PP/20wncYhiGn06kGDRooLCzMZW2UJG3atEmtWrWSJDVp0kSSzAXS0o+Lqq+Vt7e3y/tJbxQCEQAAbrJq1SplZmYqLy9PWVlZ6tKli6Kjo/XUU0+ppKREqamp2rx5sw4ePKj169froYceUmBgoB555BFJPwapP/3pT1qxYoUSExO1Zs0aHTx4UNu3b9e4ceM0fPjwK363v7+/UlNT9dJLL2n+/Pn65ptvtHPnTv3xj380n300fPhwffPNNxozZoz27dunxYsXa968eS7t9O/fXwMGDNATTzyh9PR0bd++XYcOHdJnn32m7t27a926dZKkX/3qV3r77bf18ccfa9++fXrllVeUm5ur0aNHS5IZxNLS0rR//36tWLFC77zzzjWP6W233aavvvpK+/bt0/fff3/ZWSZ3IBABAOAmTqdTL774ou644w4NGjRI9913n1avXi0vLy95eHho165d6tu3r6KiojR48GBFRUVp8+bNLndP9+3bV5s2bZKXl5eSkpJ0xx136IknnpDT6dTEiROv+v1vvPGG/u///k/p6elq1aqVevbsqb///e/mJbtmzZrpk08+0d///ne1bdtW77//viZNmuTShs1m0+LFizV16lQtW7ZMnTp10l133aW0tDT17dtXPXv2lCSNGjVKY8eO1dixY9WmTRtlZmZq+fLl5gJyLy8vLVmyRP/+97/Vtm1bvf322z/b/8sZNmyYoqOjFRsbqyZNmuhf//rXNbdRGTajJi7U1UHFxcVyOBzmVKFbuevpq1V4qioA1Cbnzp1TXl6eIiMjr/paJ+CnrvZ7U9m/38wQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQBqHW6AxrVwx+8LgQgAUGtcfI3DmTNnargnqEsu/r5c+hqQa8G7zAAAtYaHh4caNmxovtzT19f3Z180CusyDENnzpxRYWGhGjZsKA8Pjyq3RSACANQqISEhklQjbzxH3dSwYUPz96aqCEQAgFrFZrMpNDRUQUFBN+y9Vbh5XHwtyvUiEAEAaiUPDw+3/KEDKoNF1QAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPJqNBDNnDlTd911lxo0aKAGDRooPj5e//jHP8zjQ4YMkc1mc9nat2/v0kZpaalGjhypwMBA+fn5KTExUUeOHHGpKSoqUnJyshwOhxwOh5KTk3Xy5MnqOEUAAFAH1Gggatq0qd566y1t375d27dvV9euXdW3b1/t2bPHrOnVq5fy8/PNbeXKlS5tpKSkaNmyZcrIyNDGjRtVUlKiPn36qLy83KxJSkpSbm6uMjMzlZmZqdzcXCUnJ1fbeQIAgNrNsya//KGHHnL5/Oabb2rmzJnKzs7WnXfeKUmy2+0KCQm57M87nU7NmTNHCxYsUPfu3SVJCxcuVHh4uNasWaOePXtq7969yszMVHZ2tuLi4iRJs2fPVnx8vPbt26fo6OgbeIYAAKAuqDVriMrLy5WRkaHTp08rPj7e3L9+/XoFBQUpKipKw4YNU2FhoXksJydH58+fV0JCgrkvLCxMMTEx2rRpkyRp8+bNcjgcZhiSpPbt28vhcJg1AADA2mp0hkiSdu3apfj4eJ07d07169fXsmXL1Lp1a0lS79699dhjjykiIkJ5eXl67bXX1LVrV+Xk5Mhut6ugoEDe3t5q1KiRS5vBwcEqKCiQJBUUFCgoKKjC9wYFBZk1l1NaWqrS0lLzc3FxsTtOFwAA1EI1Hoiio6OVm5urkydP6pNPPtHgwYO1YcMGtW7dWgMGDDDrYmJiFBsbq4iICK1YsUL9+vW7YpuGYchms5mff/rvK9VcKj09Xb/97W+reFYAAKAuqfFLZt7e3mrRooViY2OVnp6utm3b6t13371sbWhoqCIiInTgwAFJUkhIiMrKylRUVORSV1hYqODgYLPm2LFjFdo6fvy4WXM548ePl9PpNLfDhw9X9RQBAEAtV+OB6FKGYbhcqvqpEydO6PDhwwoNDZUktWvXTl5eXsrKyjJr8vPztXv3bnXo0EGSFB8fL6fTqa1bt5o1W7ZskdPpNGsux263m48DuLgBAICbU41eMpswYYJ69+6t8PBwnTp1ShkZGVq/fr0yMzNVUlKitLQ0PfroowoNDdXBgwc1YcIEBQYG6pFHHpEkORwODR06VGPHjlXjxo0VEBCg1NRUtWnTxrzrrFWrVurVq5eGDRumWbNmSZKeffZZ9enThzvMAACApBoORMeOHVNycrLy8/PlcDh01113KTMzUz169NDZs2e1a9cuffTRRzp58qRCQ0PVpUsXffzxx/L39zfbmDZtmjw9PdW/f3+dPXtW3bp107x58+Th4WHWLFq0SKNGjTLvRktMTNSMGTOq/XwBAEDtZDMMw6jpTtQFxcXFcjgccjqd7r98ti7dPe10Ge+edgAAuElU9u93rVtDBAAAUN0IRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPIIRAAAwPJqNBDNnDlTd911lxo0aKAGDRooPj5e//jHP8zjhmEoLS1NYWFh8vHxUefOnbVnzx6XNkpLSzVy5EgFBgbKz89PiYmJOnLkiEtNUVGRkpOT5XA45HA4lJycrJMnT1bHKQIAgDqgRgNR06ZN9dZbb2n79u3avn27unbtqr59+5qhZ/LkyZo6dapmzJihbdu2KSQkRD169NCpU6fMNlJSUrRs2TJlZGRo48aNKikpUZ8+fVReXm7WJCUlKTc3V5mZmcrMzFRubq6Sk5Or/XwBAEDtZDMMw6jpTvxUQECAfve73+npp59WWFiYUlJS9PLLL0v6cTYoODhYb7/9tp577jk5nU41adJECxYs0IABAyRJR48eVXh4uFauXKmePXtq7969at26tbKzsxUXFydJys7OVnx8vP79738rOjq6Uv0qLi6Ww+GQ0+lUgwYN3HrOm+ekuqWd+KFT3NIOAAA3i8r+/a41a4jKy8uVkZGh06dPKz4+Xnl5eSooKFBCQoJZY7fb1alTJ23atEmSlJOTo/Pnz7vUhIWFKSYmxqzZvHmzHA6HGYYkqX379nI4HGbN5ZSWlqq4uNhlAwAAN6caD0S7du1S/fr1ZbfbNXz4cC1btkytW7dWQUGBJCk4ONilPjg42DxWUFAgb29vNWrU6Ko1QUFBFb43KCjIrLmc9PR0c82Rw+FQeHj4dZ0nAACovWo8EEVHRys3N1fZ2dl6/vnnNXjwYH399dfmcZvN5lJvGEaFfZe6tOZy9T/Xzvjx4+V0Os3t8OHDlT0lAABQx9R4IPL29laLFi0UGxur9PR0tW3bVu+++65CQkIkqcIsTmFhoTlrFBISorKyMhUVFV215tixYxW+9/jx4xVmn37Kbrebd79d3AAAwM2pxgPRpQzDUGlpqSIjIxUSEqKsrCzzWFlZmTZs2KAOHTpIktq1aycvLy+Xmvz8fO3evdusiY+Pl9Pp1NatW82aLVu2yOl0mjUAAMDaPGvyyydMmKDevXsrPDxcp06dUkZGhtavX6/MzEzZbDalpKRo0qRJatmypVq2bKlJkybJ19dXSUlJkiSHw6GhQ4dq7Nixaty4sQICApSamqo2bdqoe/fukqRWrVqpV69eGjZsmGbNmiVJevbZZ9WnT59K32EGAABubjUaiI4dO6bk5GTl5+fL4XDorrvuUmZmpnr06CFJGjdunM6ePasXXnhBRUVFiouL0+rVq+Xv72+2MW3aNHl6eqp///46e/asunXrpnnz5snDw8OsWbRokUaNGmXejZaYmKgZM2ZU78kCAIBaq9Y9h6i24jlEAADUPXXuOUQAAAA1hUAEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsj0AEAAAsr0qBKC8vz939AAAAqDFVCkQtWrRQly5dtHDhQp07d87dfQIAAKhWVQpEX375pe6++26NHTtWISEheu6557R161Z39w0AAKBaVCkQxcTEaOrUqfruu+80d+5cFRQU6L777tOdd96pqVOn6vjx45VqJz09Xffee6/8/f0VFBSkhx9+WPv27XOpGTJkiGw2m8vWvn17l5rS0lKNHDlSgYGB8vPzU2Jioo4cOeJSU1RUpOTkZDkcDjkcDiUnJ+vkyZNVOX0AAHCTua5F1Z6ennrkkUf05z//WW+//ba++eYbpaamqmnTpho0aJDy8/Ov+vMbNmzQiy++qOzsbGVlZemHH35QQkKCTp8+7VLXq1cv5efnm9vKlStdjqekpGjZsmXKyMjQxo0bVVJSoj59+qi8vNysSUpKUm5urjIzM5WZmanc3FwlJydfz+kDAICbhOf1/PD27dv14YcfKiMjQ35+fkpNTdXQoUN19OhR/d///Z/69u171UtpmZmZLp/nzp2roKAg5eTk6P777zf32+12hYSEXLYNp9OpOXPmaMGCBerevbskaeHChQoPD9eaNWvUs2dP7d27V5mZmcrOzlZcXJwkafbs2YqPj9e+ffsUHR19PcMAAADquCrNEE2dOlVt2rRRhw4ddPToUX300Uc6dOiQJk6cqMjISHXs2FGzZs3Sjh07rqldp9MpSQoICHDZv379egUFBSkqKkrDhg1TYWGheSwnJ0fnz59XQkKCuS8sLEwxMTHatGmTJGnz5s1yOBxmGJKk9u3by+FwmDWXKi0tVXFxscsGAABuTlWaIZo5c6aefvppPfXUU1ecuWnWrJnmzJlT6TYNw9CYMWN03333KSYmxtzfu3dvPfbYY4qIiFBeXp5ee+01de3aVTk5ObLb7SooKJC3t7caNWrk0l5wcLAKCgokSQUFBQoKCqrwnUFBQWbNpdLT0/Xb3/620v0HAAB1V5UC0YEDB362xtvbW4MHD650myNGjNBXX32ljRs3uuwfMGCA+e+YmBjFxsYqIiJCK1asUL9+/a7YnmEYstls5uef/vtKNT81fvx4jRkzxvxcXFys8PDwSp8PAACoO6p0yWzu3Ln6y1/+UmH/X/7yF82fP/+a2xs5cqSWL1+udevWqWnTpletDQ0NVUREhBnKQkJCVFZWpqKiIpe6wsJCBQcHmzXHjh2r0Nbx48fNmkvZ7XY1aNDAZQMAADenKgWit956S4GBgRX2BwUFadKkSZVuxzAMjRgxQkuXLtXatWsVGRn5sz9z4sQJHT58WKGhoZKkdu3aycvLS1lZWWZNfn6+du/erQ4dOkiS4uPj5XQ6XRZ4b9myRU6n06wBAADWVaVLZocOHbpseImIiNC3335b6XZefPFFLV68WJ9++qn8/f3N9TwOh0M+Pj4qKSlRWlqaHn30UYWGhurgwYOaMGGCAgMD9cgjj5i1Q4cO1dixY9W4cWMFBAQoNTVVbdq0Me86a9WqlXr16qVhw4Zp1qxZkqRnn31Wffr04Q4zAABQtRmioKAgffXVVxX2f/nll2rcuHGl25k5c6acTqc6d+6s0NBQc/v4448lSR4eHtq1a5f69u2rqKgoDR48WFFRUdq8ebP8/f3NdqZNm6aHH35Y/fv3V8eOHeXr66u///3v8vDwMGsWLVqkNm3aKCEhQQkJCbrrrru0YMGCqpw+AAC4yVRphujxxx/XqFGj5O/vbz4vaMOGDRo9erQef/zxSrdjGMZVj/v4+GjVqlU/2069evX0hz/8QX/4wx+uWBMQEKCFCxdWum8AAMA6qhSIJk6cqEOHDqlbt27y9PyxiQsXLmjQoEHXtIYIAACgNqhSIPL29tbHH3+sN954Q19++aV8fHzUpk0bRUREuLt/AAAAN9x1vbojKipKUVFR7uoLAABAjahSICovL9e8efP0+eefq7CwUBcuXHA5vnbtWrd0DgAAoDpUKRCNHj1a8+bN04MPPqiYmJgrPu0ZAACgLqhSIMrIyNCf//xnPfDAA+7uDwAAQLWr0nOIvL291aJFC3f3BQAAoEZUKRCNHTtW77777s8+RwgAAKAuqNIls40bN2rdunX6xz/+oTvvvFNeXl4ux5cuXeqWzgEAAFSHKgWihg0bmu8SAwAAqOuqFIjmzp3r7n4AAADUmCqtIZKkH374QWvWrNGsWbN06tQpSdLRo0dVUlLits4BAABUhyrNEB06dEi9evXSt99+q9LSUvXo0UP+/v6aPHmyzp07p/fff9/d/QQAALhhqjRDNHr0aMXGxqqoqEg+Pj7m/kceeUSff/652zoHAABQHap8l9m//vUveXt7u+yPiIjQd99955aOAQAAVJcqzRBduHBB5eXlFfYfOXJE/v7+190pAACA6lSlQNSjRw9Nnz7d/Gyz2VRSUqLf/OY3vM4DAADUOVW6ZDZt2jR16dJFrVu31rlz55SUlKQDBw4oMDBQS5YscXcfAQAAbqgqBaKwsDDl5uZqyZIl2rFjhy5cuKChQ4fqySefdFlkDQAAUBdUKRBJko+Pj55++mk9/fTT7uwPAABAtatSIProo4+uenzQoEFV6gwAAEBNqFIgGj16tMvn8+fP68yZM/L29pavry+BCAAA1ClVususqKjIZSspKdG+fft03333sagaAADUOVV+l9mlWrZsqbfeeqvC7BEAAEBt57ZAJEkeHh46evSoO5sEAAC44aq0hmj58uUunw3DUH5+vmbMmKGOHTu6pWMAAADVpUqB6OGHH3b5bLPZ1KRJE3Xt2lXvvPOOO/oFAABQbaoUiC5cuODufgAAANQYt64hAgAAqIuqNEM0ZsyYStdOnTq1Kl8BAABQbaoUiHbu3KkdO3bohx9+UHR0tCRp//798vDw0D333GPW2Ww29/QSAADgBqrSJbOHHnpInTp10pEjR7Rjxw7t2LFDhw8fVpcuXdSnTx+tW7dO69at09q1a6/aTnp6uu699175+/srKChIDz/8sPbt2+dSYxiG0tLSFBYWJh8fH3Xu3Fl79uxxqSktLdXIkSMVGBgoPz8/JSYm6siRIy41RUVFSk5OlsPhkMPhUHJysk6ePFmV0wcAADeZKgWid955R+np6WrUqJG5r1GjRpo4ceI13WW2YcMGvfjii8rOzlZWVpZ++OEHJSQk6PTp02bN5MmTNXXqVM2YMUPbtm1TSEiIevTooVOnTpk1KSkpWrZsmTIyMrRx40aVlJSoT58+Ki8vN2uSkpKUm5urzMxMZWZmKjc3V8nJyVU5fQAAcJOp0iWz4uJiHTt2THfeeafL/sLCQpeg8nMyMzNdPs+dO1dBQUHKycnR/fffL8MwNH36dL366qvq16+fJGn+/PkKDg7W4sWL9dxzz8npdGrOnDlasGCBunfvLklauHChwsPDtWbNGvXs2VN79+5VZmamsrOzFRcXJ0maPXu24uPjtW/fPvOyHwAAsKYqzRA98sgjeuqpp/TXv/5VR44c0ZEjR/TXv/5VQ4cONYNLVTidTklSQECAJCkvL08FBQVKSEgwa+x2uzp16qRNmzZJknJycnT+/HmXmrCwMMXExJg1mzdvlsPhMMOQJLVv314Oh8OsuVRpaamKi4tdNgAAcHOq0gzR+++/r9TUVA0cOFDnz5//sSFPTw0dOlS/+93vqtQRwzA0ZswY3XfffYqJiZEkFRQUSJKCg4NdaoODg3Xo0CGzxtvb2+Xy3cWaiz9fUFCgoKCgCt8ZFBRk1lwqPT1dv/3tb6t0LgAAoG6p0gyRr6+v3nvvPZ04ccK84+x///uf3nvvPfn5+VWpIyNGjNBXX32lJUuWVDh26d1qhmH87B1sl9Zcrv5q7YwfP15Op9PcDh8+XJnTAAAAddB1PZgxPz9f+fn5ioqKkp+fnwzDqFI7I0eO1PLly7Vu3To1bdrU3B8SEiJJFWZxCgsLzVmjkJAQlZWVqaio6Ko1x44dq/C9x48frzD7dJHdbleDBg1cNgAAcHOqUiA6ceKEunXrpqioKD3wwAPKz8+XJD3zzDMaO3ZspdsxDEMjRozQ0qVLtXbtWkVGRrocj4yMVEhIiLKyssx9ZWVl2rBhgzp06CBJateunby8vFxq8vPztXv3brMmPj5eTqdTW7duNWu2bNkip9Np1gAAAOuqUiB66aWX5OXlpW+//Va+vr7m/gEDBlS4c+xqXnzxRS1cuFCLFy+Wv7+/CgoKVFBQoLNnz0r68TJXSkqKJk2apGXLlmn37t0aMmSIfH19lZSUJElyOBwaOnSoxo4dq88//1w7d+7UwIED1aZNG/Ous1atWqlXr14aNmyYsrOzlZ2drWHDhqlPnz7cYQYAAKq2qHr16tVatWqVy+UtSWrZsqW52LkyZs6cKUnq3Lmzy/65c+dqyJAhkqRx48bp7NmzeuGFF1RUVKS4uDitXr1a/v7+Zv20adPk6emp/v376+zZs+rWrZvmzZsnDw8Ps2bRokUaNWqUeTdaYmKiZsyYcS2nDQAAblI2owoLf/z9/bVjxw61bNlS/v7++vLLL9W8eXNt27ZNvXr10okTJ25EX2tUcXGxHA6HnE6n29cTbZ6T6pZ24odOcUs7AADcLCr797tKl8zuv/9+ffTRR+Znm82mCxcu6He/+526dOlSlSYBAABqTJUumf3ud79T586dtX37dpWVlWncuHHas2eP/ve//+lf//qXu/sIAABwQ1Vphqh169b66quv9Mtf/lI9evTQ6dOn1a9fP+3cuVO33367u/sIAABwQ13zDNHF12TMmjWLJzkDAICbwjXPEHl5eWn37t0/+6RoAACAuqJKl8wGDRqkOXPmuLsvAAAANaJKi6rLysr0pz/9SVlZWYqNja3w/rKpU6e6pXMAAADV4ZoC0X//+1/ddttt2r17t+655x5J0v79+11quJQGAADqmmsKRC1btlR+fr7WrVsn6cdXdfz+97+/4gtSUc3WpbunnS7j3dMOAAB1xDWtIbr0odb/+Mc/dPr0abd2CAAAoLpVaVH1RVV46wcAAECtc02ByGazVVgjxJohAABQ113TGiLDMDRkyBDZ7XZJ0rlz5zR8+PAKd5ktXbrUfT0EAAC4wa4pEA0ePNjl88CBA93aGQAAgJpwTYFo7ty5N6ofAAAANea6FlUDAADcDAhEAADA8ghEAADA8ghEAADA8ghEAADA8ghEAADA8ghEAADA8q7pOUSo3Tb/94Rb2onv4pZmAACoM5ghAgAAlkcgAgAAlkcgAgAAlkcgAgAAlkcgAgAAlkcgAgAAlkcgAgAAlkcgAgAAllejgeiLL77QQw89pLCwMNlsNv3tb39zOT5kyBDZbDaXrX379i41paWlGjlypAIDA+Xn56fExEQdOXLEpaaoqEjJyclyOBxyOBxKTk7WyZMnb/DZAQCAuqJGA9Hp06fVtm1bzZgx44o1vXr1Un5+vrmtXLnS5XhKSoqWLVumjIwMbdy4USUlJerTp4/Ky8vNmqSkJOXm5iozM1OZmZnKzc1VcnLyDTsvAABQt9Toqzt69+6t3r17X7XGbrcrJCTkssecTqfmzJmjBQsWqHv37pKkhQsXKjw8XGvWrFHPnj21d+9eZWZmKjs7W3FxcZKk2bNnKz4+Xvv27VN0dLR7TwoAANQ5tX4N0fr16xUUFKSoqCgNGzZMhYWF5rGcnBydP39eCQkJ5r6wsDDFxMRo06ZNkqTNmzfL4XCYYUiS2rdvL4fDYdZcTmlpqYqLi102AABwc6rVgah3795atGiR1q5dq3feeUfbtm1T165dVVpaKkkqKCiQt7e3GjVq5PJzwcHBKigoMGuCgoIqtB0UFGTWXE56erq55sjhcCg8PNyNZwYAAGqTWv22+wEDBpj/jomJUWxsrCIiIrRixQr169fvij9nGIZsNpv5+af/vlLNpcaPH68xY8aYn4uLiwlFAADcpGr1DNGlQkNDFRERoQMHDkiSQkJCVFZWpqKiIpe6wsJCBQcHmzXHjh2r0Nbx48fNmsux2+1q0KCBywYAAG5OdSoQnThxQocPH1ZoaKgkqV27dvLy8lJWVpZZk5+fr927d6tDhw6SpPj4eDmdTm3dutWs2bJli5xOp1kDAACsrUYvmZWUlOg///mP+TkvL0+5ubkKCAhQQECA0tLS9Oijjyo0NFQHDx7UhAkTFBgYqEceeUSS5HA4NHToUI0dO1aNGzdWQECAUlNT1aZNG/Ous1atWqlXr14aNmyYZs2aJUl69tln1adPH+4wAwAAkmo4EG3fvl1dunQxP19cszN48GDNnDlTu3bt0kcffaSTJ08qNDRUXbp00ccffyx/f3/zZ6ZNmyZPT0/1799fZ8+eVbdu3TRv3jx5eHiYNYsWLdKoUaPMu9ESExOv+uwjAABgLTbDMIya7kRdUFxcLIfDIafT6fb1RJvnpLq1vesVP3RKTXcBAAC3qOzf7zq1hggAAOBGIBABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADL86zpDqD22Twn1S3txA+d4pZ2AAC40ZghAgAAlkcgAgAAlkcgAgAAlkcgAgAAlkcgAgAAlkcgAgAAlkcgAgAAlkcgAgAAlkcgAgAAlkcgAgAAlkcgAgAAlkcgAgAAlkcgAgAAlkcgAgAAlkcgAgAAlkcgAgAAllejgeiLL77QQw89pLCwMNlsNv3tb39zOW4YhtLS0hQWFiYfHx917txZe/bscakpLS3VyJEjFRgYKD8/PyUmJurIkSMuNUVFRUpOTpbD4ZDD4VBycrJOnjx5g88OAADUFTUaiE6fPq22bdtqxowZlz0+efJkTZ06VTNmzNC2bdsUEhKiHj166NSpU2ZNSkqKli1bpoyMDG3cuFElJSXq06ePysvLzZqkpCTl5uYqMzNTmZmZys3NVXJy8g0/PwAAUDd41uSX9+7dW717977sMcMwNH36dL366qvq16+fJGn+/PkKDg7W4sWL9dxzz8npdGrOnDlasGCBunfvLklauHChwsPDtWbNGvXs2VN79+5VZmamsrOzFRcXJ0maPXu24uPjtW/fPkVHR1fPyQIAgFqr1q4hysvLU0FBgRISEsx9drtdnTp10qZNmyRJOTk5On/+vEtNWFiYYmJizJrNmzfL4XCYYUiS2rdvL4fDYdZcTmlpqYqLi102AABwc6q1gaigoECSFBwc7LI/ODjYPFZQUCBvb281atToqjVBQUEV2g8KCjJrLic9Pd1cc+RwOBQeHn5d5wMAAGqvWhuILrLZbC6fDcOosO9Sl9Zcrv7n2hk/frycTqe5HT58+Bp7DgAA6opaG4hCQkIkqcIsTmFhoTlrFBISorKyMhUVFV215tixYxXaP378eIXZp5+y2+1q0KCBywYAAG5OtTYQRUZGKiQkRFlZWea+srIybdiwQR06dJAktWvXTl5eXi41+fn52r17t1kTHx8vp9OprVu3mjVbtmyR0+k0awAAgLXV6F1mJSUl+s9//mN+zsvLU25urgICAtSsWTOlpKRo0qRJatmypVq2bKlJkybJ19dXSUlJkiSHw6GhQ4dq7Nixaty4sQICApSamqo2bdqYd521atVKvXr10rBhwzRr1ixJ0rPPPqs+ffpwhxkAAJBUw4Fo+/bt6tKli/l5zJgxkqTBgwdr3rx5GjdunM6ePasXXnhBRUVFiouL0+rVq+Xv72/+zLRp0+Tp6an+/fvr7Nmz6tatm+bNmycPDw+zZtGiRRo1apR5N1piYuIVn30EAACsx2YYhlHTnagLiouL5XA45HQ63b6eaPOcVLe2V1vED51S010AAFhcZf9+19o1RAAAANWFQAQAACyPQAQAACyvRhdV4+Y2LWu/W9p5qUeUW9oBAOBKmCECAACWRyACAACWRyACAACWxxoi3DDtv/3ATS3xPCMAwI3FDBEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8brtHreeuV4BIvAYEAHB5zBABAADLIxABAADLIxABAADLIxABAADLY1E1aj33vRNN4r1oAIDLYYYIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHneZwVLc9RoQXgECADcXZogAAIDlMUMES3HfM414nhEA3EyYIQIAAJZHIAIAAJZHIAIAAJZXqwNRWlqabDabyxYSEmIeNwxDaWlpCgsLk4+Pjzp37qw9e/a4tFFaWqqRI0cqMDBQfn5+SkxM1JEjR6r7VAAAQC1WqwORJN15553Kz883t127dpnHJk+erKlTp2rGjBnatm2bQkJC1KNHD506dcqsSUlJ0bJly5SRkaGNGzeqpKREffr0UXl5eU2cDgAAqIVq/V1mnp6eLrNCFxmGoenTp+vVV19Vv379JEnz589XcHCwFi9erOeee05Op1Nz5szRggUL1L17d0nSwoULFR4erjVr1qhnz57Vei4AAKB2qvWB6MCBAwoLC5PdbldcXJwmTZqk5s2bKy8vTwUFBUpISDBr7Xa7OnXqpE2bNum5555TTk6Ozp8/71ITFhammJgYbdq06aqBqLS0VKWlpebn4uLiG3OCqJN4wCMA3Fxq9SWzuLg4ffTRR1q1apVmz56tgoICdejQQSdOnFBBQYEkKTg42OVngoODzWMFBQXy9vZWo0aNrlhzJenp6XI4HOYWHh7uxjMDAAC1Sa0ORL1799ajjz6qNm3aqHv37lqxYoWkHy+NXWSz2Vx+xjCMCvsuVZma8ePHy+l0mtvhw4ereBYAAKC2q9WB6FJ+fn5q06aNDhw4YK4runSmp7Cw0Jw1CgkJUVlZmYqKiq5YcyV2u10NGjRw2QAAwM2pTgWi0tJS7d27V6GhoYqMjFRISIiysrLM42VlZdqwYYM6dOggSWrXrp28vLxcavLz87V7926zBgAAoFYvqk5NTdVDDz2kZs2aqbCwUBMnTlRxcbEGDx4sm82mlJQUTZo0SS1btlTLli01adIk+fr6KikpSZLkcDg0dOhQjR07Vo0bN1ZAQIBSU1PNS3AAAABSLQ9ER44c0RNPPKHvv/9eTZo0Ufv27ZWdna2IiAhJ0rhx43T27Fm98MILKioqUlxcnFavXi1/f3+zjWnTpsnT01P9+/fX2bNn1a1bN82bN08eHh41dVoAAKCWsRmGYdR0J+qC4uJiORwOOZ1Ot68n2jwn1a3t4cbLbvasW9rhtnsAuLEq+/e7Vs8QAbVV+28/cFNLU9zUDgDgehCIgBrEAx4BoHaoU3eZAQAA3AgEIgAAYHkEIgAAYHkEIgAAYHksqgZqkLvuVpuWxWMAAOB6MEMEAAAsj0AEAAAsj0AEAAAsjzVEwE2AtUgAcH2YIQIAAJZHIAIAAJbHJTMAbsc72gDUNQQiACZ3rUXKbuaetUgAUF24ZAYAACyPGSIAtRaX3gBUFwIRgFrLXZfwpCluagfAzYpLZgAAwPKYIQKASnLXJTx34VIg4D4EIgBu575LXe5R24KMu7DGCnAfAhEAVBKPJQBuXqwhAgAAlscMEQBUs9o208SlN4BABABwE4IV6jICEYCbXm1b5I2rI1hdHeNzYxCIAAA3pZv17kJ3IVi5IhABQB1V22a+uHsOdRmBCABQq9S2ReewBgIRAMAtatuMFarHzXLpjUAEALgpMdOEa2GpBzO+9957ioyMVL169dSuXTv985//rOkuAQCAWsAyM0Qff/yxUlJS9N5776ljx46aNWuWevfura+//lrNmjWr6e4BAGopZpqswTIzRFOnTtXQoUP1zDPPqFWrVpo+fbrCw8M1c+bMmu4aAACoYZaYISorK1NOTo5eeeUVl/0JCQnatGnTZX+mtLRUpaWl5men0ylJKi4udnv/Tp8t/fkiAECd1mbfH9zSzramT7mlndrmRvx9/Wm7hmFctc4Sgej7779XeXm5goODXfYHBweroKDgsj+Tnp6u3/72txX2h4eH35A+AgBQOTNqugM3xIQb3P6pU6fkcDiueNwSgegim83m8tkwjAr7Lho/frzGjBljfr5w4YL+97//qXHjxlf8mcooLi5WeHi4Dh8+rAYNGlS5HVQO4129GO/qxXhXL8a7erlrvA3D0KlTpxQWFnbVOksEosDAQHl4eFSYDSosLKwwa3SR3W6X3W532dewYUO39alBgwb8F6oaMd7Vi/GuXox39WK8q5c7xvtqM0MXWWJRtbe3t9q1a6esrCyX/VlZWerQoUMN9QoAANQWlpghkqQxY8YoOTlZsbGxio+P1wcffKBvv/1Ww4cPr+muAQCAGmaZQDRgwACdOHFCr7/+uvLz8xUTE6OVK1cqIiKiWvtht9v1m9/8psLlONwYjHf1YryrF+NdvRjv6lXd420zfu4+NAAAgJucJdYQAQAAXA2BCAAAWB6BCAAAWB6BCAAAWB6BqBq99957ioyMVL169dSuXTv985//rOku3RTS09N17733yt/fX0FBQXr44Ye1b98+lxrDMJSWlqawsDD5+Pioc+fO2rNnTw31+OaSnp4um82mlJQUcx/j7V7fffedBg4cqMaNG8vX11e/+MUvlJOTYx5nvN3nhx9+0K9//WtFRkbKx8dHzZs31+uvv64LFy6YNYx31X3xxRd66KGHFBYWJpvNpr/97W8uxysztqWlpRo5cqQCAwPl5+enxMREHTly5Po7Z6BaZGRk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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "(\n", + " picsed_df\n", + " .filter(f.col('locus').isNotNull())\n", + " .select(\n", + " 'studyId',\n", + " 'variantId',\n", + " f.aggregate(\n", + " f.transform(\n", + " f.col('locus'),\n", + " lambda locus: f.when(locus.is99CredibleSet, f.lit(1.0)).otherwise( f.lit(0.0))\n", + " ),\n", + " f.lit(0.0),\n", + " lambda summa, value: summa + value\n", + " ).alias('99CredCount'),\n", + " f.aggregate(\n", + " f.transform(\n", + " f.col('locus'),\n", + " lambda locus: f.when(locus.is95CredibleSet, f.lit(1.0)).otherwise( f.lit(0.0))\n", + " ),\n", + " f.lit(0.0),\n", + " lambda summa, value: summa + value\n", + " ).alias('95CredCount'),\n", + " )\n", + "# .orderBy(f.col('99CredCount').desc())\n", + "# .show()\n", + " .filter(f.col('99CredCount') < 100)\n", + "# .count()\n", + " .toPandas()\n", + " [['99CredCount', '95CredCount']]\n", + " .plot.hist(bins=25, alpha=0.5, label='Credible set size')\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a8b99c39", + "metadata": {}, + "source": [ + "## Finngen clumping with locus\n", + "\n", + "- Window width: 500kbp\n", + "- Locus width: 250kbp\n", + "- LD threshold: 0.5\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "09f14d49", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-13T09:54:35.337711Z", + "start_time": "2023-10-13T09:54:34.446422Z" + } + }, + "outputs": [], + "source": [ + "# Import:\n", + "from pyspark.sql import functions as f, types as t\n", + "\n", + "from otg.common.session import Session\n", + "\n", + "from otg.dataset.summary_statistics import SummaryStatistics\n", + "from otg.dataset.study_locus import StudyLocus\n", + "from otg.dataset.study_index import StudyIndex\n", + "from otg.dataset.ld_index import LDIndex\n", + "from otg.method.ld import LDAnnotator\n", + "\n", + "from otg.method.pics import PICS\n", + "\n", + "# Initialize session:\n", + "session = Session()\n", + "\n", + "# Input:\n", + "sumstats = 'gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/*'\n", + "ld_index_path = 'gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/ld_index/'\n", + "\n", + "# Output:\n", + "ld_clumped_output = 'gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped'\n", + "picsed_output = 'gs://ot-team/dsuveges/finngen/2023.10.06_PICSed'\n", + "window_based_clumped_output = 'gs://ot-team/dsuveges/finngen/2023.10.06_window_clumped'" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "52861491", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-13T11:39:14.790777Z", + "start_time": "2023-10-13T10:47:20.349271Z" + }, + "code_folding": [], + "scrolled": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/10/13 10:47:53 WARN HintErrorLogger: Hint (strategy=broadcast) is not supported in the query: build right for right outer join.\n", + "23/10/13 10:47:53 WARN package: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.sql.debug.maxToStringFields'.\n", + "23/10/13 10:48:19 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=1248; previousMaxLatencyMs=1230; operationCount=59116581; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_OTHER_SYSTCON_FG/chromosome=2/part-00019-1d683f00-9247-401b-846c-8b2498bc68bf.c000.snappy.parquet\n", + "23/10/13 10:49:02 WARN GhfsStorageStatistics: Detected potential high latency for operation op_get_file_status. latencyMs=1039; previousMaxLatencyMs=1037; operationCount=126124; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_K11_SCISS_BITE_INCLAVO/chromosome=2/part-00018-e37f4a01-bdb4-442f-8dcd-681da303e876.c000.snappy.parquet\n", + "23/10/13 10:52:37 WARN GhfsStorageStatistics: Detected potential high latency for operation op_get_file_status. latencyMs=1917; previousMaxLatencyMs=1039; operationCount=144264; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_AUTOIMMUNE_NONTHYROID_STRICT/chromosome=5/part-00006-02537c5f-2dea-47c5-8655-b0d84827115a.c000.snappy.parquet\n", + "23/10/13 10:52:38 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=1942; previousMaxLatencyMs=1248; operationCount=94444057; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_K11_PULPITIS_1_ONLYAVO/chromosome=5/part-00006-de277609-305a-4cec-8bb1-5b37a70be48b.c000.snappy.parquet\n", + "23/10/13 11:07:41 WARN HintErrorLogger: Hint (strategy=broadcast) is not supported in the query: build right for right outer join.\n", + "23/10/13 11:12:32 WARN HintErrorLogger: Hint (strategy=broadcast) is not supported in the query: build right for right outer join.\n", + "23/10/13 11:12:48 WARN HintErrorLogger: Hint (strategy=broadcast) is not supported in the query: build right for right outer join.\n", + "23/10/13 11:21:40 WARN GoogleCloudStorageReadChannel: Failed read retry #1/10 for 'gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_H7_CONJUHAEMOR/chromosome=12/part-00016-03e2c019-d707-414b-b4e1-8b6474ccfb26.c000.snappy.parquet'. Sleeping...\n", + "java.net.SocketException: Connection reset\n", + "\tat java.net.SocketInputStream.read(SocketInputStream.java:186) ~[?:?]\n", + "\tat java.net.SocketInputStream.read(SocketInputStream.java:140) ~[?:?]\n", + "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.readFromSocket(ConscryptEngineSocket.java:920) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", + "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.processDataFromSocket(ConscryptEngineSocket.java:884) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", + "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.readUntilDataAvailable(ConscryptEngineSocket.java:799) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", + "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.read(ConscryptEngineSocket.java:772) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", + "\tat java.io.BufferedInputStream.read1(BufferedInputStream.java:290) ~[?:?]\n", + "\tat java.io.BufferedInputStream.read(BufferedInputStream.java:351) ~[?:?]\n", + "\tat sun.net.www.MeteredStream.read(MeteredStream.java:134) ~[?:?]\n", + "\tat java.io.FilterInputStream.read(FilterInputStream.java:133) ~[?:?]\n", + "\tat sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3529) ~[?:?]\n", + "\tat com.google.cloud.hadoop.repackaged.gcs.com.google.api.client.http.javanet.NetHttpResponse$SizeValidatingInputStream.read(NetHttpResponse.java:164) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", + "\tat java.io.BufferedInputStream.read1(BufferedInputStream.java:290) ~[?:?]\n", + "\tat java.io.BufferedInputStream.read(BufferedInputStream.java:351) ~[?:?]\n", + "\tat java.nio.channels.Channels$ReadableByteChannelImpl.read(Channels.java:388) ~[?:?]\n", + "\tat com.google.cloud.hadoop.repackaged.gcs.com.google.cloud.hadoop.gcsio.GoogleCloudStorageReadChannel.read(GoogleCloudStorageReadChannel.java:315) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", + "\tat com.google.cloud.hadoop.fs.gcs.GoogleHadoopFSInputStream.lambda$read$1(GoogleHadoopFSInputStream.java:170) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", + "\tat com.google.cloud.hadoop.fs.gcs.GhfsStorageStatistics.trackDuration(GhfsStorageStatistics.java:77) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", + "\tat com.google.cloud.hadoop.fs.gcs.GoogleHadoopFSInputStream.read(GoogleHadoopFSInputStream.java:159) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", + "\tat java.io.DataInputStream.read(DataInputStream.java:149) ~[?:?]\n", + "\tat org.apache.parquet.io.DelegatingSeekableInputStream.readFully(DelegatingSeekableInputStream.java:102) ~[parquet-common-1.12.2.jar:1.12.2]\n", + "\tat org.apache.parquet.io.DelegatingSeekableInputStream.readFullyHeapBuffer(DelegatingSeekableInputStream.java:127) ~[parquet-common-1.12.2.jar:1.12.2]\n", + "\tat org.apache.parquet.io.DelegatingSeekableInputStream.readFully(DelegatingSeekableInputStream.java:91) ~[parquet-common-1.12.2.jar:1.12.2]\n", + "\tat org.apache.parquet.hadoop.ParquetFileReader$ConsecutivePartList.readAll(ParquetFileReader.java:1704) ~[parquet-hadoop-1.12.2.jar:1.12.2]\n", + "\tat org.apache.parquet.hadoop.ParquetFileReader.readNextRowGroup(ParquetFileReader.java:925) ~[parquet-hadoop-1.12.2.jar:1.12.2]\n", + "\tat org.apache.parquet.hadoop.ParquetFileReader.readNextFilteredRowGroup(ParquetFileReader.java:972) ~[parquet-hadoop-1.12.2.jar:1.12.2]\n", + "\tat org.apache.spark.sql.execution.datasources.parquet.SpecificParquetRecordReaderBase$ParquetRowGroupReaderImpl.readNextRowGroup(SpecificParquetRecordReaderBase.java:320) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.checkEndOfRowGroup(VectorizedParquetRecordReader.java:403) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextBatch(VectorizedParquetRecordReader.java:324) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextKeyValue(VectorizedParquetRecordReader.java:227) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.RecordReaderIterator.hasNext(RecordReaderIterator.scala:39) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.hasNext(FileScanRDD.scala:116) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.nextIterator(FileScanRDD.scala:274) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.hasNext(FileScanRDD.scala:116) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.FileSourceScanExec$$anon$1.hasNext(DataSourceScanExec.scala:565) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.columnartorow_nextBatch_0$(Unknown Source) ~[?:?]\n", + "\tat org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.processNext(Unknown Source) ~[?:?]\n", + "\tat org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.WholeStageCodegenExec$$anon$1.hasNext(WholeStageCodegenExec.scala:760) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat scala.collection.Iterator$$anon$10.hasNext(Iterator.scala:460) ~[scala-library-2.12.14.jar:?]\n", + "\tat org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter.write(BypassMergeSortShuffleWriter.java:142) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.shuffle.ShuffleWriteProcessor.write(ShuffleWriteProcessor.scala:59) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:99) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:52) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.scheduler.Task.run(Task.scala:136) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$3(Executor.scala:548) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1504) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:551) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[?:?]\n", + "\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[?:?]\n", + "\tat java.lang.Thread.run(Thread.java:829) ~[?:?]\n", + "23/10/13 11:21:41 WARN GoogleCloudStorageReadChannel: Failed read retry #1/10 for 'gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_AMN2/chromosome=12/part-00016-6c463da6-b063-495d-8b62-8ad766491cfb.c000.snappy.parquet'. Sleeping...\n", + "java.net.SocketException: Connection reset\n", + "\tat java.net.SocketInputStream.read(SocketInputStream.java:186) ~[?:?]\n", + "\tat java.net.SocketInputStream.read(SocketInputStream.java:140) ~[?:?]\n", + "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.readFromSocket(ConscryptEngineSocket.java:920) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", + "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.processDataFromSocket(ConscryptEngineSocket.java:884) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", + "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.readUntilDataAvailable(ConscryptEngineSocket.java:799) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", + "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.read(ConscryptEngineSocket.java:772) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", + "\tat java.io.BufferedInputStream.read1(BufferedInputStream.java:290) ~[?:?]\n", + "\tat java.io.BufferedInputStream.read(BufferedInputStream.java:351) ~[?:?]\n", + "\tat sun.net.www.MeteredStream.read(MeteredStream.java:134) ~[?:?]\n", + "\tat java.io.FilterInputStream.read(FilterInputStream.java:133) ~[?:?]\n", + "\tat sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3529) ~[?:?]\n", + "\tat com.google.cloud.hadoop.repackaged.gcs.com.google.api.client.http.javanet.NetHttpResponse$SizeValidatingInputStream.read(NetHttpResponse.java:164) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", + "\tat java.io.BufferedInputStream.read1(BufferedInputStream.java:290) ~[?:?]\n", + "\tat java.io.BufferedInputStream.read(BufferedInputStream.java:351) ~[?:?]\n", + "\tat java.nio.channels.Channels$ReadableByteChannelImpl.read(Channels.java:388) ~[?:?]\n", + "\tat com.google.cloud.hadoop.repackaged.gcs.com.google.cloud.hadoop.gcsio.GoogleCloudStorageReadChannel.read(GoogleCloudStorageReadChannel.java:315) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", + "\tat com.google.cloud.hadoop.fs.gcs.GoogleHadoopFSInputStream.lambda$read$1(GoogleHadoopFSInputStream.java:170) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", + "\tat com.google.cloud.hadoop.fs.gcs.GhfsStorageStatistics.trackDuration(GhfsStorageStatistics.java:77) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", + "\tat com.google.cloud.hadoop.fs.gcs.GoogleHadoopFSInputStream.read(GoogleHadoopFSInputStream.java:159) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", + "\tat java.io.DataInputStream.read(DataInputStream.java:149) ~[?:?]\n", + "\tat org.apache.parquet.io.DelegatingSeekableInputStream.readFully(DelegatingSeekableInputStream.java:102) ~[parquet-common-1.12.2.jar:1.12.2]\n", + "\tat org.apache.parquet.io.DelegatingSeekableInputStream.readFullyHeapBuffer(DelegatingSeekableInputStream.java:127) ~[parquet-common-1.12.2.jar:1.12.2]\n", + "\tat org.apache.parquet.io.DelegatingSeekableInputStream.readFully(DelegatingSeekableInputStream.java:91) ~[parquet-common-1.12.2.jar:1.12.2]\n", + "\tat org.apache.parquet.hadoop.ParquetFileReader$ConsecutivePartList.readAll(ParquetFileReader.java:1704) ~[parquet-hadoop-1.12.2.jar:1.12.2]\n", + "\tat org.apache.parquet.hadoop.ParquetFileReader.readNextRowGroup(ParquetFileReader.java:925) ~[parquet-hadoop-1.12.2.jar:1.12.2]\n", + "\tat org.apache.parquet.hadoop.ParquetFileReader.readNextFilteredRowGroup(ParquetFileReader.java:972) ~[parquet-hadoop-1.12.2.jar:1.12.2]\n", + "\tat org.apache.spark.sql.execution.datasources.parquet.SpecificParquetRecordReaderBase$ParquetRowGroupReaderImpl.readNextRowGroup(SpecificParquetRecordReaderBase.java:320) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.checkEndOfRowGroup(VectorizedParquetRecordReader.java:403) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextBatch(VectorizedParquetRecordReader.java:324) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextKeyValue(VectorizedParquetRecordReader.java:227) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.RecordReaderIterator.hasNext(RecordReaderIterator.scala:39) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.hasNext(FileScanRDD.scala:116) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.nextIterator(FileScanRDD.scala:274) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.hasNext(FileScanRDD.scala:116) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.FileSourceScanExec$$anon$1.hasNext(DataSourceScanExec.scala:565) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.columnartorow_nextBatch_0$(Unknown Source) ~[?:?]\n", + "\tat org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.processNext(Unknown Source) ~[?:?]\n", + "\tat org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.WholeStageCodegenExec$$anon$1.hasNext(WholeStageCodegenExec.scala:760) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat scala.collection.Iterator$$anon$10.hasNext(Iterator.scala:460) ~[scala-library-2.12.14.jar:?]\n", + "\tat org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter.write(BypassMergeSortShuffleWriter.java:170) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.shuffle.ShuffleWriteProcessor.write(ShuffleWriteProcessor.scala:59) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:99) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:52) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.scheduler.Task.run(Task.scala:136) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$3(Executor.scala:548) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1504) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:551) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[?:?]\n", + "\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[?:?]\n", + "\tat java.lang.Thread.run(Thread.java:829) ~[?:?]\n", + "23/10/13 11:36:03 WARN HintErrorLogger: Hint (strategy=broadcast) is not supported in the query: build right for right outer join.\n", + "23/10/13 11:39:00 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=202; previousMaxLatencyMs=190; operationCount=105; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_20231013113900962145652452525416_0067_m_000009_79286/part-00009-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", + "23/10/13 11:39:00 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=216; previousMaxLatencyMs=202; operationCount=105; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_202310131139003257422348970599913_0067_m_000028_79305/part-00028-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", + "23/10/13 11:39:00 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=218; previousMaxLatencyMs=216; operationCount=105; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_202310131139006484121277706965747_0067_m_000003_79280/part-00003-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", + "23/10/13 11:39:01 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=243; previousMaxLatencyMs=218; operationCount=105; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_202310131139004953018478188900860_0067_m_000023_79300/part-00023-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", + "23/10/13 11:39:02 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=165; previousMaxLatencyMs=153; operationCount=92; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_202310131139003598197994288369319_0067_m_000026_79303/part-00026-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", + "23/10/13 11:39:02 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=193; previousMaxLatencyMs=165; operationCount=99; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_202310131139004279983947938826985_0067_m_000025_79302/part-00025-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", + "23/10/13 11:39:02 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=243; previousMaxLatencyMs=193; operationCount=103; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_202310131139004602145763603687891_0067_m_000030_79307/part-00030-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", + "23/10/13 11:39:02 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=329; previousMaxLatencyMs=243; operationCount=104; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_20231013113900353649088592248874_0067_m_000005_79282/part-00005-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", + " \r" + ] + } + ], + "source": [ + "window_based_clumped_output = 'gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus'\n", + "\n", + "clump_window_length = 500_000\n", + "locus_window_length = 250_000\n", + "\n", + "(\n", + " SummaryStatistics(\n", + " _df=(\n", + " session.spark.read.parquet(sumstats, recursiveFileLookup=True)\n", + " .withColumn(\n", + " 'chromosome',\n", + " f.split(f.col('variantId'), '_')[0]\n", + " )\n", + " ),\n", + " _schema=SummaryStatistics.get_schema()\n", + " )\n", + " .window_based_clumping(\n", + " distance=clump_window_length,\n", + " locus_collect_distance=locus_window_length,\n", + " with_locus=True\n", + " )\n", + " .df.write.mode('overwrite')\n", + " .parquet(window_based_clumped_output)\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "6b234362", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-13T12:39:15.023402Z", + "start_time": "2023-10-13T11:50:42.603425Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+---------------------+---------+---------+---------------+\n", + "| studyId|ldPopulationStructure|projectId|studyType|traitFromSource|\n", + "+--------------------+---------------------+---------+---------+---------------+\n", + "|FINNGEN_R9_K11_EN...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_H7_KER...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_H8_EXT...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_H7_RET...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_RHEUMA...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_H7_KER...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_HEIGHT...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_M13_SY...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_M13_DO...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_M13_PY...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "| FINNGEN_R9_GOUT_NOS| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_M13_FI...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_ALLERG...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_E4_DM2...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_G6_CER...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_L12_UR...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_AUTOIM...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_I9_HYP...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_M13_AR...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_K11_AP...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "+--------------------+---------------------+---------+---------+---------------+\n", + "only showing top 20 rows\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/10/13 11:55:34 WARN GhfsStorageStatistics: Detected potential high latency for operation op_open. latencyMs=676; previousMaxLatencyMs=470; operationCount=333148; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/ld_index/chromosome=5/part-00076-ff42773a-494c-46d2-bc22-322062b5e715.c000.snappy.parquet\n", + "23/10/13 12:39:11 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=279; previousMaxLatencyMs=243; operationCount=140; context=gs://ot-team/dsuveges/finngen/2023.10.13_ld_clumped_w_locus/_temporary/0/_temporary/attempt_202310131239103300432709600941830_0086_m_000000_80535/part-00000-17d449c4-f0c3-4617-b378-b74b864ab64a-c000.snappy.parquet\n", + "23/10/13 12:39:11 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=335; previousMaxLatencyMs=279; operationCount=140; context=gs://ot-team/dsuveges/finngen/2023.10.13_ld_clumped_w_locus/_temporary/0/_temporary/attempt_202310131239106417331548307580589_0086_m_000027_80562/part-00027-17d449c4-f0c3-4617-b378-b74b864ab64a-c000.snappy.parquet\n", + " \r" + ] + } + ], + "source": [ + "ld_clumped_output = 'gs://ot-team/dsuveges/finngen/2023.10.13_ld_clumped_w_locus'\n", + "\n", + "studies_df = (\n", + " session.spark.read.parquet(window_based_clumped_output)\n", + " # Generating a list of study identifiers:\n", + " .select('studyId')\n", + " .distinct()\n", + " # Adding fabricated values required to parse as gwas catalog study:\n", + " .select(\n", + " 'studyId',\n", + " StudyIndex.aggregate_and_map_ancestries(\n", + " f.array(\n", + " f.struct(\n", + " f.lit('Finnish').alias('ancestry'),\n", + " f.lit(100).cast('long').alias('sampleSize')\n", + " )\n", + " )\n", + " ).alias('ldPopulationStructure'),\n", + " f.lit('FINNGEN').alias('projectId'),\n", + " f.lit('gwas').alias('studyType'),\n", + " f.lit('cicaful').alias('traitFromSource')\n", + " )\n", + ")\n", + "\n", + "study_index = (\n", + " StudyIndex(\n", + " _df=studies_df,\n", + " _schema=StudyIndex.get_schema()\n", + " )\n", + ")\n", + "\n", + "study_index.df.show()\n", + "\n", + "# Loading ld index:\n", + "ld_index = LDIndex.from_parquet(session, ld_index_path)\n", + "\n", + "(\n", + " # To annotate study/locus, study level info and ld panel is needed:\n", + " LDAnnotator.ld_annotate(\n", + " StudyLocus.from_parquet(session, window_based_clumped_output),\n", + " study_index, \n", + " ld_index\n", + " )\n", + " # Clumping linked study-loci together:\n", + " .clump()\n", + " .df.write.mode('overwrite').parquet(ld_clumped_output)\n", + ")\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "f637e3c0", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-13T10:43:26.766382Z", + "start_time": "2023-10-13T10:43:25.980232Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------------------------------------------------+-----+\n", + "|qualityControls |count|\n", + "+--------------------------------------------------------------+-----+\n", + "|[Variant not found in LD reference] |4607 |\n", + "|[] |13813|\n", + "|[Explained by a more significant variant in high LD (clumped)]|585 |\n", + "+--------------------------------------------------------------+-----+\n", + "\n" + ] + } + ], + "source": [ + "(\n", + " session.spark.read.parquet(ld_clumped_output)\n", + " .groupBy('qualityControls')\n", + " .count()\n", + "# .show(1, False, True)\n", + " .show(truncate=False)\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "5bf42196", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-13T12:55:39.212186Z", + "start_time": "2023-10-13T12:55:38.131092Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "[Row(locus=[Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99764322_T_C', pValueMantissa=2.3949999809265137, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0201963, standardError=0.00665169, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99764860_G_A', pValueMantissa=1.0499999523162842, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00813303, standardError=0.00248194, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99765280_C_T', pValueMantissa=7.499000072479248, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0147615, standardError=0.00437943, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99765335_A_G', pValueMantissa=1.2640000581741333, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107816, standardError=0.00189456, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99766311_C_T', pValueMantissa=1.0579999685287476, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.010837, standardError=0.00189422, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99766702_A_G', pValueMantissa=1.2059999704360962, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107966, standardError=0.00189453, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99766923_T_C', pValueMantissa=1.3300000429153442, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010765, standardError=0.00189451, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99767090_TTTG_T', pValueMantissa=1.2740000486373901, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107778, standardError=0.00189432, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99768341_T_C', pValueMantissa=1.2289999723434448, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107887, standardError=0.00189422, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99768718_A_G', pValueMantissa=1.2649999856948853, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107795, standardError=0.0018942, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99768993_G_A', pValueMantissa=1.1629999876022339, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108066, standardError=0.00189423, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99769297_T_C', pValueMantissa=1.2929999828338623, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113037, standardError=0.00186275, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99769386_C_T', pValueMantissa=1.7280000448226929, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00670209, standardError=0.00281514, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99769548_A_G', pValueMantissa=1.7280000448226929, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0067021, standardError=0.00281514, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99769607_C_T', pValueMantissa=1.2710000276565552, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107775, standardError=0.00189416, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99770233_A_AT', pValueMantissa=1.1360000371932983, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108149, standardError=0.00189434, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99771038_C_A', pValueMantissa=1.1039999723434448, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0108218, standardError=0.00189392, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99771332_T_C', pValueMantissa=1.284999966621399, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00972726, standardError=0.00390986, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99771548_C_T', pValueMantissa=1.1369999647140503, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108168, standardError=0.00189473, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99774249_G_A', pValueMantissa=1.0410000085830688, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00813435, standardError=0.00248058, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99774476_AT_A', pValueMantissa=1.1540000438690186, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0108061, standardError=0.0018937, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99777761_G_A', pValueMantissa=2.9170000553131104, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0857961, standardError=0.0393337, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99777984_T_G', pValueMantissa=9.097999572753906, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108749, standardError=0.00189236, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99778063_G_A', pValueMantissa=1.2730000019073486, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00887632, standardError=0.00203368, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99778821_G_A', pValueMantissa=1.6679999828338623, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00682868, standardError=0.00285271, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99779613_C_G', pValueMantissa=7.630000114440918, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109299, standardError=0.00189215, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99781296_A_G', pValueMantissa=8.560999870300293, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.010892, standardError=0.00189195, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99781822_G_A', pValueMantissa=1.4390000104904175, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00689344, standardError=0.00281655, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99781826_A_G', pValueMantissa=7.65500020980835, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0109284, standardError=0.00189207, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99782821_C_T', pValueMantissa=1.3680000305175781, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00573303, standardError=0.00232523, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99783206_A_G', pValueMantissa=7.632999897003174, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99783290_A_C', pValueMantissa=8.821999549865723, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108841, standardError=0.00189224, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99784269_C_T', pValueMantissa=9.149999618530273, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108721, standardError=0.00189218, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99784331_G_A', pValueMantissa=4.435999870300293, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0327234, standardError=0.0162747, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99784751_C_A', pValueMantissa=3.0409998893737793, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.149822, standardError=0.0692119, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99785581_A_G', pValueMantissa=7.164000034332275, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0113888, standardError=0.00423514, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99786875_C_T', pValueMantissa=5.257999897003174, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110515, standardError=0.00189278, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787050_C_G', pValueMantissa=6.671999931335449, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109731, standardError=0.00189226, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787264_C_A', pValueMantissa=7.834000110626221, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109198, standardError=0.00189186, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787285_C_T', pValueMantissa=9.189000129699707, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108723, standardError=0.00189246, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787359_T_G', pValueMantissa=7.504000186920166, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109356, standardError=0.00189222, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787460_G_T', pValueMantissa=6.499000072479248, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.010984, standardError=0.00189269, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787461_G_T', pValueMantissa=6.499000072479248, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.010984, standardError=0.00189269, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787483_G_A', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787568_C_T', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787571_C_T', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787694_A_AT', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787855_C_T', pValueMantissa=8.937999725341797, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108798, standardError=0.00189223, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787860_C_T', pValueMantissa=7.64300012588501, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0231471, standardError=0.0086776, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787890_G_A', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787906_T_A', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787915_T_G', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99788026_C_T', pValueMantissa=7.7870001792907715, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109255, standardError=0.00189252, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99788420_A_C', pValueMantissa=7.001999855041504, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109573, standardError=0.00189216, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99788711_G_A', pValueMantissa=1.0420000553131104, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0108302, standardError=0.00189215, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99788859_C_T', pValueMantissa=7.632999897003174, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99788952_C_T', pValueMantissa=9.12399959564209, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108727, standardError=0.00189214, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99789038_A_G', pValueMantissa=7.164000034332275, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109498, standardError=0.00189212, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99789217_G_C', pValueMantissa=7.72599983215332, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109277, standardError=0.00189247, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99789506_G_C', pValueMantissa=7.671000003814697, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109278, standardError=0.00189209, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99789829_T_G', pValueMantissa=7.632999897003174, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99790008_G_A', pValueMantissa=7.603000164031982, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109305, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99790154_G_A', pValueMantissa=7.632999897003174, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99790319_T_G', pValueMantissa=7.857999801635742, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109213, standardError=0.00189229, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99791174_G_A', pValueMantissa=7.623000144958496, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0276216, standardError=0.00820577, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99791224_A_G', pValueMantissa=7.632999897003174, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99793129_A_T', pValueMantissa=9.17300033569336, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108711, standardError=0.00189215, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99793502_C_T', pValueMantissa=1.0099999904632568, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108395, standardError=0.00189201, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99793829_C_CGTAT', pValueMantissa=3.756999969482422, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.201946, standardError=0.0971122, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99794292_T_A', pValueMantissa=1.8420000076293945, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0427514, standardError=0.0181376, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99794803_C_G', pValueMantissa=3.76200008392334, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0754336, standardError=0.0362844, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99797363_G_A', pValueMantissa=2.696000099182129, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0451691, standardError=0.0204184, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99797572_A_C', pValueMantissa=7.729000091552734, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109255, standardError=0.0018921, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99798877_A_T', pValueMantissa=5.47599983215332, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111187, standardError=0.0019065, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99798989_G_T', pValueMantissa=4.708000183105469, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00645552, standardError=0.00184611, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99799669_G_A', pValueMantissa=1.3769999742507935, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0283588, standardError=0.0115134, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99801055_G_A', pValueMantissa=5.751999855041504, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0863438, standardError=0.0312661, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99801648_T_C', pValueMantissa=5.201000213623047, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.35431, standardError=0.126797, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99802216_C_T', pValueMantissa=8.795999526977539, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0312825, standardError=0.00584722, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99803737_A_G', pValueMantissa=4.105000019073486, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0838538, standardError=0.0410448, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99804058_G_A', pValueMantissa=9.253999710083008, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00819335, standardError=0.00247362, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99804255_C_G', pValueMantissa=8.798999786376953, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0312823, standardError=0.00584723, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99804875_C_T', pValueMantissa=2.2079999446868896, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0532293, standardError=0.023254, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99805400_A_G', pValueMantissa=5.626999855041504, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0215236, standardError=0.00777382, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99805994_G_A', pValueMantissa=1.6449999809265137, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0125221, standardError=0.00522031, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99806253_C_T', pValueMantissa=1.2120000123977661, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00800751, standardError=0.00247451, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99806469_CAT_C', pValueMantissa=1.996999979019165, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01596, standardError=0.00685871, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99807109_T_A', pValueMantissa=3.994999885559082, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0097045, standardError=0.00274107, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99807669_A_G', pValueMantissa=4.577000141143799, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111561, standardError=0.00190316, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99807962_A_G', pValueMantissa=3.7709999084472656, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0677375, standardError=0.0325981, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99809156_C_A', pValueMantissa=1.4980000257492065, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00696552, standardError=0.0028632, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99809726_T_C', pValueMantissa=4.446000099182129, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111654, standardError=0.00190318, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99809873_G_A', pValueMantissa=4.642000198364258, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.122379, standardError=0.0614495, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99811236_C_A', pValueMantissa=7.059999942779541, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110215, standardError=0.00190371, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99811771_C_T', pValueMantissa=4.526000022888184, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0111597, standardError=0.00190317, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99815174_G_C', pValueMantissa=6.111000061035156, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110649, standardError=0.00190324, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99815628_A_G', pValueMantissa=9.194999694824219, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0211397, standardError=0.00637879, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99815640_A_G', pValueMantissa=8.413999557495117, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0902758, standardError=0.0342605, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99816387_G_A', pValueMantissa=4.604000091552734, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0346061, standardError=0.0173466, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99816562_G_A', pValueMantissa=3.677000045776367, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00976812, standardError=0.00274214, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99816570_G_A', pValueMantissa=1.152999997138977, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00804666, standardError=0.00247569, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99817203_T_C', pValueMantissa=7.421999931335449, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110057, standardError=0.00190374, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99818525_T_C', pValueMantissa=1.4880000352859497, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0186574, standardError=0.0076615, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99819195_T_G', pValueMantissa=6.382999897003174, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0124767, standardError=0.0045745, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99820908_A_G', pValueMantissa=1.4980000257492065, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00696602, standardError=0.0028633, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99821086_GA_G', pValueMantissa=3.259999990463257, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0113261, standardError=0.00272622, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99821094_C_T', pValueMantissa=4.098999977111816, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0112471, standardError=0.00191273, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99821955_T_G', pValueMantissa=4.670000076293945, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0112087, standardError=0.00191323, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99822427_T_C', pValueMantissa=2.058000087738037, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115151, standardError=0.00192136, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99822696_T_C', pValueMantissa=7.763000011444092, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.162918, standardError=0.0611962, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99823047_A_G', pValueMantissa=7.198999881744385, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110742, standardError=0.0019139, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99823280_T_C', pValueMantissa=1.1619999408721924, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00804213, standardError=0.00247592, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99825419_A_G', pValueMantissa=1.2710000276565552, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0826158, standardError=0.0331567, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99825752_T_C', pValueMantissa=6.0370001792907715, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0111297, standardError=0.00191372, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99825835_C_T', pValueMantissa=6.0320000648498535, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0111299, standardError=0.00191372, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99827260_C_T', pValueMantissa=3.6500000953674316, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0489284, standardError=0.0233964, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99828083_C_T', pValueMantissa=3.938999891281128, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0959414, standardError=0.0465714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99828402_T_A', pValueMantissa=9.142000198364258, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0211518, standardError=0.00637931, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99828407_A_T', pValueMantissa=9.133999824523926, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0211533, standardError=0.0063793, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99829453_A_AT', pValueMantissa=6.083000183105469, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0111253, standardError=0.00191338, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99829545_ATATTT_A', pValueMantissa=4.810999870300293, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0112061, standardError=0.00191441, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99830168_G_A', pValueMantissa=1.218999981880188, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00801018, standardError=0.00247653, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99830263_G_A', pValueMantissa=1.6970000267028809, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0179959, standardError=0.00753787, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99832187_T_C', pValueMantissa=4.421000003814697, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0112213, standardError=0.0019124, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99832400_AAC_A', pValueMantissa=6.706999778747559, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110021, standardError=0.00189753, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99832402_C_CTGTGTGT', pValueMantissa=6.710999965667725, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110019, standardError=0.00189753, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99832563_A_G', pValueMantissa=1.4479999542236328, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0090241, standardError=0.00187287, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99832865_A_G', pValueMantissa=4.169000148773193, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0105412, standardError=0.00192234, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99834145_G_C', pValueMantissa=6.802999973297119, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.260334, standardError=0.0961939, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99834214_T_C', pValueMantissa=1.784000039100647, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0474718, standardError=0.0200386, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99835361_G_A', pValueMantissa=2.0769999027252197, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0595141, standardError=0.0257408, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99841479_C_T', pValueMantissa=6.188000202178955, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104861, standardError=0.00193711, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99842816_A_G', pValueMantissa=8.645000457763672, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00723726, standardError=0.00184352, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99844024_C_G', pValueMantissa=2.3450000286102295, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107969, standardError=0.00193341, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99844450_C_T', pValueMantissa=2.874000072479248, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107269, standardError=0.00193316, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99845178_C_T', pValueMantissa=4.0320000648498535, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0656125, standardError=0.0319983, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99845936_A_G', pValueMantissa=3.069999933242798, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00675859, standardError=0.00312767, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99848765_C_G', pValueMantissa=2.8910000324249268, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114511, standardError=0.00192855, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99850966_A_G', pValueMantissa=8.373000144958496, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101864, standardError=0.00190084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99852563_C_T', pValueMantissa=4.5329999923706055, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113089, standardError=0.0019287, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99853411_T_TG', pValueMantissa=9.414999961853027, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011087, standardError=0.00193121, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99856822_A_G', pValueMantissa=2.7119998931884766, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114876, standardError=0.00193129, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99856987_G_C', pValueMantissa=5.239999771118164, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010358, standardError=0.001903, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99857429_C_T', pValueMantissa=1.718000054359436, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116617, standardError=0.00193637, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99857502_A_G', pValueMantissa=6.296000003814697, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010296, standardError=0.00190308, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99857670_G_A', pValueMantissa=2.7939999103546143, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011478, standardError=0.00193126, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99857979_C_T', pValueMantissa=2.5840001106262207, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00775769, standardError=0.00184386, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99858035_C_T', pValueMantissa=2.7939999103546143, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011478, standardError=0.00193127, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99858181_G_C', pValueMantissa=2.7920000553131104, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114783, standardError=0.00193127, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99858624_T_C', pValueMantissa=6.314000129699707, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0103011, standardError=0.0019042, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99859267_C_A', pValueMantissa=1.5019999742507935, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0239274, standardError=0.00753783, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99859558_G_A', pValueMantissa=6.2779998779296875, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0321283, standardError=0.00593792, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99859674_G_A', pValueMantissa=1.1050000190734863, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100907, standardError=0.00190082, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99861014_C_G', pValueMantissa=1.350000023841858, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0080568, standardError=0.00185135, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99861191_A_G', pValueMantissa=2.062000036239624, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00788332, standardError=0.00185141, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99861743_A_C', pValueMantissa=1.621999979019165, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00893977, standardError=0.00186417, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99861975_TTGG_T', pValueMantissa=1.5509999990463257, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00895366, standardError=0.00186357, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99862766_C_T', pValueMantissa=1.7289999723434448, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00993376, standardError=0.0019007, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99863009_T_C', pValueMantissa=1.3009999990463257, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0535743, standardError=0.0215732, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99863999_T_C', pValueMantissa=1.4730000495910645, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0137073, standardError=0.00361145, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99864093_A_C', pValueMantissa=5.741000175476074, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0322238, standardError=0.00593803, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99864115_G_T', pValueMantissa=7.295000076293945, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.150642, standardError=0.0445916, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99865012_T_C', pValueMantissa=2.450000047683716, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00781456, standardError=0.00185205, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99865013_G_A', pValueMantissa=1.7259999513626099, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0159887, standardError=0.00510203, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99865261_T_C', pValueMantissa=1.4459999799728394, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00999453, standardError=0.00190036, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99865337_G_GAAGA', pValueMantissa=1.3170000314712524, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00806712, standardError=0.00185143, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99865513_C_G', pValueMantissa=1.3250000476837158, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0080656, standardError=0.00185165, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99866792_C_T', pValueMantissa=1.4500000476837158, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00803164, standardError=0.00185225, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99867170_C_T', pValueMantissa=8.121000289916992, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111182, standardError=0.00192825, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99867197_T_C', pValueMantissa=2.680999994277954, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0171717, standardError=0.00775509, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99867487_C_G', pValueMantissa=2.8310000896453857, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.359987, standardError=0.164156, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99867528_G_T', pValueMantissa=2.8389999866485596, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0077156, standardError=0.0018432, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99868259_G_A', pValueMantissa=2.265000104904175, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.119984, standardError=0.0392983, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99868412_T_G', pValueMantissa=1.6779999732971191, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00994383, standardError=0.00190064, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99868443_A_G', pValueMantissa=1.4809999465942383, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00801978, standardError=0.0018515, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99868585_TC_T', pValueMantissa=1.437999963760376, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0080333, standardError=0.00185188, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99868691_T_G', pValueMantissa=1.4730000495910645, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00802444, standardError=0.00185208, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99869742_G_A', pValueMantissa=4.677000045776367, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101608, standardError=0.00185986, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99870037_G_A', pValueMantissa=3.996999979019165, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0939625, standardError=0.0326443, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99870234_G_A', pValueMantissa=2.5759999752044678, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0270256, standardError=0.00896575, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99871164_A_T', pValueMantissa=9.444999694824219, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101485, standardError=0.0019015, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99871248_A_C', pValueMantissa=4.265999794006348, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011332, standardError=0.00192934, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99871256_C_T', pValueMantissa=1.0980000495910645, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100932, standardError=0.00190087, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99871596_T_C', pValueMantissa=1.097000002861023, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100928, standardError=0.00190078, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99871838_G_C', pValueMantissa=4.270999908447266, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113316, standardError=0.00192933, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99871912_T_C', pValueMantissa=1.0989999771118164, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100928, standardError=0.00190087, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99872008_T_C', pValueMantissa=1.0989999771118164, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100927, standardError=0.00190087, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99872112_C_T', pValueMantissa=1.093000054359436, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100944, standardError=0.00190084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99872802_A_G', pValueMantissa=2.828000068664551, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0103237, standardError=0.00185953, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99873074_C_T', pValueMantissa=4.716000080108643, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112996, standardError=0.00192927, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99873158_C_T', pValueMantissa=1.1759999990463257, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010069, standardError=0.00190084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99873263_C_T', pValueMantissa=1.1440000534057617, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010071, standardError=0.00189938, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99873471_G_A', pValueMantissa=6.283999919891357, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0723658, standardError=0.0264824, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99873553_C_T', pValueMantissa=1.8109999895095825, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122764, standardError=0.00286365, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99873602_C_T', pValueMantissa=3.7880001068115234, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102286, standardError=0.00185958, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99874022_C_T', pValueMantissa=3.7920000553131104, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102286, standardError=0.00185966, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99874186_C_CT', pValueMantissa=1.2230000495910645, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100561, standardError=0.00190097, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875195_T_C', pValueMantissa=4.964000225067139, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112867, standardError=0.00192988, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875202_G_T', pValueMantissa=1.312999963760376, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100339, standardError=0.00190142, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875320_C_A', pValueMantissa=1.2369999885559082, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100535, standardError=0.00190119, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875381_T_C', pValueMantissa=1.2410000562667847, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100525, standardError=0.00190121, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875452_C_T', pValueMantissa=2.5290000438690186, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0135056, standardError=0.00447237, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875704_T_A', pValueMantissa=2.9600000381469727, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00410906, standardError=0.00188882, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875760_A_AG', pValueMantissa=1.2430000305175781, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010052, standardError=0.00190125, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99876031_G_GT', pValueMantissa=1.3940000534057617, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0240895, standardError=0.00753787, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99876891_T_C', pValueMantissa=3.986999988555908, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102146, standardError=0.0018601, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99878758_G_A', pValueMantissa=2.763000011444092, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.151851, standardError=0.0689453, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99878850_C_G', pValueMantissa=4.1519999504089355, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102024, standardError=0.0018603, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99880039_G_A', pValueMantissa=4.0960001945495605, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102077, standardError=0.00186045, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99880120_A_C', pValueMantissa=4.75, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113026, standardError=0.00193019, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99880736_G_C', pValueMantissa=2.4639999866485596, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.11912, standardError=0.039343, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99882938_G_A', pValueMantissa=4.218999862670898, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102002, standardError=0.00186086, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99883489_C_T', pValueMantissa=7.486000061035156, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0140267, standardError=0.00524475, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99884754_C_T', pValueMantissa=2.5510001182556152, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011665, standardError=0.00195783, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99885306_C_T', pValueMantissa=7.618000030517578, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122854, standardError=0.00460381, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99885741_T_C', pValueMantissa=4.251999855041504, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101963, standardError=0.00186062, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99887218_A_G', pValueMantissa=1.3589999675750732, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100249, standardError=0.00190197, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99887854_C_T', pValueMantissa=1.3580000400543213, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010025, standardError=0.00190197, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99888103_G_A', pValueMantissa=3.808000087738037, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0456176, standardError=0.0219955, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99889239_G_C', pValueMantissa=1.3580000400543213, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100256, standardError=0.00190207, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99890983_C_T', pValueMantissa=1.3830000162124634, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01002, standardError=0.00190223, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99891336_A_G', pValueMantissa=3.815000057220459, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102374, standardError=0.00186162, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99891408_C_T', pValueMantissa=1.6360000371932983, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00996155, standardError=0.00190233, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99891590_G_A', pValueMantissa=6.8420000076293945, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114132, standardError=0.00422021, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99891697_T_C', pValueMantissa=4.46999979019165, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010205, standardError=0.00186523, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99892983_T_C', pValueMantissa=3.4000000953674316, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.177641, standardError=0.083791, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99893179_G_C', pValueMantissa=5.1570000648498535, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112781, standardError=0.00193051, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99893428_C_T', pValueMantissa=4.14300012588501, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102059, standardError=0.00186081, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99894094_G_C', pValueMantissa=4.321000099182129, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0249459, standardError=0.00708754, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99894492_G_T', pValueMantissa=8.531999588012695, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101123, standardError=0.00188821, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99894565_A_G', pValueMantissa=4.785999774932861, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00954874, standardError=0.00273411, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99894939_T_C', pValueMantissa=8.916999816894531, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00988844, standardError=0.00184916, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99895167_T_C', pValueMantissa=4.169000148773193, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00948941, standardError=0.00187497, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99895555_C_T', pValueMantissa=4.659999847412109, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0340557, standardError=0.0120355, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99896225_G_A', pValueMantissa=1.0920000076293945, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110344, standardError=0.0019305, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99896692_A_G', pValueMantissa=3.4130001068115234, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110917, standardError=0.00187665, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99896979_T_G', pValueMantissa=3.2119998931884766, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0401381, standardError=0.0187308, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99897831_T_C', pValueMantissa=1.9040000438690186, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.14616, standardError=0.0623359, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99898123_G_A', pValueMantissa=1.1069999933242798, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110304, standardError=0.00193059, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99898484_T_A', pValueMantissa=1.1139999628067017, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110285, standardError=0.00193061, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99898828_T_C', pValueMantissa=3.2699999809265137, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111045, standardError=0.00187657, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99899677_C_CTTGT', pValueMantissa=3.51200008392334, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110858, standardError=0.00187714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99900290_T_G', pValueMantissa=7.426000118255615, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0109405, standardError=0.00189249, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99900292_A_AT', pValueMantissa=1.1360000371932983, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00988613, standardError=0.00390553, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99900500_A_C', pValueMantissa=2.2009999752044678, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0412365, standardError=0.0180062, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99901642_T_C', pValueMantissa=5.086999893188477, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.113465, standardError=0.0405014, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99901731_C_T', pValueMantissa=1.5379999876022339, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0140283, standardError=0.00442901, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99902496_G_A', pValueMantissa=1.2289999723434448, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0224604, standardError=0.00897057, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99902603_C_T', pValueMantissa=4.140999794006348, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0854585, standardError=0.0419028, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99902712_G_C', pValueMantissa=1.1929999589920044, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110082, standardError=0.00193099, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99902720_C_G', pValueMantissa=3.492000102996826, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011087, standardError=0.00187705, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99902757_G_A', pValueMantissa=4.366000175476074, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110198, standardError=0.00187741, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99903008_A_C', pValueMantissa=3.4590001106262207, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01109, standardError=0.00187705, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99903292_G_A', pValueMantissa=3.4660000801086426, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110895, standardError=0.00187709, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99903681_G_T', pValueMantissa=6.072000026702881, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110979, standardError=0.00190858, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99904413_A_G', pValueMantissa=3.4719998836517334, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110894, standardError=0.00187714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99904499_G_A', pValueMantissa=1.1369999647140503, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110237, standardError=0.00193097, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99904588_G_A', pValueMantissa=9.54800033569336, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0142134, standardError=0.00430252, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99905340_C_T', pValueMantissa=1.184000015258789, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110128, standardError=0.00193138, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99905534_G_C', pValueMantissa=1.2209999561309814, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0379664, standardError=0.0151507, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99905541_A_G', pValueMantissa=3.575000047683716, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110805, standardError=0.00187717, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99905693_A_G', pValueMantissa=3.490999937057495, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110881, standardError=0.00187721, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99906210_T_C', pValueMantissa=3.5, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110874, standardError=0.00187724, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99906644_G_A', pValueMantissa=1.0570000410079956, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110495, standardError=0.00193126, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99906718_T_C', pValueMantissa=3.4709999561309814, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110901, standardError=0.00187726, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99908035_C_T', pValueMantissa=7.296000003814697, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0148557, standardError=0.00439751, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99908057_A_G', pValueMantissa=7.160999774932861, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0149937, standardError=0.00443164, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99908221_T_C', pValueMantissa=3.878000020980835, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110578, standardError=0.0018776, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99908813_T_C', pValueMantissa=5.124000072479248, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112768, standardError=0.00192994, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99909229_T_C', pValueMantissa=8.24899959564209, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00998922, standardError=0.0018631, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99909454_A_C', pValueMantissa=7.598999977111816, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0109359, standardError=0.00189297, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99910263_C_T', pValueMantissa=5.330999851226807, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111417, standardError=0.00190898, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99910368_T_C', pValueMantissa=3.302999973297119, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011106, standardError=0.00187736, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99910580_T_G', pValueMantissa=1.1369999647140503, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110251, standardError=0.00193122, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99911338_T_C', pValueMantissa=3.4579999446868896, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011092, standardError=0.00187738, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99911811_G_A', pValueMantissa=2.575000047683716, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.118741, standardError=0.0393917, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99912354_A_G', pValueMantissa=5.099999904632568, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112784, standardError=0.00192997, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99912584_A_G', pValueMantissa=3.447999954223633, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011093, standardError=0.00187739, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99913097_C_G', pValueMantissa=3.181999921798706, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111182, standardError=0.00187747, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99913702_T_C', pValueMantissa=1.0369999408721924, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0108274, standardError=0.00422404, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99914373_T_G', pValueMantissa=3.0360000133514404, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.248118, standardError=0.114583, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99915372_A_G', pValueMantissa=3.250999927520752, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111123, standardError=0.0018776, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99915373_G_A', pValueMantissa=3.3289999961853027, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111042, standardError=0.00187747, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99915884_T_C', pValueMantissa=5.684999942779541, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0109318, standardError=0.00187645, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99915918_T_G', pValueMantissa=1.281000018119812, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00983696, standardError=0.00186253, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99916127_T_C', pValueMantissa=5.081999778747559, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112798, standardError=0.00193, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99916503_A_T', pValueMantissa=6.974999904632568, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00734427, standardError=0.00184662, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99916552_T_C', pValueMantissa=2.9839999675750732, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0122137, standardError=0.00562257, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99917731_C_T', pValueMantissa=5.0289998054504395, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112837, standardError=0.0019301, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99919106_C_T', pValueMantissa=2.8299999237060547, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0131403, standardError=0.00440112, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99920364_C_T', pValueMantissa=4.159999847412109, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0219416, standardError=0.0076565, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99921641_GC_G', pValueMantissa=5.14900016784668, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112777, standardError=0.00193036, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99922010_GAAGA_G', pValueMantissa=3.134999990463257, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0255599, standardError=0.00709237, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99922205_A_G', pValueMantissa=8.65999984741211, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00997687, standardError=0.00186386, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99922419_C_T', pValueMantissa=5.785999774932861, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112417, standardError=0.00193063, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99923392_A_AAAT', pValueMantissa=7.868000030517578, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010012, standardError=0.00186439, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99924208_C_T', pValueMantissa=6.610000133514404, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112121, standardError=0.00193293, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99924251_CACGGTGAA_C', pValueMantissa=5.901000022888184, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112486, standardError=0.0019329, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99924611_T_C', pValueMantissa=3.5799999237060547, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.028521, standardError=0.0135863, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99924854_A_G', pValueMantissa=4.103000164031982, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.135756, standardError=0.0664409, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99925030_G_A', pValueMantissa=7.132999897003174, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0123943, standardError=0.00460661, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99925171_T_C', pValueMantissa=2.7660000324249268, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0131669, standardError=0.00439981, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99925527_C_T', pValueMantissa=3.3429999351501465, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011112, standardError=0.00187899, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99926307_T_C', pValueMantissa=1.2309999465942383, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00985993, standardError=0.0018643, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99926344_G_A', pValueMantissa=7.146999835968018, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0123917, standardError=0.00460668, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99928121_C_T', pValueMantissa=2.6080000400543213, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0237748, standardError=0.0106854, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99928961_T_A', pValueMantissa=7.409999847412109, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0092492, standardError=0.00274137, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99929621_G_C', pValueMantissa=2.4159998893737793, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00965232, standardError=0.00186913, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99930293_C_T', pValueMantissa=2.371000051498413, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00891412, standardError=0.00188903, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99930622_A_G', pValueMantissa=2.9200000762939453, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122713, standardError=0.0019469, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99930880_C_G', pValueMantissa=6.189000129699707, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126631, standardError=0.00193652, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99931871_G_T', pValueMantissa=1.0870000123977661, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132779, standardError=0.00195421, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99932501_G_T', pValueMantissa=7.144999980926514, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130514, standardError=0.0020025, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99932525_C_G', pValueMantissa=3.86299991607666, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132541, standardError=0.00190924, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99932591_G_A', pValueMantissa=3.625999927520752, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0057824, standardError=0.00276148, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933095_G_A', pValueMantissa=6.820000171661377, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.041325, standardError=0.0152743, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933333_G_A', pValueMantissa=7.736000061035156, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130529, standardError=0.00190738, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933398_T_G', pValueMantissa=1.1490000486373901, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132623, standardError=0.00195424, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933499_T_C', pValueMantissa=7.710999965667725, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130536, standardError=0.00190735, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933515_AG_A', pValueMantissa=6.0929999351501465, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130982, standardError=0.00200234, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933811_A_C', pValueMantissa=3.0450000762939453, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0271544, standardError=0.009164, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933841_A_G', pValueMantissa=7.820000171661377, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130497, standardError=0.00190735, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99935601_G_A', pValueMantissa=6.01200008392334, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131034, standardError=0.00200253, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99935839_G_A', pValueMantissa=1.9040000438690186, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0088457, standardError=0.00185702, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99936985_A_C', pValueMantissa=8.661999702453613, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130204, standardError=0.00190715, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99937543_C_A', pValueMantissa=6.139999866485596, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130966, standardError=0.00200245, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99938738_G_A', pValueMantissa=1.0329999923706055, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132869, standardError=0.00195344, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99939547_T_C', pValueMantissa=6.979000091552734, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130948, standardError=0.00190939, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99939652_G_A', pValueMantissa=4.034999847412109, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132546, standardError=0.00191099, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99940864_C_T', pValueMantissa=5.973999977111816, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131208, standardError=0.0020049, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99941429_ACCTCAGGGTTACC_A', pValueMantissa=4.370999813079834, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.187402, standardError=0.0929166, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99941625_T_C', pValueMantissa=7.7729997634887695, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130649, standardError=0.00190932, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99942056_T_C', pValueMantissa=4.118000030517578, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0832392, standardError=0.0407701, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99942622_C_G', pValueMantissa=4.414999961853027, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132329, standardError=0.00191137, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99942695_T_C', pValueMantissa=5.933000087738037, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131229, standardError=0.0020049, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99942879_G_C', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99943051_G_T', pValueMantissa=5.098999977111816, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0153013, standardError=0.00335503, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99943272_T_C', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99943700_G_A', pValueMantissa=1.340000033378601, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0629333, standardError=0.0254482, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99943766_A_G', pValueMantissa=3.8440001010894775, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0136334, standardError=0.00196368, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99944281_T_C', pValueMantissa=7.932000160217285, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130606, standardError=0.00190951, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99944562_A_T', pValueMantissa=4.39300012588501, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0135957, standardError=0.0019636, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99944721_TC_T', pValueMantissa=4.39300012588501, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0135957, standardError=0.0019636, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99945215_A_G', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99946139_G_A', pValueMantissa=1.3140000104904175, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00899244, standardError=0.00185887, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99946260_A_G', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99946307_A_C', pValueMantissa=4.873000144958496, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.12509, standardError=0.063468, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99946514_A_C', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99946634_G_A', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99947232_A_G', pValueMantissa=5.947999954223633, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131222, standardError=0.00200491, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99947807_T_C', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99947876_G_A', pValueMantissa=4.059000015258789, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132552, standardError=0.00191131, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99948681_A_G', pValueMantissa=7.769999980926514, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130649, standardError=0.00190932, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99949062_G_A', pValueMantissa=4.873000144958496, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.12509, standardError=0.063468, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99950056_G_A', pValueMantissa=4.761000156402588, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.107573, standardError=0.0543081, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99952120_T_C', pValueMantissa=1.062000036239624, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0236237, standardError=0.00721645, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99953194_G_A', pValueMantissa=5.874000072479248, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131262, standardError=0.00200494, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99953842_C_T', pValueMantissa=4.118000030517578, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132617, standardError=0.00191282, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99953915_A_G', pValueMantissa=3.8420000076293945, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132682, standardError=0.00191106, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99954520_G_A', pValueMantissa=6.242000102996826, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131087, standardError=0.00200505, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99954533_T_G', pValueMantissa=4.175000190734863, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132459, standardError=0.00191108, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99956142_G_A', pValueMantissa=4.054999828338623, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132533, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99956727_G_A', pValueMantissa=2.9579999446868896, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0132311, standardError=0.00445185, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99958027_A_G', pValueMantissa=7.925000190734863, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130596, standardError=0.00190933, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99959825_G_A', pValueMantissa=4.172999858856201, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0163596, standardError=0.00803454, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99959911_G_A', pValueMantissa=2.3239998817443848, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0134674, standardError=0.00201484, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99962154_T_G', pValueMantissa=6.442999839782715, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130988, standardError=0.002005, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99962896_A_G', pValueMantissa=4.985000133514404, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.018755, standardError=0.00956281, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99963747_T_C', pValueMantissa=3.8350000381469727, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.10415, standardError=0.0360205, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99963755_G_A', pValueMantissa=4.4070000648498535, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132354, standardError=0.00191167, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99963792_C_T', pValueMantissa=1.0329999923706055, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133147, standardError=0.0019575, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99963855_G_A', pValueMantissa=6.202000141143799, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131113, standardError=0.00200516, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99963858_G_C', pValueMantissa=4.052000045776367, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132537, standardError=0.00191104, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99964474_C_A', pValueMantissa=1.5709999799728394, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013808, standardError=0.0020483, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99964716_C_T', pValueMantissa=3.6579999923706055, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.022367, standardError=0.00769613, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99965353_C_T', pValueMantissa=4.11899995803833, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0832401, standardError=0.0407717, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99965381_C_T', pValueMantissa=3.3989999294281006, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0154555, standardError=0.00728972, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99965782_C_T', pValueMantissa=1.2259999513626099, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0312055, standardError=0.00547846, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99966311_G_A', pValueMantissa=4.085000038146973, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132514, standardError=0.00191102, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99966874_G_A', pValueMantissa=9.85099983215332, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133219, standardError=0.00195661, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99967655_A_C', pValueMantissa=4.085999965667725, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132548, standardError=0.00191151, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99968174_T_C', pValueMantissa=6.03000020980835, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131184, standardError=0.00200495, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99970196_C_T', pValueMantissa=1.940999984741211, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0134874, standardError=0.00191619, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99971874_A_G', pValueMantissa=4.980999946594238, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132011, standardError=0.0019115, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99973080_C_CATTT', pValueMantissa=9.527999877929688, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00936982, standardError=0.00191176, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99973080_CATTT_C', pValueMantissa=3.311000108718872, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013347, standardError=0.00191661, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99973360_A_G', pValueMantissa=1.6030000448226929, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0940323, standardError=0.0390452, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99973664_T_C', pValueMantissa=4.126999855041504, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013249, standardError=0.00191107, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99973694_T_C', pValueMantissa=3.937000036239624, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.13666, standardError=0.0663293, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99973733_A_G', pValueMantissa=4.34499979019165, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132363, standardError=0.00191125, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99974260_C_T', pValueMantissa=2.316999912261963, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0316527, standardError=0.0139405, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99975197_T_C', pValueMantissa=2.117000102996826, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0134651, standardError=0.00191633, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99975489_C_G', pValueMantissa=5.743000030517578, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0354502, standardError=0.0128345, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99976504_G_A', pValueMantissa=8.508999824523926, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0819298, standardError=0.031138, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99977161_A_G', pValueMantissa=4.061999797821045, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132532, standardError=0.00191106, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99977721_G_A', pValueMantissa=6.2829999923706055, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0246959, standardError=0.00903733, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99979375_G_A', pValueMantissa=3.937000036239624, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.13666, standardError=0.0663293, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99979565_C_T', pValueMantissa=4.479000091552734, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0275515, standardError=0.0137302, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99979592_G_A', pValueMantissa=3.3989999294281006, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133022, standardError=0.00191119, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99980479_A_C', pValueMantissa=7.7230000495910645, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0930047, standardError=0.0349125, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99980767_T_TG', pValueMantissa=3.1600000858306885, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133205, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99981303_T_C', pValueMantissa=1.0260000228881836, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0129016, standardError=0.0019962, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99982408_C_T', pValueMantissa=4.807000160217285, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131845, standardError=0.00200471, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99982941_G_A', pValueMantissa=3.236999988555908, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133135, standardError=0.00191092, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99983547_G_T', pValueMantissa=1.378000020980835, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0138444, standardError=0.00204793, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99983965_C_T', pValueMantissa=1.3339999914169312, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.276188, standardError=0.0722979, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99984671_A_G', pValueMantissa=1.090999960899353, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.012885, standardError=0.00199651, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99984912_C_T', pValueMantissa=3.328000068664551, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133085, standardError=0.00191128, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99986015_T_C', pValueMantissa=1.0609999895095825, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.012891, standardError=0.00199615, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99988026_G_T', pValueMantissa=7.709000110626221, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122774, standardError=0.0046077, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99988174_G_A', pValueMantissa=3.121999979019165, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133243, standardError=0.0019111, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99988593_A_C', pValueMantissa=4.09499979019165, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0833533, standardError=0.0407789, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99988730_T_C', pValueMantissa=3.1760001182556152, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133191, standardError=0.00191101, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99988731_G_A', pValueMantissa=5.669000148773193, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0144037, standardError=0.00520681, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99988980_A_G', pValueMantissa=4.874000072479248, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131807, standardError=0.00200475, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99989148_T_C', pValueMantissa=4.875, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131806, standardError=0.00200475, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99989685_T_C', pValueMantissa=4.556000232696533, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132006, standardError=0.00200472, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99989906_C_T', pValueMantissa=3.2639999389648438, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133133, standardError=0.00191121, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99990445_G_A', pValueMantissa=6.452000141143799, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.090219, standardError=0.0331213, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99990521_G_A', pValueMantissa=2.9019999504089355, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013345, standardError=0.00191124, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99990640_T_A', pValueMantissa=1.5579999685287476, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0139907, standardError=0.00442234, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99992006_G_GA', pValueMantissa=3.0260000228881836, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133329, standardError=0.00191111, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99992015_T_C', pValueMantissa=3.5850000381469727, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013291, standardError=0.00191165, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99992806_A_G', pValueMantissa=3.0290000438690186, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133327, standardError=0.00191112, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99993453_A_G', pValueMantissa=3.0329999923706055, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133323, standardError=0.00191113, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99993852_T_C', pValueMantissa=3.0360000133514404, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133322, standardError=0.00191113, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99994177_C_T', pValueMantissa=4.533999919891357, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132032, standardError=0.00200489, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99994349_A_T', pValueMantissa=1.0379999876022339, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0287633, standardError=0.00422921, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99995001_T_C', pValueMantissa=3.2860000133514404, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133152, standardError=0.00191176, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99995032_G_C', pValueMantissa=4.89900016784668, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131854, standardError=0.00200569, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99995714_T_C', pValueMantissa=3.374000072479248, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133048, standardError=0.00191128, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99995753_C_CTT', pValueMantissa=3.372999906539917, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133049, standardError=0.00191128, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99996207_C_G', pValueMantissa=3.384000062942505, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133041, standardError=0.00191129, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99997268_A_G', pValueMantissa=3.378999948501587, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133047, standardError=0.00191132, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99997438_CCA_C', pValueMantissa=6.603000164031982, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.109829, standardError=0.0404341, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99997720_A_G', pValueMantissa=2.815999984741211, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133548, standardError=0.00191149, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99998079_C_CA', pValueMantissa=4.61299991607666, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0922906, standardError=0.0462786, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99998104_G_A', pValueMantissa=1.2979999780654907, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00911911, standardError=0.0018841, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99999971_A_G', pValueMantissa=2.9570000171661377, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.030431, standardError=0.0102384, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100000235_C_T', pValueMantissa=5.6519999504089355, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.014492, standardError=0.00201036, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100000486_G_A', pValueMantissa=4.172999858856201, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.305198, standardError=0.149885, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100002038_G_A', pValueMantissa=3.7739999294281006, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0211624, standardError=0.0073064, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100002628_A_C', pValueMantissa=2.953000068664551, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0138093, standardError=0.00189258, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100004140_G_A', pValueMantissa=2.6459999084472656, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0994314, standardError=0.0448022, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100004827_A_C', pValueMantissa=6.945000171661377, pValueExponent=-14, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0142296, standardError=0.0019001, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100005233_T_C', pValueMantissa=3.111999988555908, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0216712, standardError=0.00733013, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100005358_G_C', pValueMantissa=4.872000217437744, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145472, standardError=0.00201239, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100005438_A_G', pValueMantissa=1.093000054359436, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0533162, standardError=0.02095, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100006780_C_T', pValueMantissa=5.067999839782715, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145408, standardError=0.002013, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100007241_C_T', pValueMantissa=6.783999919891357, pValueExponent=-14, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0142505, standardError=0.0019021, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100007404_G_GC', pValueMantissa=1.3420000076293945, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0198944, standardError=0.00377285, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100008640_A_G', pValueMantissa=5.019999980926514, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145435, standardError=0.002013, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100009013_G_A', pValueMantissa=6.611999988555908, pValueExponent=-14, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0142475, standardError=0.00190084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100009635_T_G', pValueMantissa=1.0549999475479126, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0134968, standardError=0.0018948, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100011477_C_G', pValueMantissa=2.444999933242798, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0148805, standardError=0.00203232, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100011685_CAAAT_C', pValueMantissa=4.139999866485596, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101715, standardError=0.00185449, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100011812_A_T', pValueMantissa=1.2029999494552612, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0141145, standardError=0.00190314, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100013275_A_T', pValueMantissa=2.174999952316284, pValueExponent=-14, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145924, standardError=0.00191005, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100013744_G_A', pValueMantissa=4.76800012588501, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.51719, standardError=0.261177, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100014566_A_G', pValueMantissa=8.550999641418457, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119513, standardError=0.00358432, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100014970_T_C', pValueMantissa=3.993000030517578, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0146099, standardError=0.00201355, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100015400_G_A', pValueMantissa=5.646999835968018, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0160357, standardError=0.00222448, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100015645_T_C', pValueMantissa=2.236999988555908, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145559, standardError=0.00207384, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100015854_C_T', pValueMantissa=6.158999919891357, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0160044, standardError=0.0022238, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100016635_T_G', pValueMantissa=1.718999981880188, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0147181, standardError=0.00218755, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100016645_C_T', pValueMantissa=4.622000217437744, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0256776, standardError=0.00906606, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100017027_A_T', pValueMantissa=6.242000102996826, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0160069, standardError=0.0022247, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100017624_A_G', pValueMantissa=1.7170000076293945, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0147203, standardError=0.00218782, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100018116_C_T', pValueMantissa=2.197000026702881, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145668, standardError=0.00207465, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100018135_G_C', pValueMantissa=1.4559999704360962, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.275534, standardError=0.0725377, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100018265_A_T', pValueMantissa=2.7190001010894775, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00874366, standardError=0.00186392, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100020857_T_C', pValueMantissa=9.112000465393066, pValueExponent=-14, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0156784, standardError=0.00210358, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100021675_C_A', pValueMantissa=3.066999912261963, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0233385, standardError=0.0107983, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100021907_C_T', pValueMantissa=7.229000091552734, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0159723, standardError=0.00222609, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100022313_C_CT', pValueMantissa=6.171999931335449, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0504229, standardError=0.0184125, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100023134_T_G', pValueMantissa=1.3980000019073486, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0268617, standardError=0.0109298, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100024168_G_A', pValueMantissa=2.3359999656677246, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00880598, standardError=0.00186491, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100024869_C_T', pValueMantissa=3.556999921798706, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0162101, standardError=0.00222929, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100025927_T_TA', pValueMantissa=3.621999979019165, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.014426, standardError=0.00207534, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100026878_C_T', pValueMantissa=9.258999824523926, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0185461, standardError=0.00712673, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100027354_G_A', pValueMantissa=1.968000054359436, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.103617, standardError=0.0444235, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100027592_G_C', pValueMantissa=1.965999960899353, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.103629, standardError=0.0444216, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100027903_T_C', pValueMantissa=2.75600004196167, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0384662, standardError=0.0128487, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100028049_C_T', pValueMantissa=4.144000053405762, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.130023, standardError=0.0637634, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100029663_A_G', pValueMantissa=8.883999824523926, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0147895, standardError=0.00206939, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100030853_G_A', pValueMantissa=7.5980000495910645, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0158245, standardError=0.00220759, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100030993_G_A', pValueMantissa=3.437000036239624, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0224965, standardError=0.00768921, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100031808_C_T', pValueMantissa=5.959000110626221, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0212214, standardError=0.00771671, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100032684_A_C', pValueMantissa=5.459000110626221, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.014926, standardError=0.00206922, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100033239_T_A', pValueMantissa=1.3669999837875366, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0463194, standardError=0.0187842, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100033337_C_T', pValueMantissa=9.138999938964844, pValueExponent=-14, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0165264, standardError=0.00221749, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100033635_G_GT', pValueMantissa=1.0110000371932983, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0164902, standardError=0.00221658, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100035604_T_A', pValueMantissa=3.4110000133514404, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01433, standardError=0.002059, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100037190_G_A', pValueMantissa=3.2070000171661377, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0120692, standardError=0.00203849, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100037544_C_T', pValueMantissa=1.6990000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00996527, standardError=0.00417483, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100037655_A_G', pValueMantissa=6.13100004196167, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0127317, standardError=0.00219016, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100038188_C_T', pValueMantissa=7.738999843597412, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126728, standardError=0.00219478, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100038589_T_C', pValueMantissa=3.734999895095825, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010628, standardError=0.00193133, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100038648_G_A', pValueMantissa=1.7230000495910645, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00994355, standardError=0.00417478, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100039544_T_C', pValueMantissa=5.021999835968018, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126227, standardError=0.00202988, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100039545_G_T', pValueMantissa=1.5509999990463257, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130939, standardError=0.00204582, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100039976_C_T', pValueMantissa=1.7209999561309814, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00994495, standardError=0.00417473, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100039997_T_C', pValueMantissa=5.01800012588501, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126197, standardError=0.00202937, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100040770_T_G', pValueMantissa=3.059999942779541, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.120454, standardError=0.0557085, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100042338_T_C', pValueMantissa=2.61899995803833, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.189007, standardError=0.085007, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100042505_G_A', pValueMantissa=3.4860000610351562, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101879, standardError=0.00482832, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100042848_C_CT', pValueMantissa=4.413000106811523, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0093599, standardError=0.00185336, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100043308_C_T', pValueMantissa=5.076000213623047, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126162, standardError=0.00202939, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100044357_C_T', pValueMantissa=5.36299991607666, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0127797, standardError=0.00218999, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100044501_A_G', pValueMantissa=1.7130000591278076, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00995148, standardError=0.00417441, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100044818_C_T', pValueMantissa=4.927000045776367, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0204248, standardError=0.00726406, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100044839_G_T', pValueMantissa=4.875, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126274, standardError=0.00202913, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100045047_A_C', pValueMantissa=4.922999858856201, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0204266, standardError=0.00726404, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100045603_T_A', pValueMantissa=1.6740000247955322, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00998325, standardError=0.00417297, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100045685_C_T', pValueMantissa=1.3309999704360962, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131383, standardError=0.00204533, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100045864_G_A', pValueMantissa=1.6770000457763672, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00998092, standardError=0.00417295, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100046495_A_G', pValueMantissa=4.683000087738037, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133938, standardError=0.00203532, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100046569_C_T', pValueMantissa=1.6740000247955322, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0129058, standardError=0.00202014, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100047823_TA_T', pValueMantissa=1.5670000314712524, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0129238, standardError=0.00201974, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100049106_G_A', pValueMantissa=1.690000057220459, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130999, standardError=0.00217423, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100049236_C_T', pValueMantissa=1.690000057220459, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00996986, standardError=0.00417357, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100049902_G_A', pValueMantissa=1.8940000534057617, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130591, standardError=0.00217409, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100050211_A_T', pValueMantissa=2.1419999599456787, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0633556, standardError=0.0275398, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100050359_GAACA_G', pValueMantissa=1.6019999980926514, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0129195, standardError=0.00202015, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100051409_C_G', pValueMantissa=1.7120000123977661, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130944, standardError=0.00217407, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100051504_G_A', pValueMantissa=1.7549999952316284, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00990516, standardError=0.00417051, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100052545_C_G', pValueMantissa=1.5299999713897705, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0129286, standardError=0.00201936, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100052742_T_C', pValueMantissa=1.687000036239624, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00997036, standardError=0.00417237, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100054045_C_T', pValueMantissa=1.3009999990463257, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0129769, standardError=0.0020191, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100054117_T_C', pValueMantissa=4.938000202178955, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0716183, standardError=0.0364414, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100054574_T_G', pValueMantissa=1.6629999876022339, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00999072, standardError=0.00417196, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100055122_T_C', pValueMantissa=6.368000030517578, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0124774, standardError=0.00214876, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100055153_G_A', pValueMantissa=1.6540000438690186, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00999801, standardError=0.0041714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100055199_C_G', pValueMantissa=1.8609999418258667, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130598, standardError=0.00217319, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100055816_G_A', pValueMantissa=3.3589999675750732, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126847, standardError=0.00201947, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100055862_T_G', pValueMantissa=4.1529998779296875, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0446939, standardError=0.0219282, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100056323_C_T', pValueMantissa=4.943999767303467, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0267439, standardError=0.0136118, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100056440_C_T', pValueMantissa=4.486999988555908, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00779499, standardError=0.00388601, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100057584_A_G', pValueMantissa=5.919000148773193, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011644, standardError=0.00200103, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100057785_T_C', pValueMantissa=4.816999912261963, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0128495, standardError=0.00219523, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100057800_C_T', pValueMantissa=1.0049999952316284, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122603, standardError=0.00200707, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100059207_A_C', pValueMantissa=3.622999906539917, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0143322, standardError=0.00401899, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100059401_T_TAACAAC', pValueMantissa=3.5920000076293945, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00695612, standardError=0.00194938, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100059401_T_TAACAACAAC', pValueMantissa=3.884999990463257, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133237, standardError=0.00644961, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100059657_G_A', pValueMantissa=3.880000114440918, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133275, standardError=0.00645004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100060102_G_C', pValueMantissa=3.874000072479248, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133327, standardError=0.00645048, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100060272_A_G', pValueMantissa=4.5370001792907715, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0594699, standardError=0.0297173, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100060908_A_G', pValueMantissa=2.742000102996826, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113896, standardError=0.00204953, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100061298_C_T', pValueMantissa=2.503000020980835, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0150616, standardError=0.00672123, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100061574_G_C', pValueMantissa=2.7809998989105225, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113862, standardError=0.00204983, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100061627_C_T', pValueMantissa=1.6690000295639038, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0323984, standardError=0.00537545, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100061926_T_C', pValueMantissa=1.1759999990463257, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122155, standardError=0.00200796, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100062022_C_T', pValueMantissa=9.611000061035156, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0212829, standardError=0.00821882, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100062212_C_T', pValueMantissa=3.7899999618530273, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133927, standardError=0.00645157, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100062744_C_A', pValueMantissa=3.752000093460083, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0134223, standardError=0.00645282, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100062935_C_T', pValueMantissa=3.7669999599456787, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0134118, standardError=0.00645294, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100063173_T_G', pValueMantissa=2.7899999618530273, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011387, standardError=0.00205019, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100063265_C_T', pValueMantissa=2.61299991607666, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0142012, standardError=0.00638472, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100063639_C_T', pValueMantissa=2.7750000953674316, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0276973, standardError=0.0125851, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100063786_T_C', pValueMantissa=2.9630000591278076, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011365, standardError=0.00205011, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100064214_T_C', pValueMantissa=5.559999942779541, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0128066, standardError=0.00219686, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100064301_T_C', pValueMantissa=2.427999973297119, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0540203, standardError=0.0239811, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100064486_T_C', pValueMantissa=2.484999895095825, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0271265, standardError=0.00428678, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100064533_A_G', pValueMantissa=8.324000358581543, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00771332, standardError=0.00196024, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100064544_T_C', pValueMantissa=8.236000061035156, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00771787, standardError=0.00196013, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100065403_C_G', pValueMantissa=1.7259999513626099, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00799338, standardError=0.00185995, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100066509_T_C', pValueMantissa=3.444999933242798, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0925747, standardError=0.0437751, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100066929_C_A', pValueMantissa=4.581999778747559, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0250808, standardError=0.012559, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100067656_G_A', pValueMantissa=2.6489999294281006, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143151, standardError=0.00645107, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100067862_G_A', pValueMantissa=7.921999931335449, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0119879, standardError=0.00195036, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100068504_C_T', pValueMantissa=6.7170000076293945, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00746427, standardError=0.00187258, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100068843_C_A', pValueMantissa=1.2430000305175781, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115969, standardError=0.00203679, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100068866_G_GT', pValueMantissa=1.312000036239624, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115787, standardError=0.00203689, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100069305_A_T', pValueMantissa=2.6449999809265137, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143181, standardError=0.00645098, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100069570_T_C', pValueMantissa=2.6549999713897705, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0151566, standardError=0.00504359, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100069757_C_T', pValueMantissa=2.5869998931884766, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145205, standardError=0.00481941, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100070175_A_G', pValueMantissa=2.000999927520752, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0130301, standardError=0.00421666, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100072279_G_C', pValueMantissa=1.2419999837875366, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115973, standardError=0.00203683, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100073428_G_T', pValueMantissa=2.609999895095825, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143509, standardError=0.00645062, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100073963_C_T', pValueMantissa=1.0750000476837158, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116458, standardError=0.00203655, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100074034_T_TC', pValueMantissa=2.005000114440918, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113741, standardError=0.0020269, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100074335_C_T', pValueMantissa=1.0729999542236328, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116458, standardError=0.00203643, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100074511_G_A', pValueMantissa=4.894000053405762, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0166749, standardError=0.00478271, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100074712_C_T', pValueMantissa=1.2990000247955322, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0487079, standardError=0.0196078, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100075164_G_A', pValueMantissa=1.2369999885559082, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115989, standardError=0.00203683, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100075228_C_T', pValueMantissa=2.6029999256134033, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143577, standardError=0.00645054, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100075751_C_A', pValueMantissa=1.7940000295639038, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0172016, standardError=0.00726754, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100076243_C_A', pValueMantissa=2.6019999980926514, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143585, standardError=0.00645053, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100077499_A_G', pValueMantissa=4.675000190734863, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00753971, standardError=0.00185191, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100077617_C_A', pValueMantissa=8.185999870300293, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013965, standardError=0.00417311, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100078024_G_A', pValueMantissa=4.400000095367432, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0760544, standardError=0.0267049, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100078160_G_A', pValueMantissa=2.5989999771118164, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143609, standardError=0.00645053, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100078351_A_T', pValueMantissa=5.255000114440918, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0358513, standardError=0.0103395, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100078510_A_C', pValueMantissa=8.102999687194824, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0119828, standardError=0.00195067, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100078923_G_A', pValueMantissa=1.805999994277954, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0171834, standardError=0.00726738, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100079042_G_A', pValueMantissa=2.5889999866485596, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143712, standardError=0.00645058, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100080295_T_C', pValueMantissa=5.934000015258789, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0121315, standardError=0.00195916, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100080362_T_A', pValueMantissa=9.142000198364258, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0117746, standardError=0.00204921, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100081203_A_G', pValueMantissa=7.883999824523926, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0119901, standardError=0.00195049, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100082411_T_C', pValueMantissa=2.5829999446868896, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143766, standardError=0.00645057, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100083012_C_A', pValueMantissa=3.0209999084472656, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0125696, standardError=0.0019959, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100083306_C_T', pValueMantissa=2.5810000896453857, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143789, standardError=0.00645062, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100083442_A_T', pValueMantissa=4.665999889373779, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00754005, standardError=0.0018518, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100083679_C_T', pValueMantissa=2.5810000896453857, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143785, standardError=0.00645064, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100083851_G_A', pValueMantissa=7.6570000648498535, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0119987, standardError=0.00195041, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100083869_GTGGA_G', pValueMantissa=2.5769999027252197, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143832, standardError=0.00645065, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100084120_A_G', pValueMantissa=2.5739998817443848, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143853, standardError=0.00645064, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085028_A_G', pValueMantissa=1.2200000286102295, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116042, standardError=0.00203692, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085123_T_C', pValueMantissa=2.569999933242798, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143893, standardError=0.00645068, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085191_A_C', pValueMantissa=1.0609999895095825, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116492, standardError=0.00203632, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085317_T_C', pValueMantissa=2.6549999713897705, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0151555, standardError=0.00504327, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085356_CT_C', pValueMantissa=2.989000082015991, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.012573, standardError=0.00199591, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085677_T_C', pValueMantissa=7.4720001220703125, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0120068, standardError=0.0019505, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085790_C_T', pValueMantissa=9.621999740600586, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0119266, standardError=0.0019502, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085791_G_A', pValueMantissa=6.89300012588501, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0076585, standardError=0.00283442, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100086416_A_C', pValueMantissa=4.2779998779296875, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00757727, standardError=0.00185176, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100087170_C_T', pValueMantissa=4.797999858856201, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0249466, standardError=0.0126147, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100088100_T_C', pValueMantissa=1.2690000534057617, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115908, standardError=0.00203699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100088206_G_A', pValueMantissa=1.8480000495910645, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0171185, standardError=0.00726652, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100088307_G_A', pValueMantissa=8.534000396728516, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0258604, standardError=0.00421546, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100088565_A_AGAG', pValueMantissa=2.5799999237060547, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01438, standardError=0.00645071, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100088687_C_T', pValueMantissa=4.041999816894531, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0124937, standardError=0.00199821, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100088994_G_C', pValueMantissa=4.744999885559082, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.26271, standardError=0.13253, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100089654_C_A', pValueMantissa=1.2940000295639038, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115954, standardError=0.00203897, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100090029_G_T', pValueMantissa=3.2170000076293945, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0322465, standardError=0.00583203, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100093119_C_T', pValueMantissa=3.0880000591278076, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.379152, standardError=0.0909911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100095173_CA_C', pValueMantissa=1.1920000314712524, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116127, standardError=0.00203702, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100095421_C_T', pValueMantissa=4.376999855041504, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00756736, standardError=0.00185174, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100095474_G_C', pValueMantissa=1.0429999828338623, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011657, standardError=0.00203668, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100095491_G_A', pValueMantissa=2.575000047683716, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143845, standardError=0.00645073, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100095666_A_G', pValueMantissa=2.997999906539917, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0125726, standardError=0.001996, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100095766_C_T', pValueMantissa=2.5769999027252197, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143829, standardError=0.00645074, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100096097_G_A', pValueMantissa=4.854000091552734, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.159194, standardError=0.0807015, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100096882_A_T', pValueMantissa=1.875, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0170779, standardError=0.00726586, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100097204_C_G', pValueMantissa=4.326000213623047, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00757235, standardError=0.00185173, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100097630_G_A', pValueMantissa=6.629000186920166, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0183017, standardError=0.0067411, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100097685_G_A', pValueMantissa=2.1630001068115234, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00784104, standardError=0.00341393, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100098591_G_A', pValueMantissa=7.1529998779296875, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00762397, standardError=0.00283455, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100099448_G_A', pValueMantissa=2.5399999618530273, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110489, standardError=0.00198346, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100100113_A_G', pValueMantissa=2.996000051498413, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.012573, standardError=0.00199604, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100100236_G_A', pValueMantissa=2.565000057220459, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143946, standardError=0.00645086, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100101678_G_A', pValueMantissa=1.065000057220459, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116505, standardError=0.00203676, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100101681_G_A', pValueMantissa=2.572999954223633, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143872, standardError=0.00645085, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100101734_C_T', pValueMantissa=2.805000066757202, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0388904, standardError=0.0177047, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100101865_T_C', pValueMantissa=7.827000141143799, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00939164, standardError=0.0021011, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100101978_T_A', pValueMantissa=2.565000057220459, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143954, standardError=0.00645086, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100102891_G_A', pValueMantissa=3.0280001163482666, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0125699, standardError=0.00199607, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100102937_T_C', pValueMantissa=1.0709999799728394, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116485, standardError=0.00203677, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100103034_T_C', pValueMantissa=1.062000036239624, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116512, standardError=0.00203676, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100103075_C_T', pValueMantissa=2.5480000972747803, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0144117, standardError=0.0064509, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100103232_C_T', pValueMantissa=1.059999942779541, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116519, standardError=0.00203676, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100103284_T_C', pValueMantissa=1.2389999628067017, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115998, standardError=0.00203711, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100103427_G_A', pValueMantissa=2.5409998893737793, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0144177, standardError=0.0064504, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100103653_C_A', pValueMantissa=1.2389999628067017, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116, standardError=0.00203711, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100104060_G_C', pValueMantissa=1.0570000410079956, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011653, standardError=0.00203678, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100104416_A_G', pValueMantissa=1.062999963760376, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116511, standardError=0.00203678, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100104538_T_A', pValueMantissa=3.0250000953674316, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0125704, standardError=0.0019961, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100104974_T_C', pValueMantissa=2.5460000038146973, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0144144, standardError=0.00645109, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100105358_T_A', pValueMantissa=1.246000051498413, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115981, standardError=0.00203714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100105587_G_A', pValueMantissa=1.0700000524520874, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116489, standardError=0.0020368, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100105759_A_T', pValueMantissa=1.253000020980835, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115962, standardError=0.00203715, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100106124_T_C', pValueMantissa=1.0019999742507935, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116787, standardError=0.00203801, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100106127_T_C', pValueMantissa=1.0019999742507935, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116787, standardError=0.00203801, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100106157_C_A', pValueMantissa=2.5399999618530273, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01442, standardError=0.00645108, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100106705_G_GGCAGAGTAA', pValueMantissa=3.0460000038146973, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0125685, standardError=0.00199613, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100107060_CG_C', pValueMantissa=1.2519999742507935, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115965, standardError=0.00203718, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100107246_C_T', pValueMantissa=1.8339999914169312, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.148529, standardError=0.0629731, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100107759_T_C', pValueMantissa=3.5490000247955322, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00765844, standardError=0.00185209, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100107761_A_G', pValueMantissa=5.459000110626221, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.272006, standardError=0.0786791, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100108013_C_T', pValueMantissa=2.561000108718872, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0243527, standardError=0.00807438, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100108920_T_G', pValueMantissa=9.07699966430664, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011727, standardError=0.00204049, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100109874_G_A', pValueMantissa=4.85099983215332, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0248793, standardError=0.0126104, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100110231_C_T', pValueMantissa=7.883999824523926, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0117687, standardError=0.00203931, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100110702_T_G', pValueMantissa=3.5929999351501465, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0606656, standardError=0.0289201, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100110795_TTA_T', pValueMantissa=6.190999984741211, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118518, standardError=0.00203936, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100111161_G_A', pValueMantissa=2.000999927520752, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0497915, standardError=0.0161136, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100111179_C_T', pValueMantissa=6.201000213623047, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118489, standardError=0.00203896, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100111991_C_A', pValueMantissa=6.7820000648498535, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118202, standardError=0.00203929, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100112419_TA_T', pValueMantissa=5.803999900817871, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118714, standardError=0.00203896, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100112828_C_T', pValueMantissa=2.8289999961853027, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0388309, standardError=0.0177045, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100112930_A_C', pValueMantissa=6.804999828338623, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118191, standardError=0.0020393, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100114067_A_G', pValueMantissa=1.0110000371932983, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104825, standardError=0.00196864, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100115072_C_T', pValueMantissa=1.034999966621399, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104694, standardError=0.00196776, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100115087_C_T', pValueMantissa=5.876999855041504, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118682, standardError=0.00203912, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100115453_T_C', pValueMantissa=1.0360000133514404, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104692, standardError=0.00196776, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100116179_G_C', pValueMantissa=5.88100004196167, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118679, standardError=0.00203913, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100116494_A_T', pValueMantissa=1.0360000133514404, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010469, standardError=0.00196776, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100116607_C_T', pValueMantissa=1.0160000324249268, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104762, standardError=0.00196781, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100116979_C_G', pValueMantissa=1.0180000066757202, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104755, standardError=0.0019678, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100117013_G_A', pValueMantissa=1.0379999876022339, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104684, standardError=0.00196777, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100118204_T_G', pValueMantissa=1.0509999990463257, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104641, standardError=0.00196778, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100118462_G_A', pValueMantissa=5.9079999923706055, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118664, standardError=0.00203914, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100118652_C_T', pValueMantissa=1.128999948501587, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104375, standardError=0.00196763, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100119929_C_G', pValueMantissa=8.840999603271484, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0121944, standardError=0.0019896, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100120722_G_A', pValueMantissa=5.441999912261963, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0106837, standardError=0.00196527, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100121497_C_T', pValueMantissa=1.5360000133514404, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.573298, standardError=0.23652, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100124748_T_C', pValueMantissa=2.8399999141693115, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0388018, standardError=0.0177043, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100125143_C_CA', pValueMantissa=3.8269999027252197, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0260846, standardError=0.0125892, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100125152_C_A', pValueMantissa=7.866000175476074, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105533, standardError=0.00196517, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100125180_C_T', pValueMantissa=7.633999824523926, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105635, standardError=0.00196509, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100125779_A_G', pValueMantissa=7.78000020980835, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105568, standardError=0.00196509, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100126618_A_C', pValueMantissa=4.631999969482422, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.133295, standardError=0.0668985, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100126748_A_G', pValueMantissa=7.800000190734863, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105558, standardError=0.00196509, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100127494_A_T', pValueMantissa=1.8029999732971191, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0082724, standardError=0.00349777, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128204_G_GAGAGAA', pValueMantissa=5.4019999504089355, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107556, standardError=0.00197804, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128221_A_G', pValueMantissa=6.446000099182129, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0106227, standardError=0.001965, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128550_G_A', pValueMantissa=8.194000244140625, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105396, standardError=0.00196532, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128651_T_C', pValueMantissa=7.315000057220459, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105796, standardError=0.00196528, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128763_C_T', pValueMantissa=7.829999923706055, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105544, standardError=0.00196508, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128883_C_T', pValueMantissa=8.057000160217285, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105443, standardError=0.00196508, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128958_G_A', pValueMantissa=2.124000072479248, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00680841, standardError=0.00295533, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100129035_C_A', pValueMantissa=3.3989999294281006, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0925999, standardError=0.043676, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100129320_C_T', pValueMantissa=2.13100004196167, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00680465, standardError=0.00295531, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100129629_A_C', pValueMantissa=1.8580000400543213, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.148278, standardError=0.0629939, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100129660_T_C', pValueMantissa=8.699000358581543, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115118, standardError=0.00200055, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100129776_G_A', pValueMantissa=1.690000057220459, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0884659, standardError=0.0281741, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100130207_C_T', pValueMantissa=3.569000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0140895, standardError=0.00483524, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100130573_C_G', pValueMantissa=2.9149999618530273, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00674022, standardError=0.00186053, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100130860_A_G', pValueMantissa=9.043999671936035, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114981, standardError=0.00200046, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100131042_G_A', pValueMantissa=3.619999885559082, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.179459, standardError=0.0503203, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100131063_C_G', pValueMantissa=2.2909998893737793, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00671867, standardError=0.00295325, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100131465_G_T', pValueMantissa=8.934000015258789, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115031, standardError=0.00200061, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100132172_C_G', pValueMantissa=2.128000020980835, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00680593, standardError=0.00295533, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100132602_T_TTAAA', pValueMantissa=4.828000068664551, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00431663, standardError=0.00218576, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100132602_T_TTAAATAAA', pValueMantissa=4.5980000495910645, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0519863, standardError=0.0260513, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100132602_TTAAATAAATAAA_T', pValueMantissa=7.363999843597412, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116156, standardError=0.00200877, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100133539_G_T', pValueMantissa=2.6610000133514404, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00678474, standardError=0.00186073, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100133661_G_A', pValueMantissa=2.6619999408721924, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00678444, standardError=0.00186073, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100134226_T_TAAAC', pValueMantissa=9.397000312805176, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114918, standardError=0.00200162, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100134368_G_T', pValueMantissa=2.305999994277954, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00685323, standardError=0.0018608, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100134849_C_G', pValueMantissa=2.5420000553131104, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00680611, standardError=0.00186063, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100136849_G_A', pValueMantissa=2.4240000247955322, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00682879, standardError=0.00186061, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100137626_G_C', pValueMantissa=4.564000129699707, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.133964, standardError=0.067025, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100139939_C_T', pValueMantissa=2.2850000858306885, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0168361, standardError=0.00739727, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100140109_A_G', pValueMantissa=8.161999702453613, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116036, standardError=0.00201274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100140433_T_C', pValueMantissa=8.460000038146973, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00745523, standardError=0.00283129, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100140822_C_T', pValueMantissa=4.0370001792907715, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00653853, standardError=0.00184827, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100140993_C_T', pValueMantissa=8.553999900817871, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00744479, standardError=0.00283137, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100141769_G_C', pValueMantissa=4.497000217437744, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.134653, standardError=0.0671606, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100142018_C_T', pValueMantissa=8.651000022888184, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00615783, standardError=0.00184859, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100142970_A_T', pValueMantissa=3.749000072479248, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0279115, standardError=0.00962947, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100143128_C_A', pValueMantissa=2.7290000915527344, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0151084, standardError=0.0050416, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100143200_T_G', pValueMantissa=8.8100004196167, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00751992, standardError=0.00191775, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100143201_T_C', pValueMantissa=8.812999725341797, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00751979, standardError=0.00191775, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100143322_A_G', pValueMantissa=8.62600040435791, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0074353, standardError=0.00283084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100143412_T_C', pValueMantissa=3.306999921798706, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0244099, standardError=0.00588015, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100143655_T_C', pValueMantissa=5.8420000076293945, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0063633, standardError=0.00185041, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100144149_T_G', pValueMantissa=5.2210001945495605, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0106098, standardError=0.00194903, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100144392_A_ACGTG', pValueMantissa=1.059999942779541, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122106, standardError=0.00200172, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100144587_G_A', pValueMantissa=4.710000038146973, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0106442, standardError=0.00194881, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100144738_C_T', pValueMantissa=3.628999948501587, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00387717, standardError=0.00185181, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100145180_CA_C', pValueMantissa=7.709000110626221, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00754349, standardError=0.00283104, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100145446_T_C', pValueMantissa=4.289000034332275, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00722839, standardError=0.0025309, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100145462_G_A', pValueMantissa=1.184999942779541, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00704211, standardError=0.00279842, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100145533_C_T', pValueMantissa=6.809999942779541, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0688508, standardError=0.0254439, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100145864_T_C', pValueMantissa=2.5959999561309814, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00556169, standardError=0.00184654, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100146576_G_A', pValueMantissa=2.239000082015991, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102862, standardError=0.0027873, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100147206_C_G', pValueMantissa=2.24399995803833, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102847, standardError=0.00278728, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100148436_A_G', pValueMantissa=7.232999801635742, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.01072, standardError=0.00317104, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100148745_A_G', pValueMantissa=9.111000061035156, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011124, standardError=0.00335401, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100150256_TG_T', pValueMantissa=1.621000051498413, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0058237, standardError=0.00184761, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100151385_A_G', pValueMantissa=2.200000047683716, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102977, standardError=0.002787, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100151760_T_G', pValueMantissa=1.680999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0116223, standardError=0.00369954, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100151918_T_C', pValueMantissa=1.305999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.01191, standardError=0.00370485, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100152307_T_C', pValueMantissa=9.949999809265137, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108402, standardError=0.00189131, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100152437_C_T', pValueMantissa=1.0140000581741333, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108394, standardError=0.00189222, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100153963_AT_A', pValueMantissa=3.984999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00551895, standardError=0.00191674, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100155294_C_T', pValueMantissa=5.695000171661377, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0370698, standardError=0.0134074, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100155300_C_A', pValueMantissa=3.9560000896453857, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013611, standardError=0.0066127, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100155337_G_C', pValueMantissa=9.121999740600586, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0129497, standardError=0.00390489, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100155409_G_C', pValueMantissa=1.305999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.01191, standardError=0.00370485, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100155608_A_G', pValueMantissa=2.359999895095825, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102538, standardError=0.00278865, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100157105_C_T', pValueMantissa=1.9290000200271606, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114702, standardError=0.00369896, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100157116_T_A', pValueMantissa=1.4279999732971191, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00588326, standardError=0.00184495, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100157609_G_A', pValueMantissa=2.1989998817443848, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0103034, standardError=0.00278846, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100157763_C_T', pValueMantissa=3.859999895095825, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00711467, standardError=0.00343966, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100158037_G_A', pValueMantissa=4.420000076293945, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0259169, standardError=0.00910471, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100158360_A_G', pValueMantissa=1.7910000085830688, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115545, standardError=0.0037, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100158691_C_T', pValueMantissa=6.251999855041504, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0131114, standardError=0.00327532, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100159080_T_C', pValueMantissa=8.289999961853027, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0343476, standardError=0.0102747, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100159144_G_A', pValueMantissa=1.3380000591278076, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00857697, standardError=0.00346768, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100159600_GAAATCAACAATAA_G', pValueMantissa=1.7860000133514404, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115575, standardError=0.0037, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100159706_T_TTTAAA', pValueMantissa=2.239000082015991, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102922, standardError=0.00278886, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100161011_T_C', pValueMantissa=1.305999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.01191, standardError=0.00370485, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100161641_G_T', pValueMantissa=1.305999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.01191, standardError=0.00370485, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100162586_C_T', pValueMantissa=1.5570000410079956, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0117095, standardError=0.00370097, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100162599_A_G', pValueMantissa=1.7910000085830688, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115545, standardError=0.0037, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100164449_A_T', pValueMantissa=8.289999961853027, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0343476, standardError=0.0102747, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100164555_T_C', pValueMantissa=1.8140000104904175, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0162269, standardError=0.00686797, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100164661_T_C', pValueMantissa=1.065000057220459, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108199, standardError=0.00189161, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100166335_G_A', pValueMantissa=1.569000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370099, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100167234_TA_T', pValueMantissa=1.9529999494552612, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114517, standardError=0.00369739, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100167290_A_G', pValueMantissa=1.9539999961853027, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114514, standardError=0.00369739, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100167685_C_T', pValueMantissa=3.9630000591278076, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0526946, standardError=0.0256104, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100167711_G_A', pValueMantissa=1.3270000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011893, standardError=0.00370488, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100168884_G_A', pValueMantissa=1.815000057220459, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.01154, standardError=0.00370004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100169073_T_A', pValueMantissa=1.659000039100647, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0164986, standardError=0.00688708, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100170367_T_A', pValueMantissa=1.8220000267028809, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115361, standardError=0.00370004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100170447_T_C', pValueMantissa=1.8200000524520874, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011537, standardError=0.00370004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100170652_A_G', pValueMantissa=8.133000373840332, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0162704, standardError=0.00614785, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100170743_T_C', pValueMantissa=1.819000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115379, standardError=0.00370004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100171278_T_G', pValueMantissa=1.965999960899353, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114445, standardError=0.00369739, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100171408_C_CTATT', pValueMantissa=1.8220000267028809, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115357, standardError=0.00370003, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100171892_C_A', pValueMantissa=4.783999919891357, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0290312, standardError=0.0146713, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100171937_A_T', pValueMantissa=3.7090001106262207, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0264529, standardError=0.0126887, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100172580_C_A', pValueMantissa=1.8209999799728394, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115368, standardError=0.00370004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100172766_C_T', pValueMantissa=1.3320000171661377, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0118891, standardError=0.00370488, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100173406_G_C', pValueMantissa=3.993000030517578, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0276948, standardError=0.00962055, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100173454_A_G', pValueMantissa=1.8220000267028809, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011536, standardError=0.00370004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100174322_A_AT', pValueMantissa=1.9670000076293945, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114438, standardError=0.00369738, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100174478_C_T', pValueMantissa=5.164999961853027, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114058, standardError=0.00195247, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100175179_A_G', pValueMantissa=1.968000054359436, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114433, standardError=0.00369738, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100175211_T_C', pValueMantissa=9.72700023651123, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0910994, standardError=0.02762, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100175305_C_T', pValueMantissa=1.8240000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011535, standardError=0.00370003, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100175350_T_C', pValueMantissa=1.8240000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011535, standardError=0.00370003, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100176550_CAAAAGACCGTTTTTA_C', pValueMantissa=1.8869999647140503, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115298, standardError=0.00371041, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100177021_C_G', pValueMantissa=1.8309999704360962, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115307, standardError=0.00370003, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100177437_T_C', pValueMantissa=4.168000221252441, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00536168, standardError=0.00187135, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100177850_C_T', pValueMantissa=7.14300012588501, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0216516, standardError=0.00545178, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100178264_G_A', pValueMantissa=1.8339999914169312, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011529, standardError=0.00370002, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100178377_T_A', pValueMantissa=3.9769999980926514, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0277079, standardError=0.00962096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100178824_A_C', pValueMantissa=1.1480000019073486, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0273359, standardError=0.0108138, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100178873_G_C', pValueMantissa=3.313999891281128, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00845972, standardError=0.00288043, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100178957_A_G', pValueMantissa=1.8370000123977661, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011527, standardError=0.00370001, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100181244_T_A', pValueMantissa=9.291000366210938, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0116765, standardError=0.00352639, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100182158_GT_G', pValueMantissa=1.440999984741211, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0118051, standardError=0.00370502, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100182496_T_C', pValueMantissa=2.2899999618530273, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102733, standardError=0.00278807, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100182799_A_G', pValueMantissa=2.365000009536743, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102471, standardError=0.00278728, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100183196_T_C', pValueMantissa=1.8519999980926514, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011518, standardError=0.00369996, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100183255_G_A', pValueMantissa=1.3580000400543213, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0118679, standardError=0.0037048, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100183966_G_A', pValueMantissa=1.8609999418258667, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115126, standardError=0.00369993, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100184256_T_C', pValueMantissa=4.7220001220703125, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.029124, standardError=0.0146772, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100184474_G_A', pValueMantissa=3.7109999656677246, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00543283, standardError=0.00187227, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100184568_G_A', pValueMantissa=2.1500000953674316, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0103173, standardError=0.00278792, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100186257_C_G', pValueMantissa=1.2259999513626099, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00596993, standardError=0.00184663, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100186688_C_T', pValueMantissa=1.9229999780654907, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114751, standardError=0.00369939, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100187980_C_T', pValueMantissa=4.630000114440918, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00813035, standardError=0.00287118, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100189674_T_G', pValueMantissa=9.279999732971191, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.126539, standardError=0.0486397, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100190351_G_A', pValueMantissa=4.619999885559082, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00813223, standardError=0.00287113, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100190395_G_A', pValueMantissa=2.0, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0760922, standardError=0.024623, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100192759_T_C', pValueMantissa=1.9559999704360962, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114555, standardError=0.00369915, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100193524_C_T', pValueMantissa=9.555000305175781, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0122529, standardError=0.0037093, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100193948_A_C', pValueMantissa=3.0179998874664307, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115477, standardError=0.00194714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100195245_A_T', pValueMantissa=4.635000228881836, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0081285, standardError=0.00287091, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100195684_C_CA', pValueMantissa=4.2270002365112305, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.137066, standardError=0.0674911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100195855_G_A', pValueMantissa=4.870999813079834, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00807719, standardError=0.00286889, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100197192_T_C', pValueMantissa=4.242000102996826, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.136954, standardError=0.067486, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100197458_C_A', pValueMantissa=4.629000186920166, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00812979, standardError=0.00287088, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100197612_C_G', pValueMantissa=4.498000144958496, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815595, standardError=0.00287088, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100197640_T_C', pValueMantissa=1.965000033378601, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114501, standardError=0.00369901, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100197675_G_A', pValueMantissa=2.75600004196167, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0386379, standardError=0.0175348, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100197920_A_G', pValueMantissa=2.384999990463257, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0167093, standardError=0.00739523, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100198475_T_C', pValueMantissa=1.9639999866485596, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114509, standardError=0.00369901, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100199282_C_G', pValueMantissa=1.1059999465942383, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0127328, standardError=0.00390313, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100199476_G_A', pValueMantissa=1.319000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0118973, standardError=0.00370432, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100200167_G_A', pValueMantissa=3.1589999198913574, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0376207, standardError=0.012745, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100201209_C_T', pValueMantissa=1.097000002861023, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00602792, standardError=0.0018465, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100201414_G_A', pValueMantissa=4.788000106811523, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0068162, standardError=0.00344526, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100201633_T_A', pValueMantissa=1.3179999589920044, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0118983, standardError=0.00370432, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100202455_T_C', pValueMantissa=1.9600000381469727, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114531, standardError=0.00369901, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100202467_G_A', pValueMantissa=3.875999927520752, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0277856, standardError=0.00962082, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100202772_A_T', pValueMantissa=1.9600000381469727, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114531, standardError=0.00369901, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100203494_T_C', pValueMantissa=1.9589999914169312, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114534, standardError=0.00369901, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100203542_G_T', pValueMantissa=1.6130000352859497, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00697446, standardError=0.00184854, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100203788_C_A', pValueMantissa=4.110000133514404, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.113144, standardError=0.0394286, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100204779_C_A', pValueMantissa=4.3379998207092285, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101425, standardError=0.00502088, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100205801_A_G', pValueMantissa=4.5329999923706055, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00814881, standardError=0.00287085, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100206194_A_T', pValueMantissa=1.9570000171661377, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114546, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100206333_A_G', pValueMantissa=4.160999774932861, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0263098, standardError=0.0129133, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100206660_A_G', pValueMantissa=2.4539999961853027, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.113651, standardError=0.0505422, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100206733_C_T', pValueMantissa=1.315999984741211, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119003, standardError=0.00370432, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100207009_TA_T', pValueMantissa=1.9559999704360962, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114549, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100207455_C_G', pValueMantissa=1.305999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00593547, standardError=0.00184639, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100207653_G_A', pValueMantissa=3.6470000743865967, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114874, standardError=0.00194719, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100207898_CAAGTT_C', pValueMantissa=3.384999990463257, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0921644, standardError=0.0434369, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100208164_G_C', pValueMantissa=3.874000072479248, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0277875, standardError=0.0096208, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100209200_T_C', pValueMantissa=1.315000057220459, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119009, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100210277_C_T', pValueMantissa=1.3040000200271606, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119097, standardError=0.00370434, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100211064_G_A', pValueMantissa=1.9550000429153442, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114558, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100211240_A_G', pValueMantissa=7.230000019073486, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00932586, standardError=0.00188208, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100212531_T_C', pValueMantissa=3.874000072479248, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0277872, standardError=0.00962078, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100212621_T_C', pValueMantissa=1.6109999418258667, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00697491, standardError=0.00184852, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100213072_C_T', pValueMantissa=1.9529999494552612, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114567, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100213340_T_C', pValueMantissa=1.6119999885559082, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00697479, standardError=0.00184851, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100213631_T_C', pValueMantissa=1.6119999885559082, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00697476, standardError=0.00184851, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100214977_G_T', pValueMantissa=4.242000102996826, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.136966, standardError=0.0674913, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100215512_G_A', pValueMantissa=4.473999977111816, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00816059, standardError=0.0028708, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100215525_C_CA', pValueMantissa=1.9509999752044678, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114578, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100215535_T_A', pValueMantissa=9.406000137329102, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0122847, standardError=0.00371395, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100215669_A_G', pValueMantissa=1.9509999752044678, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011458, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100216129_G_T', pValueMantissa=1.312000036239624, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119034, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100216744_G_C', pValueMantissa=2.9519999027252197, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115543, standardError=0.00194705, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100217073_T_TCATA', pValueMantissa=4.507999897003174, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815394, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100218126_C_T', pValueMantissa=1.055999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00604851, standardError=0.00184672, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100218867_A_G', pValueMantissa=3.3550000190734863, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.205837, standardError=0.0968422, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100218929_A_C', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100219439_G_A', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100219496_T_C', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100219653_G_A', pValueMantissa=8.52400016784668, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0210222, standardError=0.00799145, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100219661_T_C', pValueMantissa=7.915999889373779, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0163115, standardError=0.00614227, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100220164_T_C', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100220814_T_TA', pValueMantissa=4.504000186920166, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815468, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100220831_C_A', pValueMantissa=4.275000095367432, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.136751, standardError=0.0674941, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100221396_C_T', pValueMantissa=2.944000005722046, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115551, standardError=0.00194705, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100221486_T_G', pValueMantissa=1.3890000581741333, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0160699, standardError=0.00653242, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100221517_C_A', pValueMantissa=2.5439999103546143, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00413576, standardError=0.00185074, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100221594_C_G', pValueMantissa=2.0799999237060547, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0779801, standardError=0.0337333, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100223656_G_A', pValueMantissa=3.621000051498413, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114895, standardError=0.00194717, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100223788_T_C', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100224059_G_A', pValueMantissa=3.621000051498413, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114895, standardError=0.00194717, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100224086_A_ACT', pValueMantissa=1.0759999752044678, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00473991, standardError=0.00185855, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100224086_A_ACTCTCTCT', pValueMantissa=9.140999794006348, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0123865, standardError=0.00373569, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100224729_G_A', pValueMantissa=9.512999534606934, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0122608, standardError=0.00371028, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100224788_C_T', pValueMantissa=4.552000045776367, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00814496, standardError=0.00287083, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100224846_CA_C', pValueMantissa=4.505000114440918, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815457, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100225330_C_T', pValueMantissa=4.679999828338623, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00811972, standardError=0.0028709, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100225460_G_A', pValueMantissa=1.4520000219345093, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0138989, standardError=0.00568655, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100227298_T_G', pValueMantissa=4.505000114440918, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815457, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100227436_A_C', pValueMantissa=2.1089999675750732, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0204774, standardError=0.00887858, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100227710_T_C', pValueMantissa=2.624000072479248, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115932, standardError=0.00194728, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100228161_T_C', pValueMantissa=1.1180000305175781, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0127208, standardError=0.00390316, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100228188_C_G', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100228581_G_GGGA', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100228620_A_G', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100229692_G_T', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100229731_G_C', pValueMantissa=4.275000095367432, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.136751, standardError=0.0674941, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100230118_T_C', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100230958_C_A', pValueMantissa=3.694000005722046, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0264656, standardError=0.0126847, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100231193_T_TTTG', pValueMantissa=2.11299991607666, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0113217, standardError=0.00368321, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100231368_T_A', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100231561_G_GT', pValueMantissa=4.546000003814697, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815129, standardError=0.00287266, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100231791_G_C', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100233804_CAG_C', pValueMantissa=3.674999952316284, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114848, standardError=0.00194718, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100235720_T_G', pValueMantissa=4.255000114440918, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0683751, standardError=0.0337137, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100236254_A_G', pValueMantissa=1.8240000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.621107, standardError=0.263096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100236529_C_T', pValueMantissa=1.5670000314712524, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00698791, standardError=0.00184852, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100236538_A_G', pValueMantissa=1.5640000104904175, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00698861, standardError=0.00184852, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100236603_C_T', pValueMantissa=3.1489999294281006, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115356, standardError=0.00194738, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100237030_C_T', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100237733_G_A', pValueMantissa=4.505000114440918, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815457, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100237772_G_A', pValueMantissa=9.51200008392334, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0122572, standardError=0.00370917, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100237893_A_T', pValueMantissa=4.275000095367432, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.136751, standardError=0.0674941, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100238295_A_G', pValueMantissa=4.505000114440918, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815457, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100238581_A_G', pValueMantissa=6.859000205993652, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0255013, standardError=0.00751108, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100238657_T_C', pValueMantissa=2.809000015258789, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01157, standardError=0.00194702, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100239610_G_T', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100239637_A_G', pValueMantissa=1.1369999647140503, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00600877, standardError=0.00184638, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100239850_T_C', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100239989_G_A', pValueMantissa=3.2009999752044678, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011529, standardError=0.00194715, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100240726_T_G', pValueMantissa=4.000999927520752, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0525952, standardError=0.0256104, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100240944_C_T', pValueMantissa=2.8889999389648438, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115616, standardError=0.00194713, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100242014_C_T', pValueMantissa=4.505000114440918, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815457, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100242478_A_G', pValueMantissa=9.51200008392334, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0122572, standardError=0.00370917, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100242630_C_T', pValueMantissa=1.253999948501587, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011921, standardError=0.00369498, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100242920_TGA_T', pValueMantissa=4.275000095367432, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.136751, standardError=0.0674941, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100243390_G_A', pValueMantissa=8.79800033569336, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0252612, standardError=0.00439142, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100244149_G_C', pValueMantissa=3.316999912261963, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011525, standardError=0.0019484, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100244398_T_C', pValueMantissa=3.694000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00834099, standardError=0.00287304, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100244540_A_G', pValueMantissa=1.8240000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.621107, standardError=0.263096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100244650_T_C', pValueMantissa=1.8240000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.621107, standardError=0.263096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100244773_C_G', pValueMantissa=1.8240000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.621107, standardError=0.263096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100244991_G_C', pValueMantissa=1.8240000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.621107, standardError=0.263096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100245546_T_C', pValueMantissa=1.472000002861023, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0117796, standardError=0.00370405, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100245863_C_T', pValueMantissa=1.472000002861023, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0117796, standardError=0.00370405, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100246645_C_T', pValueMantissa=3.694000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00834099, standardError=0.00287304, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100246672_T_C', pValueMantissa=1.1399999856948853, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00600727, standardError=0.00184638, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100246924_C_T', pValueMantissa=3.4030001163482666, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0281666, standardError=0.00961714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100247616_T_C', pValueMantissa=3.694000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00834089, standardError=0.00287304, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100248412_C_G', pValueMantissa=1.4470000267028809, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00702484, standardError=0.00184863, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100248726_A_G', pValueMantissa=3.694999933242798, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00834082, standardError=0.00287304, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100249239_A_C', pValueMantissa=2.0339999198913574, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0353474, standardError=0.0152353, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100249267_A_T', pValueMantissa=1.472000002861023, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0117796, standardError=0.00370405, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100249476_T_TC', pValueMantissa=3.694999933242798, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00834082, standardError=0.00287304, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100249705_T_C', pValueMantissa=1.472000002861023, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0117796, standardError=0.00370405, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100250941_T_C', pValueMantissa=1.8240000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.621107, standardError=0.263096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100250976_T_A', pValueMantissa=6.709000110626221, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0690304, standardError=0.0254633, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100251390_T_A', pValueMantissa=2.9049999713897705, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0055723, standardError=0.00187139, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100251454_A_G', pValueMantissa=1.1790000200271606, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00712036, standardError=0.00184919, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100251790_C_T', pValueMantissa=3.497999906539917, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00593413, standardError=0.00281426, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100252662_G_A', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100252768_G_A', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100252920_T_G', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100254207_CCAGA_C', pValueMantissa=3.382999897003174, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0921782, standardError=0.0434383, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100254700_T_C', pValueMantissa=1.3079999685287476, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0884636, standardError=0.0275222, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100254749_C_A', pValueMantissa=3.940999984741211, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00710422, standardError=0.00344885, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100255058_C_G', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100255162_C_T', pValueMantissa=3.9679999351501465, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00827516, standardError=0.00287265, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100256000_C_A', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100256287_C_T', pValueMantissa=4.053999900817871, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00825485, standardError=0.00287235, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100256511_G_A', pValueMantissa=1.0700000524520874, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00604016, standardError=0.00184634, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100257612_C_T', pValueMantissa=1.9170000553131104, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0082026, standardError=0.00350204, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100258083_A_G', pValueMantissa=2.7039999961853027, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0635849, standardError=0.0287601, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100258094_C_T', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100258332_C_T', pValueMantissa=3.9760000705718994, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0082729, standardError=0.00287251, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100260000_A_G', pValueMantissa=1.6239999532699585, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0116706, standardError=0.00370306, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100260586_A_G', pValueMantissa=3.8919999599456787, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00829222, standardError=0.00287251, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100260869_C_T', pValueMantissa=4.205999851226807, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0082302, standardError=0.00287541, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100262992_C_T', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100263055_G_C', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100263140_C_T', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100263249_C_T', pValueMantissa=1.1790000200271606, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00711917, standardError=0.00184892, betaConditioned=None, standardErrorConditioned=None, r2Overall=None)], size=1001)]" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "window_based_clumped_output = 'gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus'\n", + "\n", + "(\n", + " session.spark.read.parquet(ld_clumped_output)\n", + " .filter(f.size(f.col('qualityControls')) == 0)\n", + "# .show(1, False, True)\n", + " .select('locus', f.size(f.col('locus')).alias('size'))\n", + " .limit(1)\n", + " .collect()\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e242acdd", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "gist": { + "data": { + "description": "GCS/dsuveges/PICS/2023.10.06 - PICS FINNGEN from top to bottom.ipynb", + "public": false + }, + "id": "" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/Productionizing_LD_matrix.ipynb b/notebooks/Productionizing_LD_matrix.ipynb new file mode 100644 index 000000000..84f8677b0 --- /dev/null +++ b/notebooks/Productionizing_LD_matrix.ipynb @@ -0,0 +1,1505 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "baf71347", + "metadata": {}, + "source": [ + "# Extracting square sub-matrices from reference\n", + "\n", + "\n", + "### Conceptual considerations:\n", + "\n", + "```\n", + "Summary statistics\n", + "↓\n", + "[window based clumping]\n", + "[ld based clumping]\n", + "↓\n", + "StudyLocus\n", + "↓\n", + "[ld matrix extraction] <- StudyIndex (studyId, ldPopulations), ldIndex, ldMatrix\n", + "↓\n", + "\n", + "```\n", + "\n", + "\n", + "- Assume we have only one ancestry" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "d75ac655", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-25T11:18:41.257715Z", + "start_time": "2023-10-25T11:18:14.728571Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "SLF4J: No SLF4J providers were found.\n", + "SLF4J: Defaulting to no-operation (NOP) logger implementation\n", + "SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.\n", + "SLF4J: Class path contains SLF4J bindings targeting slf4j-api versions 1.7.x or earlier.\n", + "SLF4J: Ignoring binding found at [jar:file:/usr/lib/spark/jars/log4j-slf4j-impl-2.18.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]\n", + "SLF4J: See https://www.slf4j.org/codes.html#ignoredBindings for an explanation.\n", + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", + "pip-installed Hail requires additional configuration options in Spark referring\n", + " to the path to the Hail Python module directory HAIL_DIR,\n", + " e.g. /path/to/python/site-packages/hail:\n", + " spark.jars=HAIL_DIR/backend/hail-all-spark.jar\n", + " spark.driver.extraClassPath=HAIL_DIR/backend/hail-all-spark.jar\n", + " spark.executor.extraClassPath=./hail-all-spark.jarRunning on Apache Spark version 3.3.0\n", + "SparkUI available at http://ds-genetics-etl-test-m.c.open-targets-eu-dev.internal:37397\n", + "Welcome to\n", + " __ __ <>__\n", + " / /_/ /__ __/ /\n", + " / __ / _ `/ / /\n", + " /_/ /_/\\_,_/_/_/ version 0.2.122-be9d88a80695\n", + "LOGGING: writing to /dev/null\n" + ] + } + ], + "source": [ + "from otg.common.session import Session\n", + "from otg.dataset.study_locus import StudyLocus\n", + "from otg.dataset.study_index import StudyIndex\n", + "from otg.datasource.gnomad.ld import GnomADLDMatrix\n", + "from otg.datasource.finngen.study_index import FinnGenStudyIndex\n", + "\n", + "import hail as hl\n", + "from hail.linalg import BlockMatrix\n", + "\n", + "from pyspark.sql import Window\n", + "import pyspark.sql.functions as f\n", + "from pyspark.sql import Column, DataFrame\n", + "\n", + "from urllib.request import urlopen\n", + "\n", + "\n", + "session = Session(hail_home='/opt/conda/miniconda3/lib/python3.10/site-packages/hail')\n", + "hl.init(sc=session.spark.sparkContext, log=\"/dev/null\")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "9eac3419", + "metadata": {}, + "source": [ + "## Generate FINNGEN Study table\n", + "\n", + "- Executed in 2.22s\n", + "- Building a Finngen study table from source." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "51b4cd9c", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-25T11:19:13.439965Z", + "start_time": "2023-10-25T11:19:11.603603Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0--------------------------------------------------------------------------------------------------------------------\n", + " studyId | FINNGEN_R9_AB1_ACTINOMYCOSIS \n", + " traitFromSource | Actinomycosis \n", + " nCases | 93 \n", + " nControls | 332343 \n", + " nSamples | 332436 \n", + " projectId | FINNGEN_R9 \n", + " studyType | gwas \n", + " hasSumstats | true \n", + " initialSampleSize | 377,277 (210,870 females and 166,407 males) \n", + " discoverySamples | [{377277, Finnish}] \n", + " summarystatsLocation | https://storage.googleapis.com/finngen-public-data-r9/summary_stats/finngen_R9_AB1_ACTINOMYCOSIS.gz \n", + " ldPopulationStructure | [{fin, 1.0}] \n", + "only showing top 1 row\n", + "\n", + "+--------------------+------------+\n", + "| studyId|ldPopulation|\n", + "+--------------------+------------+\n", + "|FINNGEN_R9_ASTHMA...| fin|\n", + "|FINNGEN_R9_E4_PIT...| fin|\n", + "|FINNGEN_R9_E4_VIT...| fin|\n", + "|FINNGEN_R9_H8_MID...| fin|\n", + "|FINNGEN_R9_L12_PI...| fin|\n", + "|FINNGEN_R9_M13_HA...| fin|\n", + "|FINNGEN_R9_M13_SP...| fin|\n", + "|FINNGEN_R9_Q17_LV...| fin|\n", + "|FINNGEN_R9_ALCOHO...| fin|\n", + "|FINNGEN_R9_CHRONL...| fin|\n", + "|FINNGEN_R9_C_DIFF...| fin|\n", + "|FINNGEN_R9_E4_OBE...| fin|\n", + "|FINNGEN_R9_GOUT_S...| fin|\n", + "|FINNGEN_R9_I9_LYM...| fin|\n", + "|FINNGEN_R9_I9_VAR...| fin|\n", + "|FINNGEN_R9_J10_CH...| fin|\n", + "|FINNGEN_R9_K11_HY...| fin|\n", + "|FINNGEN_R9_K11_RE...| fin|\n", + "|FINNGEN_R9_M13_OS...| fin|\n", + "|FINNGEN_R9_O15_PR...| fin|\n", + "+--------------------+------------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "# Processing studies:\n", + "def update_population(ld_pop: Column) -> Column:\n", + " return f.when(\n", + " f.size(ld_pop) == 1,\n", + " ld_pop.getItem(0).ldPopulation\n", + " )\n", + "\n", + "\n", + "# Read the JSON data from the URL.\n", + "json_data = urlopen('https://r9.finngen.fi/api/phenos').read().decode(\"utf-8\")\n", + "rdd = session.spark.sparkContext.parallelize([json_data])\n", + "df = session.spark.read.json(rdd)\n", + "\n", + "\n", + "finngen_release_prefix = 'FINNGEN_R9'\n", + "finngen_summary_stats_url_prefix = 'https://storage.googleapis.com/finngen-public-data-r9/summary_stats/finngen_R9_'\n", + "finngen_summary_stats_url_suffix = '.gz'\n", + "\n", + "# Parse the study index data.\n", + "studies = FinnGenStudyIndex.from_source(\n", + " df, \n", + " finngen_release_prefix, \n", + " finngen_summary_stats_url_prefix, \n", + " finngen_summary_stats_url_suffix\n", + ")\n", + "\n", + "studies.df.show(1, False, True)\n", + "\n", + "# From the study table we only need study identifier and the ld population\n", + "# We only need ld population if the study is based on single ancestry.\n", + "studies = (\n", + " studies.df\n", + " .select(\n", + " 'studyId',\n", + " update_population(f.col('ldPopulationStructure')).alias('ldPopulation'), \n", + " )\n", + " .distinct()\n", + " .persist()\n", + ")\n", + "\n", + "studies.show()" + ] + }, + { + "cell_type": "markdown", + "id": "6452e680", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-24T10:24:17.267975Z", + "start_time": "2023-10-24T10:24:11.432842Z" + } + }, + "source": [ + "## Reading distance and ld clumped Finngen dataset\n", + "\n", + "- Extract two random loci for prototyping purposes.\n", + "- Input dataset: 19,005 study locus from 1,387 studies." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "46e851ca", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-25T11:25:04.824517Z", + "start_time": "2023-10-25T11:25:00.848659Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 63:===================================================> (33 + 3) / 36]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+-----------------------------------------+---------------+--------------+--------------+\n", + "|studyId |variantId |pValueMantissa|pValueExponent|\n", + "+-----------------------------------------+---------------+--------------+--------------+\n", + "|FINNGEN_R9_C3_BASAL_CELL_CARCINOMA_EXALLC|15_29035680_G_A|2.076 |-21 |\n", + "|FINNGEN_R9_G6_SLEEPAPNO |16_53771295_C_A|2.149 |-26 |\n", + "+-----------------------------------------+---------------+--------------+--------------+\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "sl = StudyLocus(\n", + " _df= (\n", + " session.spark.read\n", + " .parquet('gs://genetics_etl_python_playground/XX.XX/output/python_etl/parquet/finngen/2023.10.13_ld_clumped_w_locus/')\n", + " .filter(\n", + " (f.size(f.col('qualityControls')) == 0) &\n", + " (f.size(f.col('locus')) > 100)\n", + " )\n", + " .orderBy(f.rand(seed=23))\n", + " .limit(2)\n", + " ),\n", + " _schema=StudyLocus.get_schema()\n", + ").persist()\n", + "\n", + "# Get list of leads and studies:\n", + "sl.df.select('studyId', 'variantId', 'pValueMantissa', 'pValueExponent', ).show(truncate=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "id": "661d9633", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-27T11:16:21.754731Z", + "start_time": "2023-10-27T11:16:20.553762Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+---------------+---------+---------+---------+-----------------------------------+\n", + "|studyLocusId |variantId |pValue |locusSize|ldSetSize|qualityControls |\n", + "+--------------------+---------------+---------+---------+---------+-----------------------------------+\n", + "|-6067699795164145074|15_27427129_A_G|9.592E-13|738 |35 |[] |\n", + "|-8027743839728879857|15_27983407_C_T|4.618E-61|837 |78 |[] |\n", + "|4889075444063922922 |15_28519016_G_A|2.786E-33|277 |-1 |[Variant not found in LD reference]|\n", + "|2224601896262245870 |15_29035680_G_A|2.076E-21|647 |5 |[] |\n", + "|-7676564604508510836|15_48134287_A_G|3.572E-12|442 |34 |[] |\n", + "+--------------------+---------------+---------+---------+---------+-----------------------------------+\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "# Let's get all top-loci from this study on chromosome 15:\n", + "(\n", + " session.spark.read\n", + " .parquet('gs://genetics_etl_python_playground/XX.XX/output/python_etl/parquet/finngen/2023.10.13_ld_clumped_w_locus/')\n", + " .filter(\n", + " (f.col('studyId') == 'FINNGEN_R9_C3_BASAL_CELL_CARCINOMA_EXALLC') &\n", + " (f.col('chromosome') == '15') \n", + "# f.col('ldSet').isNotNull()\n", + " )\n", + " .orderBy(f.col('position'))\n", + " .select(\n", + " 'studyLocusId',\n", + " 'variantId', \n", + " f.concat_ws('E','pValueMantissa', 'pValueExponent').alias('pValue'), \n", + "# 'studyLocusId', \n", + " f.size(f.col('locus')).alias('locusSize'),\n", + " f.size(f.col('ldSet')).alias('ldSetSize'),\n", + " f.col('qualityControls')\n", + " )\n", + "# .count()\n", + " .show(20, truncate=False)\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d101a072", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "attachments": { + "image.png": { + "image/png": "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8IseYXz/ww2TU+jEN2tzYM2N9Rs2ar+4T3TYG8mUMaNOU/r090vvvv2087bt2yVvntzGS7TtazWqS19lcunWW2+Nds6bQ1x4OsODQsFuYqpkiVf1rA7MZoGACxREUD7g9/Mv62Tt2p/1uWJFi8rjObLrffz76bo79pFP9rU3wBtmoDp27orT8t33P8rT+W88I9qR/0iABEiABEiABEiABEiABEiABEiABEiABEiABEiABJIUgfCwsLAESfCBAwcFI+whWTJnko4d2lqKCu2o/j3wQHrp3KmDOZRP535u7WOWBRbRRkc31m8wigrLg9rB4stG/v77b7OrF2iev+ALfYyZB2+/9aalqDCeoCyoX6+OOYzRFkoCI18tXWZ2re3CRV9a+zWqV7X2L1y8YHXe16ldy3K372TN+ph16DTjZJ1QO+AycMA7rhUVceFpjxf75cqW8VBUwA0mnzDTwsiZM1GmqMyxv+1vhw5Zpy8p019OKVWqhLRo3lT/cj71pPM0j0mABEiABEiABEiABEiABEiABEiABEiABEiABEiABJIYgQSbWbF7zx4LTVnVue1cLNqcfP65G+aBflp7Y80CKFUWLrihvDD+sYWZpaNHj8mYsR/Yna39HTt+tfZfr1nDq6IDHl6rXk1mzPzQ8ut2p7y6n/4DBmnvXyz8Ui3+3NtaIByzLWDCCYIZAXbzRzmyZ5elSxbpc85/ULbs3rNXr1fhPOftuH69utYi1t7OO93iwtMZVuVKFZxO+jiHbbbE3471MrxecN0Rs0eMSa4aNWtLa7Xgevny5SRH9mxawZXmttuke9fO/oLgORIgARIgARIgARIgARIgARIgARIgARIgARIgARIggSREIMGUFVhHwsjUaTPk++9/MIc+t4cPH4l2DosvY22In9TiyzC9dPC3Q9YC0tE8X3c4fORGOFmyZPHlTR5++CGf5/ydwIyQl18qrEwS/aBNQcHE0QuFnteXfLvyO+tSzJ6ISJXKOjY7UExgTYtNmzfr9TYOKlZQcsREMmfOFBPvlt/Y8LQuvr5zz913O5308e1qFouRyMhrZjfgtm6d2jJ/wUKLwfvjxgt+mBUD81KvFC8qL75QyDKnFTBAeiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEghpAhEJZQbq0KHDFgh0xG/Zus06druDNQ569OylO/S9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55RMGTP6TQlmd2xUZpKwEHPq1Kklv+q0zpw5k4dCAOaDDh8+IhERqeTJJ56Ithj32XPnZMuWrXoEP67Nkzu3pE9/vySW/PnnX7J5yxY5dOiwTke+vHmjpWfP3r1y7uw5SZs2reTIkd3jfuOS7vjgGZf4YQbs9zNn5SaVl1AUIU+NIG3bt+/QJp/++PNPfe7RRx7R/vLkzuV1QXJzLbckQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAJJh0CMzEAlndtiSkmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABJIKgUSbWZFUADGdJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACwSXgfbGB4MbJ0EmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEjAIhB+9epV64A7JEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJJDQBGgGKqGJMz4SIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEPAjQD5YGDByRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAglNgMqKhCbO+EiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABDwIUFnhgYMHJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACCU0gPDIyMqHjZHwkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkYBGgssJCwR0SIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIHEIBCmZlZwakVikGecJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACmgDXrOCDQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkkKgEwq9du5aoCWDkJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACKZtAeFhYWMomwLsnARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARJIVAJcYDtR8TNyEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABzqzgM0ACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJJCoBCIiIyMlJqagDh48KLt375YzZ87I1atXEzXxjDzuBFKlSiX33nuv5MiRQzJnzhz3ABkCCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACcSQQJhSVkS6vWb9+vVy8uRJyZMnj2TIkEHQ0U1J2gSgcDp+/Lhs2bJF30i5cuWS9g0x9SRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAkmOQLjbFGNGBRQVpUuXlkceeYSKCrfgQtwfFE7IzxIlSuiUIp8pJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJJCQBFwvsA3TT5hRwdkUCZk9CRfXTTfdpPMX+UwhARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggYQk4HqBbaxRAdNPlORLAPmLfKaQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQEIScD2zAmsbcFZFQmZNwseF/OWi6QnPnTGSAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQEon4FpZkdJB8f5JgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgASCQ8C1GajgRM9QSYAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEUjoBKitS+hPA+ycBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBRCYQnsjxM3oSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIEUToDKihT+APD2SYAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCCxCVBZkdg5wPhJgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIIIUTCI+MjEwwBIhr7969cu7cuQSJc8WKFbJw4UIrrrlz58r8+fP18enTp2X69Oly/Phx67y3neXLl8vixYu9nYqx25UrV2Tfvn1y9OhRSUjuMU5oErngjz/+lLmfzZPjJ07oFJ86dVomTpoiv//+u887cOPH58VxPIG0bt++I46h8HISIAESIAESIAESIAESIAESIAESIAESIAESIAESSH4EEkRZAQVF7dq1JW3atJI9e3a555575JFHHrEUB8HC+v7770vfvn118FevXpUaNWpI/fr19fGBAwekYcOG8uuvv/qNfsSIETJo0CC/fgKdvHTpkrRo0UJSp04t2bJl0/cOFhMmTAh0abTza9asEfxCTZYt+1oy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Z/defb5e3drWGhdY46Rundd9Kiv0BS7+QdlQsOBzlqIClzytFF45cz4lW7dt9wihqHo2jTz33LN6d/PmLVpZEegezHXckgAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJRCcQ4a1zPbq32LlgXQXIrl27XAeQNm1aD79GWfHCCy94uONgy5Yt2m3jxo0Cc05OQfy///6709nj2K4YwYlMmTLp83v27NFb+7+dO3fqw06dboy2t58/oWYA+FKQYA2Odu3a6R9G8k+aNEkvLo7ZFVhfIrZh33vvvdosFta+qF+/vk4OFi7v37+/No1lT1+o7N+eJo1HUvbt2y8dO3eVLVu3ebibgwPXTXc98vBDxklvMz76qMdxbA4QZ62aNaJdmiVzJlm9xtO012233VC6pUubTl+DxbQhge5Be+I/EiABEiABEiABEiABEiABEiABEiABEiABEiABEiABrwTCvbrGkyM66DHrwJd5JKz3MG3aNMGaE74kZ86c+hSUDujkt//MItuY6XD48OFoQTjXp4jmQTkcO3bMw/n48eP6+FEvHeFmFgMWxranw+xjPQWn4BxMNWEdBSP33HOPXsi7Zs2acvToUa1QiU3YJjzMIoFCaMeOHTJixAg5pBaHLlmypGANkKQgrdu2l337D8jokcNk9fcrZcfWjQJTUWmuKzUeUut+QDDrwi4n1XoncZUnHs8hJ9SsF6ccP35CMmfK6HT2eRzoHnxeyBMkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAISVGUF+FaqVEkvdG3WeDDMYX6qTZs20qhRI72wsnF3bo1pp23btun1F7CwNX7ffPONtaj1008/rdY3WOahsICCwNvsCGf4H3/8scdC1PPmzdNesNi2U7BOBmTNmjUeaYGSYOHChU7v+nj79u16TYuZM2dGO481JbCGBZQXMQkbMziMQGED81J//vmnNk+FtTbGjx+vT8dkRosJL6G3//33n+zctVvKlC6p15Z4WM2euEWZDVutGBvJniOb3l285CvjpLdYCNufmMXj//jjT5/esC7JunUb9LoYxtNvStmDtTDyXs9v4+5r6+YefF1LdxIgARIgARIgARIgARIgARIgARIgARIgARIgARIgAZGgLrANwCNHjpT169drM01YW6J06dJy/vx5mThxol7nAQtFw5SRLylfvrzuhK9YsaL06dNHMmfOrBUD06dPl7Fjx+rLsPYDFuBG2OisR+fx4MGDfQXp4b5q1SqpVauWVKlSRbAgeL9+/aRYsWICBYhTYCIKppZ69+6t76FgwYICZQQW+a5evbo0aNDAeYkULlxYsmfPLs2aNZMDBw7o40uXLgmUJF999ZVW2KBT3W3YWKgb61OABdhAkH6s9dG5c2e5+eabZejQodq9UKFCehvK/5BezG7AQthQDtynnoWP5syRAwd/s2ZWZMqYUS9sPUkteA2BYuc7tZj5V0uX+b21nNcXzB4/cZJcvnxJSpcqGc0/FvWe8+lcadS4qTSoX0+uXbsmkyZP0XHXfr1mNP/eHNzcg7fr6EYCJEACJEACJEACJEACJEACJEACJEACJEACJEACJBBFIAI298PCwoLGA4tXL1iwQLp27apnAGCtBghmFGAh6xYtWnjEbUbDG0esYbFkyRJp1aqVmLUicO2QIUOsa5955hm9YDWUCGbtCnTmY3YF1oOwizN8KE2mTp2qO/zhDwqAKVOmCBZwhtj9g9OECRMEC4ZDWWKUApgdMmrUKO3f+Q/XYyZG48aNdZqRbiNQ1GBtCYjbsOvVqydLly6Vvn37CkxWIf0zZsyQLl26SLly5XRYMIu1evVqueuuu/RxYvyzcwsU/+hRw6V5i9bSs1dv7bWCWoC7Tu1aMn9B1GwVsHl3yEDNyCgsoOAYNeJdad+xixW88zm+8847pWP7tjJi1HvSoVNXee7ZAtGedYTz8eyZMnzEKOnWo6cO69kCz8iwdwerRd0z62NnuHA0r4w5F+gedED6uuC9ayYObkmABEiABEiABEiABEiABEiABEiABEiABEiABEggqREIU+aYIt10LKND3CzgHNubvHLlip69kC5dOvG2JkSgcDEj4Y8//pD77rvPQ4lgv+7MmTNaEYLR7jERhItroFxxI1DynFJrJsCEU+rUqd1cotet2Lt3r9xyyy2qIzyL+Frc3E3YFy9e1PEapQoScO7cOe0GZU5sJT7yObZx//nnXyr9EdaMCm/h4Bk4f/6CUsRELXDtzY/T7YoyOXbl8mXN3XnOfnzhwkV9aF9I237ezb6be3ATDv2QAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQEoiEOFGURFfQNCxjjUCYis33XSTYNFuf+LPpJS/62I6CwEj6h944AF/QUY7ByWFt7UwnB7dhI3ZHU7BWh5JWdKlSxsw+XgG8IuJRKRKJfgFkrgoKUzYbu7B+OWWBEiABEiABEiABEiABEiABEiABEiABEiABEiABEggikDQF9gmaBIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARLwRyAcCwpTSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCCxCISbBYITKwGMlwRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIIGUTCMdizhQSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESSCwCnFmRWOQZLwmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQgCbAmRV8EEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABBKVQLiSRE0AIycBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEkjZBKipSNn5z7snARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggUQnQDNQiZ4FTAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJpGwCEWFhYSmbAO8+GoEZM2ZEc6MDCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACQSLQNi1a9ciqbAIFl6GSwIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEIgAzUAFIsTzJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACQSUQzlkVQeXLwEmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABAIQoLIiACCeJgESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCC6B8OAGz9BJgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIwD8BKiv88+FZEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBIBOgsiLIgBk8CZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZCAfwLhkZGR/n3wLAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAkEkQCVFUGEy6BJgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgAQCEwgPCwsL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BOo9A6BHQJbUewQoIQOKQL1nAPQMzpI6z2AFZFD21HsGgc/gbKn3DFZABmRPnWcA9GSypE6SARSlh9VOYS8EFqX1Y7VIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgAQinAAtFRGuIBaPBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABKKdQBxWHaeQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQEYRiOPi2hmFnvmSAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmAQJxlWSRBAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAhlGgDMrMgw9MyYBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEgABzqzgdUACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJJChBOJUMrQAzJwESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCC2CdBSEdv6Z+1JgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIIMMJ0A1UhquABSABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCB2CbABbZjW/+sPQmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAlkOAHOrMhwFbAAJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJBDbBGisiG39s/YkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkkOEE6AYqw1XAApAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAbBOgsSK29c/akwAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkECGE4jL8BKwACRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAjFNgMaKmFY/K08CJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACGU+AxoqM1wFLQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIxTSDOsqyYBsDKkwAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJZCwBGisylj9zJwESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIGYJxCXJUuWmIdAACRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAhlHgMaKjGPPnEmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABJRA3NmzZzMdiBw5cmS6MrPAmYMAr63MoafMWEpeW5lRa2krM3WeNn6Z9WzqPbNqLm3lpt7Txi+znk29Z1bNpb7c1Hnq2WXmM6n3zKy91Jedek89u8x6JnUeeZqjTiJPJ+lRojiV9MiHeZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAQAK0VATEwkASIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIH0IhB35syZ9MqL+ZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAIgJxWbNmTRTIABIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARJILwLZ0iuj9MrnyJEjcuLECbEsK72yZD6ZiECWLFkkZ86ckitXrhSXmtdWipHF1Am8tmJK3aay1Hns6Rw1pt6p95QS4PtDSolFTnze75Gji/QqCXWeXqQjKx/qPbL0kV6lod7Ti3Tk5EOdR44unJJQJw6J2PpNTu9ZtFM/pF79nTt3St68eSOC3qlTpyR79uyJyoI/g2fPnpX4+HjJli3q7DCJ6suAlBM4ffq0HDt2TLCwfCCDBa+tlDPlGTYBXluxdyVQ57Gnc9SYeqfe+f4QO9cA7/fY0bVTU+rcIRFbv9R7bOnbqS317pCInV/qPPJ0TZ1Enk7So0TJ6T2qFtjGjAoaKtLjssq8ecCIhWsE10pKhNdWSmjFZlxeW7Gnd+o89nSOGlPv1HtKCPD9ISW0Ii8u7/fI08m5LhF1fq4JR2b61Htk6uVcl4p6P9eEIy996pw6iTwCsVmi5O7FuBAnVmQKeqgLKkwhgWAEcI2k9LrntRWMKI85BHhtOSRi55c6jx1du2tKvbtpxM429R47unbXlHp304iNbeo8NvTsX0vq3Z9IbOxT77GhZ3ctqXM3jcjYpk4iQw/pXYpgeo8qY0V6g2V+JEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACaSegrvujyhNU2okwBRIgARIgARIgAQlvA4QAAEAASURBVBIgARIgARIgARIgARIgARIgARIgARIggXQlQEtFuuJmZiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAv4E4s6ePesfxn0SIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESSDcCcVmyZEm3zJgRCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACfgT4ALb/kS4TwIkQAIRSOCbb76Rq666SmBgPnPmjKeEM2bMMGEI9//s27fPE48bJEACJEACJEACJEACJEACJEACJEACJEACJBDJBLJxZkUkq4dlIwESiHUClmXJsGHDpFu3bgFR7Nmzx4T37ds30fELL7wwURgDSIAESIAESIAESIAESIAESIAESIAESIAESCASCWRDRxgNFpGoGpaJBEiABESGDBkiPXr0kFatWskFF1wgY8eO9cGC2ROlSpWSF154wSecOyRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiSQmQjEqWSm8rKsJEACJBBTBA4dOiSjRo2SN954Q+Lj4xPVHTMrChQokCicASRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiSQmQhky0yFZVlJgARIINYIPP/885IjR44kq71r1y658sorZerUqfLxxx9Lrly5pFq1atKkSRPJnj17kufxAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAlEEgEusB1J2mBZSIAESMCPQDBDBaLCWDF9+nTp1KmTnDhxQj7//HN5+OGHpU2bNj4Lcfsly10SIAESIAESIAESIAESIAESIAESIAESIAESiCgCcVyvIqL0wcKQAAmQQIoI7N69W8qVKyebNm2SBQsWyJ9//ildu3aVGTNmyNy5c1OUFiOTAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQEYR4MyKjCLPfEmABEggDAQ2btwo33//vVx11VWe1Pr162e2v/vuO08YN0iABEiABEiABEiABEiABEiABEiABEiABEggkgnQWBHJ2mHZSIAESCAIgf/++082bNggR48e9YmVM2dOsxj33r17fcK5QwIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAKRSoBuoCJVMywXCZAACSRD4OzZs3L33XdLz549fWKuXLlSjh07JpUqVfIJ5w4JkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJRCqBbFyzIlJVw3KRAAmQQHACWHy7devWMnLkSLn00kulQYMG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CZAACZAACZBAVBOgsSKq1cvKkQAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkEDkE6CxIvJ1xBKSAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQFQTiLMsK6oryMqRAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAlENgEaKyJbPywdCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACUQ9gTiVqK8kK0gCJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJBC5BGipiFzdsGQkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEBME4s6ePRsTFWUlSYAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEIpNAFjVWWFmyZEm2dDt37pT4+Phk4zECCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACaSEQDbLsiQUYwUSjRRjxalTpyR79uwpqSfjkkBIBHhthYSJkVJBgNdWKqBl8lOo80yuwFQWn3pPJbhMfhr1nskVmMriU++pBJeJT6POM7Hy0lB06j0N8DLxqdR7JlZeKotOnacS3Dk8jTo5h3AjOOm4UA0VEVwHFo0ESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCATE4jDzAoKCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACWQUgTiVjMqb+ZIACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZCA0FLBi4AESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCBDCdANVIbiZ+YkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAJcYJvXAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQIYS4MyKDMXPzEmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABGis4DVAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiSQoQToBipD8TNzEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABGit4DZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACWQogbgMzT2TZG5ZIr/tFfnzcNoLvHm/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KZLbMk4k9f4utP5Q5xbWQbycexhh/N+pU3J1jhAdqHXhZfayyy6lkcKQTdtfoc6tUEeOEbn79kWbEfB46aSkHgIJ7fNIjhAGrZ9+/tkonZHXIJTgeoOwI6HCgSA05AHNX5ExU0aTEyNUfVwXmEBC+h1huhASyC3os7NnzwhG1QcTPMYh1EsOvd9ACRqpINwXEnjfcvPNvBdFCs9RPly/I0zI5ZdfZrzlHJuZyWD97y7H+ZRHIFS/w5sCo5cRysf9Eo0+zxgbws/rUSGkD/LZFChQwC+UnHt7PIMilwVy2zD0j5vOhc+H6nPUDi/Cc+fPSZ7Y3ELOPQb6ryf2fRf72B+9XzJlzkSPGif8C5wO1+94VofHbKBk6oH6Hc0Jtc0FNjfo5mjL4V8Pm7ZiwAMlNIFw/Q49B8J4F1DbMwaPhpN/Tlv6IAxcdSfLDrct118cAuH6/OK0gntxEmCfOGmkn+l0ZaxIP93KI00oAV4IE0qO24UjwHMrHKG0t559nvb61MsRsd+9UEp7Zdjvaa9PvRwR+90LpbRVhn2etvrT69Gw372SSlvl2O9pqz+9HA373Auli1uGfXJxeaeUvUVhRB6FBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABJKLAI0VyUWe+yUBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEjAENJQpE/PxXCABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEkg+ArRUJB977pkESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESEAJRJ0/f54gSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCDZCERlyJAh2XbOHZMACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAAE2zzHCABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEkhWAvSsSFb83DkJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAA9K3gOkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJJCuBKJVkbQB3TgIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkkL4JZIhR8YLg0KFDkjVrVi9FWYYESIAESIAESIAESIAESIAESIAESIAE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yZUrV7zDQn4Idx/jMQ3PYCf+/scYwN3r7UpQDmGkcujo7HBKTnsb/iYegXD9HsmecB5kVA1DICVVJPWwbNITSGi/o4/hIXOLKhTdz5X4L5/TkG/B/uuJdVTYD0INZslyuS+kXGLVnZbrCdfnkV7jL5QV2vPj3n1yba6cfE68UJghtg/X7/v2RWuIr2sC/pcC3duxq1DbhGiKb1Wo64hdCOEjf/r5ZxNqskD+/PZi/nokEKrfkc9h1++WzuamC9D9oCnwykD0DoRzQqjxlCbRf2kISh0QW+wGy5iS0tqXmO0J1eeJuR/W5Z1AqD7BdXB/9H7JlDmTL2qA95pZMiUTyKAJuWK8KC7SgrEiJXcE25YyCIS6EKaMFrIVqZUAz63U2nMJbzf7POHsUvOW7PfU3HsJbzv7PeHsUvOW7PfU3HsJazv7PGHcUvtW7PfU3oMJaz/7PWHcUvNW7POU13vsk5TXJxejRZo7mC7kFwM090ECJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJBCYQBRcgCkkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkkFwE6FmRXOS5XxIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgAUOAnhU8EUiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABJKVgObWjkrWBnDnJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEAC6ZsALRXpu/959CRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiSQ7AQYBirZu4ANIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIH0TYAJttN3//PoSYAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCDZCdCzItm7gA0gARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggfRNgMaK9N3/PHoSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESSHYCGc6fPx+TIUOGsA05dOiQZM2aNWw5FiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBSAhk8mKosCtMKcaKM2fOSObMme1m8ZcEEo0Az61EQ8mKXAR4brmApINZ9nk66OQAh8h+DwAlHSxiv6eDTg5wiOz3AFDS+CL2eRrv4CCHx34PAiaNL2a/p/EODnB47PMAUJJ5EfskmTsgmXYflUz75W5JgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIwBCgsYInAgmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQLISoLEiWfFz5yRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAlExMTGkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQALJRoDGimRDzx2TAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmAQFSGDBlIggRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgASSjQCNFcmGnjsmARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIAgajz58+TBAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAkkG4EolWTbOXdMAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAArRU8BwgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARJIVgJR586dS9YGcOckQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQALpm0BUxowZ0zcBHj0JkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkECyEmAYqGTFz52TAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAnQWMFzgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIIFkJ0FiRrPi5cxIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggaiYmBhSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIFkI0BjRbKh545JgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARA4P/YeNeOUSE9MQAAAABJRU5ErkJggg==" + } + }, + "cell_type": "markdown", + "id": "9db8b8ab", + "metadata": {}, + "source": [ + "## Comparing with Finngen finemapping.\n", + "\n", + "The same [trait](https://r9.finngen.fi/pheno/C3_BASAL_CELL_CARCINOMA_EXALLC) has 3 finemapped credible sets.\n", + "\n", + "![image.png](attachment:image.png)\n", + "\n", + "- `15:27983407:C:T` and `15:27985172:C:T` are very close, I could find `27983407`.\n", + "- Also `15_48134287_A_G` is found by both approach.\n", + "- One of the other three snps was not found in the LD set (`15_28519016_G_A`). \n", + "- `15_27427129_A_G` and `15_29035680_G_A` were resolved in the LD matrix, and were found to be not linked. But they are not in the.\n", + "\n", + "What are the r between these variants?\n", + "\n", + "- 15_27983407_C_T vs 15_27427129_A_G -> r = \n", + "- 15_27983407_C_T vs 15_29035680_G_A -> r =" + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "id": "d8da5802", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-27T10:19:25.494510Z", + "start_time": "2023-10-27T10:19:23.020596Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+---------------+---------+---------+---------+---------------+----------+--------+--------+------------+\n", + "| variantId| pValue|locusSize|ldSetSize|qualityControls|chromosome|position| idx|ldPopulation|\n", + "+---------------+---------+---------+---------+---------------+----------+--------+--------+------------+\n", + "|15_27427129_A_G|9.592E-13| 738| 35| []| 15|27427129|11130387| fin|\n", + "|15_27983407_C_T|4.618E-61| 837| 78| []| 15|27983407|11133253| fin|\n", + "|15_29035680_G_A|2.076E-21| 647| 5| []| 15|29035680|11136878| fin|\n", + "+---------------+---------+---------+---------+---------------+----------+--------+--------+------------+\n", + "\n" + ] + } + ], + "source": [ + "# Extracting and resolving ld:\n", + "resolved_ld_index = (\n", + " session.spark.read\n", + " .parquet('gs://genetics_etl_python_playground/XX.XX/output/python_etl/parquet/finngen/2023.10.13_ld_clumped_w_locus/')\n", + " .filter(\n", + " (f.col('studyId') == 'FINNGEN_R9_C3_BASAL_CELL_CARCINOMA_EXALLC') &\n", + " f.col('variantId').isin(['15_27983407_C_T', '15_27427129_A_G', '15_29035680_G_A'])\n", + " )\n", + " .orderBy(f.col('position'))\n", + " .select(\n", + " 'variantId', \n", + " f.concat_ws('E','pValueMantissa', 'pValueExponent').alias('pValue'), \n", + "# 'studyLocusId', \n", + " f.size(f.col('locus')).alias('locusSize'),\n", + " f.size(f.col('ldSet')).alias('ldSetSize'),\n", + " f.col('qualityControls')\n", + " )\n", + "# .count()\n", + " .join(ld_index, on = 'variantId', how='left')\n", + " .persist()\n", + ")\n", + "\n", + "resolved_ld_index.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "id": "722eb21d", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-27T10:24:03.123125Z", + "start_time": "2023-10-27T10:23:32.607310Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-10-27 10:23:48.619 Hail: INFO: Coerced sorted dataset \n", + "[Stage 942:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+---+---+------------------+\n", + "|i |j |entry |\n", + "+---+---+------------------+\n", + "|0 |0 |2.0000000000000084|\n", + "|0 |1 |0.4201370447477838|\n", + "|0 |2 |0.0 |\n", + "|1 |0 |0.4201370447477838|\n", + "|1 |1 |2.0000000000000004|\n", + "|1 |2 |0.0 |\n", + "|2 |0 |0.0 |\n", + "|2 |1 |0.0 |\n", + "|2 |2 |1.9999999999999996|\n", + "+---+---+------------------+\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "# Accessing r data from the LD matrix:\n", + "half_matrix = (\n", + " BlockMatrix\n", + " .read(ld_matrix_template.format(POP=ld_population))\n", + " .filter(\n", + " [row['idx'] for row in resolved_ld_index.select('idx').collect()],\n", + " [row['idx'] for row in resolved_ld_index.select('idx').collect()]\n", + " )\n", + ")\n", + "\n", + "# matrix = half_matrix + half_matrix.T\n", + "matrix.entries().to_spark().show(100, truncate=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "id": "c316e0d0", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-27T11:18:11.801945Z", + "start_time": "2023-10-27T11:18:06.718163Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+---------------+----------+--------------------+--------------------+--------+--------+---------+--------------------------------+--------------------------------+---------------------------+---------------------------+--------------+--------------+-------------------------------+-------------+-------------------+---------------+-----------------+--------------------+--------------------+\n", + "| variantId|chromosome| studyId| studyLocusId|position| beta|oddsRatio|oddsRatioConfidenceIntervalLower|oddsRatioConfidenceIntervalUpper|betaConfidenceIntervalLower|betaConfidenceIntervalUpper|pValueMantissa|pValueExponent|effectAlleleFrequencyFromSource|standardError|subStudyDescription|qualityControls|finemappingMethod| locus| ldSet|\n", + "+---------------+----------+--------------------+--------------------+--------+--------+---------+--------------------------------+--------------------------------+---------------------------+---------------------------+--------------+--------------+-------------------------------+-------------+-------------------+---------------+-----------------+--------------------+--------------------+\n", + "|15_27983407_C_T| 15|FINNGEN_R9_C3_BAS...|-8027743839728879857|27983407|0.413866| null| null| null| 0.388762| 0.43897| 4.618| -61| 0.0443583| 0.025104| null| []| null|[{null, null, nul...|[{15_28482553_T_C...|\n", + "+---------------+----------+--------------------+--------------------+--------+--------+---------+--------------------------------+--------------------------------+---------------------------+---------------------------+--------------+--------------+-------------------------------+-------------+-------------------+---------------+-----------------+--------------------+--------------------+\n", + "\n" + ] + } + ], + "source": [ + "study_locus_id = -8027743839728879857\n", + "\n", + "# Running susie for a specific study locus:\n", + "sl = StudyLocus(\n", + " _df= (\n", + " session.spark.read\n", + " .parquet('gs://genetics_etl_python_playground/XX.XX/output/python_etl/parquet/finngen/2023.10.13_ld_clumped_w_locus/')\n", + " .filter(f.col('studyLocusId') == study_locus_id)\n", + " ),\n", + " _schema=StudyLocus.get_schema()\n", + ").persist()\n", + "\n", + "sl.df.show()" + ] + }, + { + "cell_type": "markdown", + "id": "947d112a", + "metadata": {}, + "source": [ + "## Annotating study locus with ld population + Get list of ancestires" + ] + }, + { + "cell_type": "code", + "execution_count": 154, + "id": "8be0fd89", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-27T11:20:59.482466Z", + "start_time": "2023-10-27T11:20:59.062418Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0------------------------------------------------\n", + " studyId | FINNGEN_R9_C3_BAS... \n", + " variantId | 15_27983407_C_T \n", + " chromosome | 15 \n", + " studyLocusId | -8027743839728879857 \n", + " position | 27983407 \n", + " beta | 0.413866 \n", + " oddsRatio | null \n", + " oddsRatioConfidenceIntervalLower | null \n", + " oddsRatioConfidenceIntervalUpper | null \n", + " betaConfidenceIntervalLower | 0.388762 \n", + " betaConfidenceIntervalUpper | 0.43897 \n", + " pValueMantissa | 4.618 \n", + " pValueExponent | -61 \n", + " effectAlleleFrequencyFromSource | 0.0443583 \n", + " standardError | 0.025104 \n", + " subStudyDescription | null \n", + " qualityControls | [] \n", + " finemappingMethod | null \n", + " locus | [{null, null, nul... \n", + " ldSet | [{15_28482553_T_C... \n", + " ldPopulation | fin \n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "['fin']" + ] + }, + "execution_count": 154, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Adding ld population to study locus:\n", + "dl_df = (\n", + " sl.df\n", + " .join(studies, on='studyId', how='left')\n", + " .persist()\n", + ")\n", + "\n", + "dl_df.show(1, vertical=True)\n", + "\n", + "# Extract the required ld populations:\n", + "ld_populations = [row['ldPopulation'] for row in dl_df.select('ldPopulation').distinct().collect()]\n", + "\n", + "ld_populations" + ] + }, + { + "cell_type": "markdown", + "id": "b69aad94", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-24T10:34:37.443692Z", + "start_time": "2023-10-24T10:34:37.436917Z" + } + }, + "source": [ + "## Read ld index" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "id": "5465b9d3", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-27T11:21:03.778148Z", + "start_time": "2023-10-27T11:21:03.770967Z" + }, + "code_folding": [ + 2 + ] + }, + "outputs": [], + "source": [ + "from otg.common.utils import _liftover_loci, convert_gnomad_position_to_ensembl\n", + "\n", + "def _process_ld_indices(\n", + " ld_index_raw: hl.Table, \n", + " grch37_to_grch38_chain_path: str\n", + ") -> DataFrame:\n", + " \"\"\"Creates a look up table between variants and their coordinates in the LD Matrix.\n", + "\n", + " !!! info \"Gnomad's LD Matrix and Index are based on GRCh37 coordinates. This function will lift over the coordinates to GRCh38 to build the lookup table.\"\n", + "\n", + " Args:\n", + " ld_index_raw (hl.Table): LD index table from GnomAD\n", + " grch37_to_grch38_chain_path (str): Path to the chain file used to lift over the coordinates\n", + "\n", + " Returns:\n", + " DataFrame: Look up table between variants in build hg38 and their coordinates in the LD Matrix\n", + " \"\"\"\n", + " ld_index_38 = _liftover_loci(\n", + " ld_index_raw, grch37_to_grch38_chain_path, \"GRCh38\"\n", + " )\n", + "\n", + " return (\n", + " ld_index_38.to_spark()\n", + " # Filter out variants where the liftover failed\n", + " .filter(f.col(\"`locus_GRCh38.position`\").isNotNull())\n", + " .withColumn(\n", + " \"chromosome\", f.regexp_replace(\"`locus_GRCh38.contig`\", \"chr\", \"\")\n", + " )\n", + " # Temporary filter:\n", + " .filter(f.col('chromosome').isin(['16', '15']))\n", + " .withColumn(\n", + " \"position\",\n", + " convert_gnomad_position_to_ensembl(\n", + " f.col(\"`locus_GRCh38.position`\"),\n", + " f.col(\"`alleles`\").getItem(0),\n", + " f.col(\"`alleles`\").getItem(1),\n", + " ),\n", + " )\n", + " .select(\n", + " \"chromosome\",\n", + " \"position\",\n", + " f.concat_ws(\n", + " \"_\",\n", + " f.col(\"chromosome\"),\n", + " f.col(\"position\"),\n", + " f.col(\"`alleles`\").getItem(0),\n", + " f.col(\"`alleles`\").getItem(1),\n", + " ).alias(\"variantId\"),\n", + " f.col(\"idx\"),\n", + " )\n", + " # Filter out ambiguous liftover results: multiple indices for the same variant\n", + " .withColumn(\"count\", f.count(\"*\").over(Window.partitionBy([\"variantId\"])))\n", + " .filter(f.col(\"count\") == 1)\n", + " .drop(\"count\")\n", + " )\n" + ] + }, + { + "cell_type": "markdown", + "id": "15eab28a", + "metadata": {}, + "source": [ + "- Full genome: 5min" + ] + }, + { + "cell_type": "code", + "execution_count": 156, + "id": "e231cc9a", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-27T11:25:47.523343Z", + "start_time": "2023-10-27T11:21:07.729708Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 975:=================================================>(9996 + 4) / 10000]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+----------+---------+--------------------+--------+------------+\n", + "|chromosome| position| variantId| idx|ldPopulation|\n", + "+----------+---------+--------------------+--------+------------+\n", + "| 15|100068435| 15_100068435_C_T|11488485| fin|\n", + "| 15|100074914| 15_100074914_T_C|11488528| fin|\n", + "| 15|100082112| 15_100082112_C_G|11488600| fin|\n", + "| 15|100084933| 15_100084933_C_T|11488622| fin|\n", + "| 15|100086055| 15_100086055_C_T|11488643| fin|\n", + "| 15|100102338|15_100102338_CGAA...|11488802| fin|\n", + "| 15|100102474| 15_100102474_A_G|11488806| fin|\n", + "| 15|100140453| 15_100140453_G_GAC|11489087| fin|\n", + "| 15|100141050| 15_100141050_G_A|11489092| fin|\n", + "| 15|100149133| 15_100149133_G_T|11489141| fin|\n", + "| 15|100270659| 15_100270659_G_A|11490053| fin|\n", + "| 15|100317282| 15_100317282_T_C|11490464| fin|\n", + "| 15|100376040| 15_100376040_ACTT_A|11490958| fin|\n", + "| 15|100391254| 15_100391254_CA_C|11491027| fin|\n", + "| 15|100394474| 15_100394474_T_C|11491043| fin|\n", + "| 15|100466861| 15_100466861_T_C|11491614| fin|\n", + "| 15|100516200| 15_100516200_T_C|11492028| fin|\n", + "| 15|100525848| 15_100525848_T_G|11492086| fin|\n", + "| 15|100588385| 15_100588385_A_T|11492713| fin|\n", + "| 15|100605649| 15_100605649_A_T|11492813| fin|\n", + "+----------+---------+--------------------+--------+------------+\n", + "only showing top 20 rows\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "grch37_to_grch38_chain_path = 'gs://hail-common/references/grch37_to_grch38.over.chain.gz'\n", + "ld_index_raw_template = 'gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.ld.variant_indices.ht'\n", + "ld_matrix_template ='gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.adj.ld.bm'\n", + "\n", + "\n", + "ld_population = 'fin'\n", + "ld_index_raw_path = ld_index_raw_template.format(POP=ld_population)\n", + "\n", + "ld_index = (\n", + " _process_ld_indices(\n", + " hl.read_table(ld_index_raw_path),\n", + " grch37_to_grch38_chain_path,\n", + " )\n", + " .withColumn('ldPopulation', f.lit(ld_population))\n", + " .persist()\n", + ")\n", + "\n", + "ld_index.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 157, + "id": "e43d0dbf", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-27T11:26:04.794300Z", + "start_time": "2023-10-27T11:26:04.691498Z" + } + }, + "outputs": [], + "source": [ + "# how to do the join?\n", + "window_size = 250_000\n", + "tags = (\n", + " # Pre-process study locus:\n", + " f.broadcast(dl_df)\n", + " .select('studyLocusId', 'chromosome', 'position', 'ldPopulation')\n", + " .alias('study_locus')\n", + " .join(\n", + " (\n", + " ld_index\n", + " .selectExpr(*[f\"{col} as ld_index_{col}\" for col in ld_index.columns])\n", + " .alias('ld_index')\n", + " ),\n", + " on = [\n", + " (f.col('ld_index.ld_index_chromosome') == f.col('study_locus.chromosome')) & \n", + " (f.col('ld_index.ld_index_ldPopulation') == f.col('study_locus.ldPopulation')) &\n", + " (f.col('ld_index.ld_index_position') >= f.col('study_locus.position') - window_size) & \n", + " (f.col('ld_index.ld_index_position') <= f.col('study_locus.position') + window_size)\n", + " ],\n", + " how='left'\n", + " )\n", + " .select(\n", + " 'studyLocusId',\n", + " 'chromosome',\n", + " f.col('ld_index_variantId').alias('variantId'),\n", + " f.col('ld_index_idx').alias('idx'),\n", + " f.col('ld_index_position'),\n", + " f.col('ld_index_ldPopulation').alias('ldPopulation')\n", + " )\n", + " .persist()\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 158, + "id": "45fb0df5", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-27T11:26:08.409160Z", + "start_time": "2023-10-27T11:26:06.312358Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 979:============================================> (173 + 27) / 200]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+-----+\n", + "| studyLocusId|count|\n", + "+--------------------+-----+\n", + "|-8027743839728879857| 2079|\n", + "+--------------------+-----+\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "tags.groupby('studyLocusId').count().show()" + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "id": "858894fc", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-27T11:26:14.204291Z", + "start_time": "2023-10-27T11:26:12.440937Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+----------+--------------+-------------+-------------+---------+--------+--------------+\n", + "|studyLocusId |chromosome|first_position|last_position|window_length|first_idx|last_idx|ldVariantCount|\n", + "+--------------------+----------+--------------+-------------+-------------+---------+--------+--------------+\n", + "|-8027743839728879857|15 |27733460 |28232552 |499092 |11131979 |11134057|2079 |\n", + "+--------------------+----------+--------------+-------------+-------------+---------+--------+--------------+\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 159, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Collecting region:\n", + "ld_windows = (\n", + " tags\n", + " .orderBy('studyLocusId', 'ld_index_position')\n", + " .groupBy('studyLocusId', 'chromosome', 'ldPopulation')\n", + " .agg(\n", + " f.first(f.col('ld_index_position')).alias('first_position'),\n", + " f.first(f.col('variantId')).alias('first_variantId'),\n", + " f.first(f.col('idx')).alias('first_idx'),\n", + " f.last(f.col('ld_index_position')).alias('last_position'),\n", + " f.last(f.col('variantId')).alias('last_variantId'),\n", + " f.last(f.col('idx')).alias('last_idx'),\n", + " f.size(f.collect_list(f.col('variantId'))).alias('ldVariantCount')\n", + " )\n", + " .withColumn('window_length', f.col('last_position') - f.col('first_position'))\n", + " .persist()\n", + ")\n", + "\n", + "(\n", + " ld_windows\n", + " .select(\n", + " 'studyLocusId',\n", + " 'chromosome',\n", + " 'first_position',\n", + " 'last_position',\n", + " 'window_length',\n", + " 'first_idx',\n", + " 'last_idx',\n", + " 'ldVariantCount'\n", + " )\n", + " .show(truncate=False)\n", + ")\n", + "\n", + "\n", + "ld_windows.count()" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "id": "61d51efe", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-27T11:26:22.608155Z", + "start_time": "2023-10-27T11:26:22.421535Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Row(studyLocusId=-8027743839728879857, chromosome='15', ldPopulation='fin', first_position=27733460, first_variantId='15_27733460_AGCCAAACTGGCTCATGGCC_A', first_idx=11131979, last_position=28232552, last_variantId='15_28232552_G_GA', last_idx=11134057, ldVariantCount=2079, window_length=499092)" + ] + }, + "execution_count": 160, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "row = ld_windows.collect()[0]\n", + "row" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "id": "d4d006bd", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-27T11:26:31.400420Z", + "start_time": "2023-10-27T11:26:30.851547Z" + } + }, + "outputs": [], + "source": [ + "ld_population = row['ldPopulation']\n", + "study_locus_id = row['studyLocusId']\n", + "chromosome = row['chromosome']\n", + "first_index = row['first_idx']\n", + "last_index = row['last_idx']\n", + "\n", + "# For each row, we need to open the gnomad \n", + "half_matrix = (\n", + " BlockMatrix\n", + " .read(ld_matrix_template.format(POP=ld_population))\n", + " .filter(\n", + " range(first_index, last_index),\n", + " range(first_index, last_index)\n", + " )\n", + ")\n", + "\n", + "matrix = half_matrix + half_matrix.T\n" + ] + }, + { + "cell_type": "code", + "execution_count": 162, + "id": "e24da4ca", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-27T11:27:24.435664Z", + "start_time": "2023-10-27T11:26:35.945855Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-10-27 11:26:58.169 Hail: INFO: Coerced sorted dataset \n", + " \r" + ] + } + ], + "source": [ + "(\n", + " matrix.entries().to_spark()\n", + " .select(\n", + " (f.col('i')+first_index).alias('idx_i'),\n", + " (f.col('j')+first_index).alias('idx_j'),\n", + " f.when(f.col('i') == f.col('j'), f.col('entry')/2).otherwise(f.col('entry')).alias('r'),\n", + " f.lit(study_locus_id).alias('study_locus_ids')\n", + " )\n", + " # Joining with i:\n", + " .join(\n", + " (\n", + " tags\n", + " .select(\n", + " f.col('variantId').alias('variantIdLeft'), \n", + " f.col('idx').alias('idx_i')\n", + " )\n", + " ), \n", + " on='idx_i', how='outer'\n", + " )\n", + " # Joining with i:\n", + " .join(\n", + " (\n", + " tags\n", + " .select(\n", + " 'chromosome', \n", + " f.col('variantId').alias('variantIdRight'), \n", + " f.col('idx').alias('idx_j')\n", + " )\n", + " ), \n", + " on='idx_j', how='outer'\n", + " )\n", + " .select(\n", + " 'variantIdLeft',\n", + " 'variantIdRight',\n", + " 'study_locus_ids',\n", + " 'r'\n", + " )\n", + " .distinct()\n", + " .write.mode('overwrite').parquet(f'gs://ot-team/dsuveges/ld_matrix-{study_locus_id}')\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 164, + "id": "3cb94848", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-27T11:28:28.344710Z", + "start_time": "2023-10-27T11:28:27.670811Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0---------------------------------------------------\n", + " studyId | FINNGEN_R9_C3_BASAL_CELL_CARCINOMA_EXALLC \n", + " variantIdLead | 15_27983407_C_T \n", + " studyLocusId | -8027743839728879857 \n", + " variantId | 15_27733459_AGCCAAACTGGCTCATGGCC_A \n", + " pValueMantissa | 1.937 \n", + " pValueExponent | -2 \n", + " beta | 0.0267247 \n", + " standardError | 0.011429 \n", + "only showing top 1 row\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "837" + ] + }, + "execution_count": 164, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "study_locus_id = -8027743839728879857\n", + "\n", + "# Get data:\n", + "ld_matrix = session.spark.read.parquet(f'gs://ot-team/dsuveges/ld_matrix-{study_locus_id}')\n", + "\n", + "# Select one study locus:\n", + "selected_locus = (\n", + " dl_df\n", + " .filter(f.col('studyLocusId') == study_locus_id)\n", + " .select(\n", + " '*',\n", + " f.explode_outer('locus').alias('exploded_locus')\n", + " )\n", + " .select(\n", + " 'studyId',\n", + " f.col('variantId').alias('variantIdLead'),\n", + " f.col('studyLocusId'),\n", + " *[f'exploded_locus.{col}' for col in ['variantId', 'pValueMantissa', 'pValueExponent', 'beta', 'standardError']]\n", + " )\n", + " .persist()\n", + ")\n", + "\n", + "selected_locus.show(1, False, True)\n", + "selected_locus.count()" + ] + }, + { + "cell_type": "code", + "execution_count": 189, + "id": "0e571433", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-27T13:49:41.356331Z", + "start_time": "2023-10-27T13:49:40.463119Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+--------------------+---------------+---------------+---------------+-------------------+-------------------+----------+------------------+--------------------+\n", + "| studyId| studyLocusId| variantIdLead| variantIdLeft| variantIdRight|pValueMantissaRight|pValueExponentRight| betaRight|standardErrorRight| r|\n", + "+--------------------+--------------------+---------------+---------------+---------------+-------------------+-------------------+----------+------------------+--------------------+\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27792793_C_T|15_27772290_T_C| 9.979| -6| 0.0730063| 0.0165261| 0.3188276023578284|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27950388_C_T|15_27778556_C_T| 1.142| -2| 0.119731| 0.0473309| -0.1845689041174883|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_28104601_A_T|15_27809200_G_A| 1.397| -2|-0.0286999| 0.0116763| 0.01919714154020592|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27970325_G_A|15_27809200_G_A| 1.397| -2|-0.0286999| 0.0116763|-0.12413267238343029|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27899878_T_C|15_27851307_A_G| 5.606| -4|-0.0424098| 0.0122927|-0.45516734696600447|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27914364_C_T|15_27851307_A_G| 5.606| -4|-0.0424098| 0.0122927| -0.4029686644067302|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27828335_G_A|15_27858692_G_A| 3.599| -4| 0.0427448| 0.0119804| 0.09141477739652863|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27845815_A_G|15_27858692_G_A| 3.599| -4| 0.0427448| 0.0119804| 0.7803430284267874|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27820229_G_A|15_27858692_G_A| 3.599| -4| 0.0427448| 0.0119804|-0.08881336794530735|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27825631_G_C|15_27915426_C_A| 1.001| -6| 0.0654293| 0.0133765| 0.13879209804155437|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_28211160_A_T|15_27915426_C_A| 1.001| -6| 0.0654293| 0.0133765| 0.05996001018362227|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_28019021_G_T|15_27915426_C_A| 1.001| -6| 0.0654293| 0.0133765| 0.03843623265438152|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_28081390_A_T|15_27938863_T_A| 2.109| -3| 0.157002| 0.0510665|-0.04189151880774...|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27907664_A_T|15_27938914_G_T| 2.725| -2| 0.0355862| 0.0161172|-0.16859090364294946|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27819940_C_T|15_27938914_G_T| 2.725| -2| 0.0355862| 0.0161172| 0.11697321459267764|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27853556_T_G|15_27938914_G_T| 2.725| -2| 0.0355862| 0.0161172| -0.1404576556679461|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_28052911_T_C|15_27951206_G_A| 1.437| -2| 0.0695541| 0.0284131| 0.04461220378655805|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27790520_G_A|15_27951206_G_A| 1.437| -2| 0.0695541| 0.0284131| 0.04420892575950266|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27879868_C_A|15_27989264_G_T| 2.454| -17| 0.147291| 0.0173896| 0.2404542405419156|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27822551_G_A|15_27989264_G_T| 2.454| -17| 0.147291| 0.0173896|-0.04613729472121665|\n", + "+--------------------+--------------------+---------------+---------------+---------------+-------------------+-------------------+----------+------------------+--------------------+\n", + "only showing top 20 rows\n", + "\n", + "385641\n", + "621.0\n" + ] + }, + { + "data": { + "text/plain": [ + "621" + ] + }, + "execution_count": 189, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Filtering matrix:\n", + "processed_matrix = (\n", + " ld_matrix\n", + " .join(\n", + " selected_locus.select(f.col('variantId').alias('variantIdLeft')),\n", + " on='variantIdLeft', how='inner'\n", + " )\n", + " .join(\n", + " selected_locus.withColumnRenamed('variantId', 'variantIdRight'), \n", + " on='variantIdRight', how='inner'\n", + " )\n", + " .select(\n", + " 'studyId',\n", + " 'studyLocusId',\n", + " 'variantIdLead',\n", + " 'variantIdLeft',\n", + " 'variantIdRight',\n", + " f.col('pValueMantissa').alias('pValueMantissaRight'),\n", + " f.col('pValueExponent').alias('pValueExponentRight'),\n", + " f.col('beta').alias('betaRight'),\n", + " f.col('standardError').alias('standardErrorRight'),\n", + " 'r'\n", + " )\n", + " .persist()\n", + ")\n", + "\n", + "processed_matrix.show()\n", + "print(processed_matrix.count())\n", + "print(sqrt(processed_matrix.count()))\n", + "processed_matrix.select('variantIdRight').distinct().count()" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "id": "381f093b", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-27T11:29:01.779404Z", + "start_time": "2023-10-27T11:28:57.285168Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "array([[1. , 0.88019644, 0.28333008, 0.25666969, 0.26345801],\n", + " [0.88019644, 1. , 0.26027515, 0.24115952, 0.2442993 ],\n", + " [0.28333008, 0.26027515, 1. , 0.85898573, 0.89168227],\n", + " [0.25666969, 0.24115952, 0.85898573, 1. , 0.96268566],\n", + " [0.26345801, 0.2442993 , 0.89168227, 0.96268566, 1. ]])" + ] + }, + "execution_count": 167, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "pivoted_matrix = (\n", + " processed_matrix\n", + " .orderBy(f.col('variantIdLeft'), f.col('variantIdRight'))\n", + " .groupBy('variantIdLeft')\n", + " .pivot(\"variantIdRight\")\n", + " .agg(f.first('r'))\n", + " .orderBy('variantIdLeft')\n", + " # Convert to numpy array ingested by SuSie:\n", + " .toPandas().set_index('variantIdLeft').to_numpy()\n", + ")\n", + "\n", + "pivoted_matrix[0:5, 0:5]" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "444e2ca2", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-26T08:49:13.002374Z", + "start_time": "2023-10-26T08:49:12.604741Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 1. , 0.99851182, 0.85089485, ..., 0.04532387,\n", + " 0.02258468, 0.02476075],\n", + " [ 0.99851182, 1. , 0.85111292, ..., 0.0465783 ,\n", + " 0.02253374, 0.02470884],\n", + " [ 0.85089485, 0.85111292, 1. , ..., 0.04748182,\n", + " 0.01191697, 0.01652519],\n", + " ...,\n", + " [ 0.04532387, 0.0465783 , 0.04748182, ..., 1. ,\n", + " -0.05908013, -0.05417476],\n", + " [ 0.02258468, 0.02253374, 0.01191697, ..., -0.05908013,\n", + " 1. , 0.96019982],\n", + " [ 0.02476075, 0.02470884, 0.01652519, ..., -0.05417476,\n", + " 0.96019982, 1. ]])" + ] + }, + "execution_count": 90, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pivoted_matrix.toPandas().set_index('variantIdLeft').to_numpy()" + ] + }, + { + "cell_type": "code", + "execution_count": 190, + "id": "8ed590f1", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-27T13:50:01.812451Z", + "start_time": "2023-10-27T13:49:58.985895Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "(\n", + " processed_matrix\n", + " # Convert to numpy array ingested by SuSie:\n", + " .write.mode('overwrite').parquet(f'gs://ot-team/dsuveges/processed-ld-matrix-{study_locus_id}')\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "id": "5fc2f7ac", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-27T11:30:11.297300Z", + "start_time": "2023-10-27T11:30:09.400659Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "# selected_locus.write.mode('overwrite').parquet('gs://ot-team/dsuveges/selected_studyLocus_2224601896262245870')\n", + "(\n", + " processed_matrix\n", + " .select(\n", + " 'studyId',\n", + " f.col('variantIdRight').alias('variantId'),\n", + " f.col('pValueMantissaRight').alias('pValueMantissa'),\n", + " f.col('pValueExponentRight').alias('pValueExponent'),\n", + " f.col('betaRight').alias('beta'),\n", + " f.col('standardErrorRight').alias('standardError'),\n", + " )\n", + " .distinct()\n", + " .write.mode('overwrite').parquet(f'gs://ot-team/dsuveges/selected_studyLocus_{study_locus_id}')\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 187, + "id": "a4d47348", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-27T13:33:39.686914Z", + "start_time": "2023-10-27T13:33:39.682284Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.00, 0.18, 0.18, 0.97, 0.97, 0.15, 0.18, 0.11, 0.13, 0.12\n", + "0.18, 1.00, 0.99, 0.15, 0.15, 0.03, 0.03, 0.02, 0.01, 0.02\n", + "0.18, 0.99, 1.00, 0.15, 0.15, 0.03, 0.03, 0.02, 0.01, 0.02\n", + "0.97, 0.15, 0.15, 1.00, 1.00, 0.14, 0.17, 0.11, 0.12, 0.12\n", + "0.97, 0.15, 0.15, 1.00, 1.00, 0.14, 0.17, 0.11, 0.12, 0.12\n", + "0.15, 0.03, 0.03, 0.14, 0.14, 1.00, 0.32, 0.45, 0.50, 0.25\n", + "0.18, 0.03, 0.03, 0.17, 0.17, 0.32, 1.00, 0.29, 0.33, 0.52\n", + "0.11, 0.02, 0.02, 0.11, 0.11, 0.45, 0.29, 1.00, 0.91, 0.29\n", + "0.13, 0.01, 0.01, 0.12, 0.12, 0.50, 0.33, 0.91, 1.00, 0.33\n", + "0.12, 0.02, 0.02, 0.12, 0.12, 0.25, 0.52, 0.29, 0.33, 1.00\n" + ] + } + ], + "source": [ + "print(\n", + " '\\n'.join(\n", + " [\n", + " ', '.join([f'{value**2:.2f}' for value in row]) \n", + " for row in\n", + " (\n", + " pivoted_matrix\n", + " [[291, 293, 295, 322, 323, 508, 514, 529, 534, 515]]\n", + " [:,[291, 293, 295, 322, 323, 508, 514, 529, 534, 515]]\n", + " )\n", + " ]\n", + " )\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 188, + "id": "f3910534", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-27T13:45:22.792801Z", + "start_time": "2023-10-27T13:45:22.721043Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+--------------------+---------------+---------------+---------------+-------------------+-------------------+----------+------------------+--------------------+\n", + "| studyId| studyLocusId| variantIdLead| variantIdLeft| variantIdRight|pValueMantissaRight|pValueExponentRight| betaRight|standardErrorRight| r|\n", + "+--------------------+--------------------+---------------+---------------+---------------+-------------------+-------------------+----------+------------------+--------------------+\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27792793_C_T|15_27772290_T_C| 9.979| -6| 0.0730063| 0.0165261| 0.3188276023578284|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27950388_C_T|15_27778556_C_T| 1.142| -2| 0.119731| 0.0473309| -0.1845689041174883|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_28104601_A_T|15_27809200_G_A| 1.397| -2|-0.0286999| 0.0116763| 0.01919714154020592|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27970325_G_A|15_27809200_G_A| 1.397| -2|-0.0286999| 0.0116763|-0.12413267238343029|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27899878_T_C|15_27851307_A_G| 5.606| -4|-0.0424098| 0.0122927|-0.45516734696600447|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27914364_C_T|15_27851307_A_G| 5.606| -4|-0.0424098| 0.0122927| -0.4029686644067302|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27828335_G_A|15_27858692_G_A| 3.599| -4| 0.0427448| 0.0119804| 0.09141477739652863|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27845815_A_G|15_27858692_G_A| 3.599| -4| 0.0427448| 0.0119804| 0.7803430284267874|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27820229_G_A|15_27858692_G_A| 3.599| -4| 0.0427448| 0.0119804|-0.08881336794530735|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27825631_G_C|15_27915426_C_A| 1.001| -6| 0.0654293| 0.0133765| 0.13879209804155437|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_28211160_A_T|15_27915426_C_A| 1.001| -6| 0.0654293| 0.0133765| 0.05996001018362227|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_28019021_G_T|15_27915426_C_A| 1.001| -6| 0.0654293| 0.0133765| 0.03843623265438152|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_28081390_A_T|15_27938863_T_A| 2.109| -3| 0.157002| 0.0510665|-0.04189151880774...|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27907664_A_T|15_27938914_G_T| 2.725| -2| 0.0355862| 0.0161172|-0.16859090364294946|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27819940_C_T|15_27938914_G_T| 2.725| -2| 0.0355862| 0.0161172| 0.11697321459267764|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27853556_T_G|15_27938914_G_T| 2.725| -2| 0.0355862| 0.0161172| -0.1404576556679461|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_28052911_T_C|15_27951206_G_A| 1.437| -2| 0.0695541| 0.0284131| 0.04461220378655805|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27790520_G_A|15_27951206_G_A| 1.437| -2| 0.0695541| 0.0284131| 0.04420892575950266|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27879868_C_A|15_27989264_G_T| 2.454| -17| 0.147291| 0.0173896| 0.2404542405419156|\n", + "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27822551_G_A|15_27989264_G_T| 2.454| -17| 0.147291| 0.0173896|-0.04613729472121665|\n", + "+--------------------+--------------------+---------------+---------------+---------------+-------------------+-------------------+----------+------------------+--------------------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "processed_matrix.show()" + ] + } + ], + "metadata": { + "_draft": { + "nbviewer_url": "https://gist.github.com/DSuveges/df6768b7d5637842e009aa945f3ea062" + }, + "gist": { + "data": { + "description": "Issue-3131-Productionizing_LD_matrix.ipynb", + "public": false + }, + "id": "df6768b7d5637842e009aa945f3ea062" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/l2g_benchmark.ipynb b/notebooks/l2g_benchmark.ipynb new file mode 100644 index 000000000..98a7cf70f --- /dev/null +++ b/notebooks/l2g_benchmark.ipynb @@ -0,0 +1,603 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Benchmarking L2G predictions\n", + "\n", + "The objective of this notebook is to compare the new implementation of L2G with the last results we display in production (22.09.1).\n", + "\n", + "The notebook is divided in 3 parts:\n", + "1. Data preparation\n", + "2. Describe the data\n", + "3. Compare the results\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "23/12/11 16:18:49 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n" + ] + } + ], + "source": [ + "from datetime import datetime\n", + "from otg.dataset.study_locus import StudyLocus\n", + "from otg.dataset.l2g_prediction import L2GPrediction\n", + "from otg.common.session import Session\n", + "\n", + "import pyspark.sql.functions as f\n", + "from pyspark.sql import DataFrame\n", + "\n", + "import wandb\n", + "\n", + "%matplotlib inline\n", + "\n", + "session = Session(spark_uri=\"local[*]\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data preparation" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def prepare_predictions(credible_set: StudyLocus, predictions: L2GPrediction) -> DataFrame:\n", + " \"\"\"Prepares predictions dataframe for testing and comparison.\"\"\"\n", + " return (\n", + " credible_set.df\n", + " .select(\"studyLocusId\", \"variantId\", \"studyId\").distinct()\n", + " .join(\n", + " predictions.df, on=\"studyLocusId\"\n", + " )\n", + " .select(\"studyLocusId\", \"variantId\", \"studyId\", \"geneId\", \"score\")\n", + " .distinct()\n", + " )\n", + "\n", + "def prepare_production_predictions(old_predictions: DataFrame) -> DataFrame:\n", + " \"\"\"Prepares L2G predictions for testing and comparison.\"\"\"\n", + " return (\n", + " old_predictions\n", + " .select(\n", + " f.col(\"study_id\").alias(\"studyId\"),\n", + " f.concat_ws(\"_\", f.col(\"chrom\"), f.col(\"pos\"), f.col(\"ref\"), f.col(\"alt\")).alias(\"variantId\"),\n", + " f.col(\"gene_id\").alias(\"geneId\"),\n", + " f.col(\"y_proba_full_model\").alias(\"score\"),\n", + " )\n", + " .withColumn(\"studyLocusId\", StudyLocus.assign_study_locus_id(f.col(\"studyId\"), f.col(\"variantId\")))\n", + " .distinct()\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "# RAW DATA\n", + "credible_set_path = \"gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/credible_set\"\n", + "predictions_path = \"gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/l2g_predictions\"\n", + "old_predictions_path = \"gs://genetics-portal-dev-data/22.09.1/outputs/l2g\"\n", + "\n", + "predictions = L2GPrediction.from_parquet(session, predictions_path)\n", + "old_predictions = session.spark.read.parquet(old_predictions_path)\n", + "credible_set = StudyLocus.from_parquet(session, credible_set_path, recursiveFileLookup=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "predictions_prepared = prepare_predictions(credible_set, predictions).persist()\n", + "old_predictions_prepared = prepare_production_predictions(old_predictions).persist()\n", + "\n", + "joining_cols = [\"studyLocusId\", \"geneId\", \"variantId\", \"studyId\"]\n", + "comparison_df = (\n", + " predictions_prepared.selectExpr(*joining_cols, \"score as new_score\")\n", + " .join(\n", + " old_predictions_prepared.selectExpr(*joining_cols, \"score as old_score\"), on=joining_cols, how=\"inner\"\n", + " )\n", + " .distinct()\n", + " .persist()\n", + " )\n", + "\n", + "comparison_output_path = f\"gs://ot-team/irene/l2g_results_comparison-{datetime.today().strftime('%Y-%m-%d')}\"\n", + "# comparison_df.write.parquet(\"gs://ot-team/irene/l2g_results_comparison\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data description\n", + "\n", + "Note: Comparison_df is the result of intersecting the L2G datasets with both the production and the new implementation." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "COUNT PER DATASET\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "predictions_prepared: 9061746\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "old_predictions_prepared: 4083797\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 23:====================================================> (196 + 4) / 200]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "comparison_df: 2194371\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "## 1. L2G predicted credible sets count\n", + "\n", + "datasets = {\n", + " \"predictions_prepared\": predictions_prepared,\n", + " \"old_predictions_prepared\": old_predictions_prepared,\n", + " \"comparison_df\": comparison_df\n", + "}\n", + "\n", + "print(\"COUNT PER DATASET\")\n", + "for dataset in datasets.items():\n", + " print(f\"{dataset[0]}: {dataset[1].count()}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AVERAGE SCORES PER DATASET\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "predictions_prepared: 0.20072320074989783\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "old_predictions_prepared: 0.0720378814046517\n", + "MEDIAN SCORE PER DATASET\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "predictions_prepared: 0.023215007036924362\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 74:==============================================> (171 + 8) / 200]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "old_predictions_prepared: 0.012324056588113308\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "## 2. Descriptive stats for L2G scores\n", + "\n", + "print(\"AVERAGE SCORES PER DATASET\")\n", + "for dataset in datasets.items():\n", + " if dataset[0] != \"comparison_df\":\n", + " print(f\"{dataset[0]}: {dataset[1].agg(f.avg('score')).collect()[0][0]}\")\n", + "\n", + "print(\"MEDIAN SCORE PER DATASET\")\n", + "for dataset in datasets.items():\n", + " if dataset[0] != \"comparison_df\":\n", + " print(f\"{dataset[0]}: {dataset[1].approxQuantile('score',[0.5],0.1)[0]}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# OF ASSOCIATIONS WITH SCORE > 0.9\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "predictions_prepared: 5275 (0.06 from total)\n", + "old_predictions_prepared: 3942 (0.1 from total)\n" + ] + } + ], + "source": [ + "## How many associations with a score > 0.9\n", + "\n", + "print(\"# OF ASSOCIATIONS WITH SCORE > 0.9\")\n", + "for dataset in datasets.items():\n", + " if dataset[0] != \"comparison_df\":\n", + " print(f\"{dataset[0]}: {dataset[1].filter(f.col('score') >= 0.9).count()} ({round(dataset[1].filter(f.col('score') >= 0.9).count()/dataset[1].count() * 100, 2)} from total)\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Results comparison\n", + "\n", + "The comparisons dataset represents the intersection of the predictions of the production and the new implementation. The objective is to compare the L2G scores of both implementations for the same studyLoci." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
studyLocusIdgeneIdvariantIdstudyIdnew_scoreold_score
0-9221872607204368224ENSG0000006571719_3414090_G_AGCST0102410.0018870.008250
1-9219397145747036852ENSG0000016805611_65619907_T_AGCST0072340.0381770.014908
2-9219397145747036852ENSG0000017537611_65619907_T_AGCST0072340.0158460.011380
3-9217975156633736203ENSG000001874756_26325235_T_CGCST0094560.0396680.010985
4-9216978755013122322ENSG0000015761721_41816125_G_AGCST0059450.2710090.024520
\n", + "
" + ], + "text/plain": [ + " studyLocusId geneId variantId studyId \\\n", + "0 -9221872607204368224 ENSG00000065717 19_3414090_G_A GCST010241 \n", + "1 -9219397145747036852 ENSG00000168056 11_65619907_T_A GCST007234 \n", + "2 -9219397145747036852 ENSG00000175376 11_65619907_T_A GCST007234 \n", + "3 -9217975156633736203 ENSG00000187475 6_26325235_T_C GCST009456 \n", + "4 -9216978755013122322 ENSG00000157617 21_41816125_G_A GCST005945 \n", + "\n", + " new_score old_score \n", + "0 0.001887 0.008250 \n", + "1 0.038177 0.014908 \n", + "2 0.015846 0.011380 \n", + "3 0.039668 0.010985 \n", + "4 0.271009 0.024520 " + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "comparison_pdf = comparison_df.toPandas()\n", + "comparison_pdf.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SCORES CORRELATION 0.3968047070256464\n", + "Split by chromosome...\n", + "Chromosome 1: 0.4283002148537705\n", + "Chromosome 10: 0.4548083324805242\n", + "Chromosome 11: 0.3952137911268187\n", + "Chromosome 12: 0.4185634370780096\n", + "Chromosome 13: 0.42117917239984404\n", + "Chromosome 14: 0.39845735792304493\n", + "Chromosome 15: 0.40346861517903765\n", + "Chromosome 16: 0.39846240000598415\n", + "Chromosome 17: 0.395304979654295\n", + "Chromosome 18: 0.41437506238370103\n", + "Chromosome 19: 0.4425118135710343\n", + "Chromosome 2: 0.3889598461816933\n", + "Chromosome 20: 0.43686865328167446\n", + "Chromosome 21: 0.3849138600053731\n", + "Chromosome 22: 0.43046292359639526\n", + "Chromosome 3: 0.4111657046267522\n", + "Chromosome 4: 0.4291713768129795\n", + "Chromosome 5: 0.39581618467547613\n", + "Chromosome 6: 0.37446130946623823\n", + "Chromosome 7: 0.4059565003311735\n", + "Chromosome 8: 0.44203370064434944\n", + "Chromosome 9: 0.40815294157407295\n", + "Chromosome X: 0.12625008528673395\n" + ] + } + ], + "source": [ + "## Correlation between old and new scores\n", + "\n", + "overall_corr = comparison_pdf[\"old_score\"].corr(comparison_pdf[\"new_score\"])\n", + "print(\"SCORES CORRELATION\", overall_corr)\n", + "\n", + "print(\"Split by chromosome...\")\n", + "\n", + "comparison_pdf[\"chromosome\"] = comparison_pdf[\"variantId\"].str.split(\"_\", expand=True)[0]\n", + "\n", + "for group in comparison_pdf.sort_values(\"chromosome\").groupby(\"chromosome\"):\n", + " corr = group[1][\"old_score\"].corr(group[1][\"new_score\"])\n", + " print(f\"Chromosome {group[0]}: {corr}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## Add correlation coefficient to finished run in W&B\n", + "# See dashboard here to find run ID: https://wandb.ai/open-targets/otg_l2g/table?workspace=user-opentargets\n", + "my_run = \"4cyi1qvz\"\n", + "\n", + "wandb.init(id=my_run, project=\"otg_l2g\", resume=True)\n", + "wandb.log({\"correlationProduction\": overall_corr})\n", + "wandb.finish()" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB7pklEQVR4nO3dd3hUZdoG8HsySSa9kEpCICREpBcp0kFRVBRxdRdxFeQDdRXEFV27YAV210Vc1I+VtYuIoquuIIL0Ji0EUGkhCYSSZNIrqef7gy9jJnPmnHnPnJlJuX/Xlesi5z3nzJtJyHnylucxSJIkgYiIiKiN8PJ0B4iIiIj0xOCGiIiI2hQGN0RERNSmMLghIiKiNoXBDREREbUpDG6IiIioTWFwQ0RERG0KgxsiIiJqUxjcEBERUZvC4IbIhV544QUYDAa3vNbYsWMxduxYy+dbt26FwWDAmjVr3PL69957LxITE93yWlqVl5dj1qxZiI2NhcFgwJ///GdPd4mIXIDBDZGDPvjgAxgMBsuHn58f4uLiMGHCBPzzn/9EWVmZLq9z4cIFvPDCC0hLS9PlfnpqyX1zxMKFC/HBBx/gwQcfxMcff4x77rnH7rmJiYm4+eabFe/31VdfYcqUKUhKSkJAQAC6d++Oxx57DMXFxbLnV1dXY9myZRg5ciTCw8Ph6+uLuLg4TJo0CatWrUJ9fb0zXx4R/T9vT3eAqLV56aWX0LVrV9TW1iInJwdbt27Fn//8ZyxZsgTffvst+vbtazn3ueeew1NPPSV0/wsXLuDFF19EYmIi+vfv7/B1GzZsEHodLZT6tmLFCjQ0NLi8D87YvHkzrr76aixYsECX+91///2Ii4vD3Xffjc6dO+Po0aN48803sW7dOqSmpsLf399yrtlsxo033oiDBw9iwoQJeO6559ChQwfk5OTgxx9/xF133YX09HQ8//zzuvSNqD1jcEMk6MYbb8SgQYMsnz/99NPYvHkzbr75ZkyaNAnHjh2zPNS8vb3h7e3a/2aVlZUICAiAr6+vS19HjY+Pj0df3xF5eXno2bOnbvdbs2aN1VQgAFx11VWYPn06Vq5ciVmzZlmO33PPPTh06BC+/PJL/O53v7O65umnn8aBAwdw4sQJ3frmKg0NDaipqYGfn5+nu0JkF6eliHRwzTXX4Pnnn8eZM2fwySefWI7LrbnZuHEjRo4cibCwMAQFBaF79+545plnAFxeJzN48GAAwIwZMyxTYB988AGAy+tqevfujYMHD2L06NEICAiwXNt8zU2j+vp6PPPMM4iNjUVgYCAmTZqE7Oxsq3MSExNx77332lzb9J5qfZNbc1NRUYHHHnsMCQkJMJlM6N69O1577TVIkmR1nsFgwJw5c/D111+jd+/eMJlM6NWrF9avXy//hjeTl5eHmTNnIiYmBn5+fujXrx8+/PBDS3vj+qPMzEysXbvW0vesrCyH7m+P3Pt92223AQCOHTtmObZnzx788MMPuP/++20Cm0aDBg3CH//4R9XXVPr5aXTp0iW88MILuOKKK+Dn54eOHTvid7/7HU6fPm05R/R7s3LlSvTq1Qsmk8nyfTl//jz+53/+BzExMZbv2XvvvWfT52XLlqFXr14ICAhAeHg4Bg0ahE8//VT1ayXSiiM3RDq555578Mwzz2DDhg247777ZM/55ZdfcPPNN6Nv37546aWXYDKZkJ6ejl27dgEAevTogZdeegnz58/H/fffj1GjRgEAhg8fbrlHQUEBbrzxRtx55524++67ERMTo9ivV199FQaDAU8++STy8vKwdOlSjB8/HmlpaVbTJmoc6VtTkiRh0qRJ2LJlC2bOnIn+/fvjhx9+wF/+8hecP38er7/+utX5O3fuxFdffYWHHnoIwcHB+Oc//4nbb78dZ8+eRUREhN1+VVVVYezYsUhPT8ecOXPQtWtXfPHFF7j33ntRXFyMRx55BD169MDHH3+MRx99FJ06dcJjjz0GAIiKinL463dUTk4OACAyMtJy7L///S8A4O6773bq3mo/P8DlYPbmm2/Gpk2bcOedd+KRRx5BWVkZNm7ciJ9//hnJycnC35vNmzfj888/x5w5cxAZGYnExETk5ubi6quvtgQ/UVFR+P777zFz5kyUlpZaFmuvWLECc+fOxR133IFHHnkEly5dwpEjR7B3717cddddTr0fRHZJROSQ999/XwIg7d+/3+45oaGh0oABAyyfL1iwQGr63+z111+XAEhms9nuPfbv3y8BkN5//32btjFjxkgApOXLl8u2jRkzxvL5li1bJABSfHy8VFpaajn++eefSwCkN954w3KsS5cu0vTp01XvqdS36dOnS126dLF8/vXXX0sApFdeecXqvDvuuEMyGAxSenq65RgAydfX1+rY4cOH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K1ciMTERwOWg6cYbb8SuXbvwySef4Ndff8XixYthNBoBAAcPHsQf/vAH3HnnnTh69CheeOEFPP/88/jggw+sXuO1115Dv379cOjQITz//PM4ffo0brjhBtx+++04cuQIVq9ejZ07d2LOnDn6vLFEJM7TlTuJqPUbM2aMNHLkSKtjgwcPlp588klpx44dUkhIiHTp0iWr9uTkZOlf//qXJEmSNG/ePGnixImSJEnS0qVLpSlTpkj9+vWTvv/+e0mSJKlbt27SO++8o9qPhx9+WLrmmmukhoYGm7YffvhB8vLykk6cOCF77V133SVdd911Vsf+8pe/SD179rR83qVLF2ny5MlW58ycOVO6//77rY7t2LFD8vLykqqqqlT7TET648gNEemib9++Vp937NgReXl5OHz4MMrLyxEREYGgoCDLR2ZmJk6fPg0AGDNmDHbu3In6+nps27YNY8eOxdixY7F161ZcuHAB6enpGDt2rGof7r33XqSlpaF79+6YO3cuNmzYYGlLS0tDp06dcMUVV8hee+zYMYwYMcLq2IgRI3Dq1CnU19dbjg0aNMjqnMOHD+ODDz6w+tomTJiAhoYGZGZmqvaZiPTn7ekOEFHb4OPjY/W5wWBAQ0MDysvL0bFjR8u0U1NhYWEAgNGjR6OsrAypqanYvn07Fi5ciNjYWCxevBj9+vVDXFwcUlJSVPswcOBAZGZm4vvvv8ePP/6IP/zhDxg/fjzWrFkDf39/Pb5MBAYGWn1eXl6OBx54AHPnzrU5t3Pnzrq8JhGJYXBDRC41cOBA5OTkwNvb27L+pbmwsDD07dsXb775Jnx8fHDllVciOjoaU6ZMwXfffefQeptGISEhmDJlCqZMmYI77rgDN9xwAwoLC9G3b1+cO3cOJ0+elB296dGjB3bt2mV1bNeuXbjiiiss63LsfX2//vorunXr5nAfici1OC1FRC41fvx4DBs2DJMnT8aGDRuQlZWF3bt349lnn7XskAIu77hauXKlJZDp0KEDevTogdWrVzsc3CxZsgSrVq3C8ePHcfLkSXzxxReIjY1FWFgYxowZg9GjR+P222/Hxo0bLSM869evBwA89thj2LRpE15++WWcPHkSH374Id588008/vjjiq/55JNPYvfu3ZgzZw7S0tJw6tQpfPPNN1xQTORBDG6IyKUMBgPWrVuH0aNHY8aMGbjiiitw55134syZM4iJibGcN2bMGNTX11utrRk7dqzNMSXBwcH429/+hkGDBmHw4MHIysrCunXr4OV1+Vfdl19+icGDB2Pq1Kno2bMnnnjiCct6moEDB+Lzzz/HZ599ht69e2P+/Pl46aWXcO+99yq+Zt++fbFt2zacPHkSo0aNwoABAzB//nzExcUJvU9EpB+DJEmSpztBREREpBeO3BAREVGbwuCGiFqNhQsXWm25bvpx4403erp7RNRCcFqKiFqNwsJCFBYWyrb5+/sjPj7ezT0iopaIwQ0RERG1KZyWIiIiojaFwQ0RERG1KQxuiIiIqE1hcENERERtCoMbIiIialMY3BAREVGbwuCGiIiI2hQGN0RERNSm/B+aYjrtMdzCDAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "comparison_pdf.plot.scatter(\n", + " x=\"new_score\",\n", + " y=\"old_score\",\n", + " title=\"Distribution of L2G scores\",\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/poetry.lock b/poetry.lock index 722c656df..4a90e0186 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "aiodns" @@ -27,98 +27,98 @@ files = [ [[package]] name = "aiohttp" -version = "3.8.4" +version = "3.8.6" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.6" files = [ - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea"}, - {file = "aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1"}, - {file = "aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24"}, - {file = "aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d"}, - {file = "aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc"}, - {file = "aiohttp-3.8.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win32.whl", hash = "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e"}, - {file = "aiohttp-3.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win32.whl", hash = "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d"}, - {file = "aiohttp-3.8.4-cp38-cp38-win32.whl", hash = "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54"}, - {file = "aiohttp-3.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4"}, - {file = "aiohttp-3.8.4-cp39-cp39-win32.whl", hash = "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a"}, - {file = "aiohttp-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04"}, - {file = "aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c"}, + {file = "aiohttp-3.8.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:41d55fc043954cddbbd82503d9cc3f4814a40bcef30b3569bc7b5e34130718c1"}, + {file = "aiohttp-3.8.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d84166673694841d8953f0a8d0c90e1087739d24632fe86b1a08819168b4566"}, + {file = "aiohttp-3.8.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:253bf92b744b3170eb4c4ca2fa58f9c4b87aeb1df42f71d4e78815e6e8b73c9e"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fd194939b1f764d6bb05490987bfe104287bbf51b8d862261ccf66f48fb4096"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c5f938d199a6fdbdc10bbb9447496561c3a9a565b43be564648d81e1102ac22"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2817b2f66ca82ee699acd90e05c95e79bbf1dc986abb62b61ec8aaf851e81c93"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fa375b3d34e71ccccf172cab401cd94a72de7a8cc01847a7b3386204093bb47"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9de50a199b7710fa2904be5a4a9b51af587ab24c8e540a7243ab737b45844543"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e1d8cb0b56b3587c5c01de3bf2f600f186da7e7b5f7353d1bf26a8ddca57f965"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8e31e9db1bee8b4f407b77fd2507337a0a80665ad7b6c749d08df595d88f1cf5"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7bc88fc494b1f0311d67f29fee6fd636606f4697e8cc793a2d912ac5b19aa38d"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ec00c3305788e04bf6d29d42e504560e159ccaf0be30c09203b468a6c1ccd3b2"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad1407db8f2f49329729564f71685557157bfa42b48f4b93e53721a16eb813ed"}, + {file = "aiohttp-3.8.6-cp310-cp310-win32.whl", hash = "sha256:ccc360e87341ad47c777f5723f68adbb52b37ab450c8bc3ca9ca1f3e849e5fe2"}, + {file = "aiohttp-3.8.6-cp310-cp310-win_amd64.whl", hash = "sha256:93c15c8e48e5e7b89d5cb4613479d144fda8344e2d886cf694fd36db4cc86865"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e2f9cc8e5328f829f6e1fb74a0a3a939b14e67e80832975e01929e320386b34"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e6a00ffcc173e765e200ceefb06399ba09c06db97f401f920513a10c803604ca"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:41bdc2ba359032e36c0e9de5a3bd00d6fb7ea558a6ce6b70acedf0da86458321"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14cd52ccf40006c7a6cd34a0f8663734e5363fd981807173faf3a017e202fec9"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d5b785c792802e7b275c420d84f3397668e9d49ab1cb52bd916b3b3ffcf09ad"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1bed815f3dc3d915c5c1e556c397c8667826fbc1b935d95b0ad680787896a358"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96603a562b546632441926cd1293cfcb5b69f0b4159e6077f7c7dbdfb686af4d"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d76e8b13161a202d14c9584590c4df4d068c9567c99506497bdd67eaedf36403"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e3f1e3f1a1751bb62b4a1b7f4e435afcdade6c17a4fd9b9d43607cebd242924a"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:76b36b3124f0223903609944a3c8bf28a599b2cc0ce0be60b45211c8e9be97f8"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:a2ece4af1f3c967a4390c284797ab595a9f1bc1130ef8b01828915a05a6ae684"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:16d330b3b9db87c3883e565340d292638a878236418b23cc8b9b11a054aaa887"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:42c89579f82e49db436b69c938ab3e1559e5a4409eb8639eb4143989bc390f2f"}, + {file = "aiohttp-3.8.6-cp311-cp311-win32.whl", hash = "sha256:efd2fcf7e7b9d7ab16e6b7d54205beded0a9c8566cb30f09c1abe42b4e22bdcb"}, + {file = "aiohttp-3.8.6-cp311-cp311-win_amd64.whl", hash = "sha256:3b2ab182fc28e7a81f6c70bfbd829045d9480063f5ab06f6e601a3eddbbd49a0"}, + {file = "aiohttp-3.8.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fdee8405931b0615220e5ddf8cd7edd8592c606a8e4ca2a00704883c396e4479"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d25036d161c4fe2225d1abff2bd52c34ed0b1099f02c208cd34d8c05729882f0"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d791245a894be071d5ab04bbb4850534261a7d4fd363b094a7b9963e8cdbd31"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0cccd1de239afa866e4ce5c789b3032442f19c261c7d8a01183fd956b1935349"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f13f60d78224f0dace220d8ab4ef1dbc37115eeeab8c06804fec11bec2bbd07"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a9b5a0606faca4f6cc0d338359d6fa137104c337f489cd135bb7fbdbccb1e39"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:13da35c9ceb847732bf5c6c5781dcf4780e14392e5d3b3c689f6d22f8e15ae31"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:4d4cbe4ffa9d05f46a28252efc5941e0462792930caa370a6efaf491f412bc66"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:229852e147f44da0241954fc6cb910ba074e597f06789c867cb7fb0621e0ba7a"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:713103a8bdde61d13490adf47171a1039fd880113981e55401a0f7b42c37d071"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:45ad816b2c8e3b60b510f30dbd37fe74fd4a772248a52bb021f6fd65dff809b6"}, + {file = "aiohttp-3.8.6-cp36-cp36m-win32.whl", hash = "sha256:2b8d4e166e600dcfbff51919c7a3789ff6ca8b3ecce16e1d9c96d95dd569eb4c"}, + {file = "aiohttp-3.8.6-cp36-cp36m-win_amd64.whl", hash = "sha256:0912ed87fee967940aacc5306d3aa8ba3a459fcd12add0b407081fbefc931e53"}, + {file = "aiohttp-3.8.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e2a988a0c673c2e12084f5e6ba3392d76c75ddb8ebc6c7e9ead68248101cd446"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebf3fd9f141700b510d4b190094db0ce37ac6361a6806c153c161dc6c041ccda"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3161ce82ab85acd267c8f4b14aa226047a6bee1e4e6adb74b798bd42c6ae1f80"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d95fc1bf33a9a81469aa760617b5971331cdd74370d1214f0b3109272c0e1e3c"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c43ecfef7deaf0617cee936836518e7424ee12cb709883f2c9a1adda63cc460"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca80e1b90a05a4f476547f904992ae81eda5c2c85c66ee4195bb8f9c5fb47f28"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:90c72ebb7cb3a08a7f40061079817133f502a160561d0675b0a6adf231382c92"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bb54c54510e47a8c7c8e63454a6acc817519337b2b78606c4e840871a3e15349"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:de6a1c9f6803b90e20869e6b99c2c18cef5cc691363954c93cb9adeb26d9f3ae"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:a3628b6c7b880b181a3ae0a0683698513874df63783fd89de99b7b7539e3e8a8"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fc37e9aef10a696a5a4474802930079ccfc14d9f9c10b4662169671ff034b7df"}, + {file = "aiohttp-3.8.6-cp37-cp37m-win32.whl", hash = "sha256:f8ef51e459eb2ad8e7a66c1d6440c808485840ad55ecc3cafefadea47d1b1ba2"}, + {file = "aiohttp-3.8.6-cp37-cp37m-win_amd64.whl", hash = "sha256:b2fe42e523be344124c6c8ef32a011444e869dc5f883c591ed87f84339de5976"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9e2ee0ac5a1f5c7dd3197de309adfb99ac4617ff02b0603fd1e65b07dc772e4b"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01770d8c04bd8db568abb636c1fdd4f7140b284b8b3e0b4584f070180c1e5c62"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3c68330a59506254b556b99a91857428cab98b2f84061260a67865f7f52899f5"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89341b2c19fb5eac30c341133ae2cc3544d40d9b1892749cdd25892bbc6ac951"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71783b0b6455ac8f34b5ec99d83e686892c50498d5d00b8e56d47f41b38fbe04"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f628dbf3c91e12f4d6c8b3f092069567d8eb17814aebba3d7d60c149391aee3a"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04691bc6601ef47c88f0255043df6f570ada1a9ebef99c34bd0b72866c217ae"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ee912f7e78287516df155f69da575a0ba33b02dd7c1d6614dbc9463f43066e3"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9c19b26acdd08dd239e0d3669a3dddafd600902e37881f13fbd8a53943079dbc"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:99c5ac4ad492b4a19fc132306cd57075c28446ec2ed970973bbf036bcda1bcc6"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f0f03211fd14a6a0aed2997d4b1c013d49fb7b50eeb9ffdf5e51f23cfe2c77fa"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:8d399dade330c53b4106160f75f55407e9ae7505263ea86f2ccca6bfcbdb4921"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ec4fd86658c6a8964d75426517dc01cbf840bbf32d055ce64a9e63a40fd7b771"}, + {file = "aiohttp-3.8.6-cp38-cp38-win32.whl", hash = "sha256:33164093be11fcef3ce2571a0dccd9041c9a93fa3bde86569d7b03120d276c6f"}, + {file = "aiohttp-3.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:bdf70bfe5a1414ba9afb9d49f0c912dc524cf60141102f3a11143ba3d291870f"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d52d5dc7c6682b720280f9d9db41d36ebe4791622c842e258c9206232251ab2b"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4ac39027011414dbd3d87f7edb31680e1f430834c8cef029f11c66dad0670aa5"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3f5c7ce535a1d2429a634310e308fb7d718905487257060e5d4598e29dc17f0b"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b30e963f9e0d52c28f284d554a9469af073030030cef8693106d918b2ca92f54"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:918810ef188f84152af6b938254911055a72e0f935b5fbc4c1a4ed0b0584aed1"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:002f23e6ea8d3dd8d149e569fd580c999232b5fbc601c48d55398fbc2e582e8c"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fcf3eabd3fd1a5e6092d1242295fa37d0354b2eb2077e6eb670accad78e40e1"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:255ba9d6d5ff1a382bb9a578cd563605aa69bec845680e21c44afc2670607a95"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d67f8baed00870aa390ea2590798766256f31dc5ed3ecc737debb6e97e2ede78"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:86f20cee0f0a317c76573b627b954c412ea766d6ada1a9fcf1b805763ae7feeb"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:39a312d0e991690ccc1a61f1e9e42daa519dcc34ad03eb6f826d94c1190190dd"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e827d48cf802de06d9c935088c2924e3c7e7533377d66b6f31ed175c1620e05e"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bd111d7fc5591ddf377a408ed9067045259ff2770f37e2d94e6478d0f3fc0c17"}, + {file = "aiohttp-3.8.6-cp39-cp39-win32.whl", hash = "sha256:caf486ac1e689dda3502567eb89ffe02876546599bbf915ec94b1fa424eeffd4"}, + {file = "aiohttp-3.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:3f0e27e5b733803333bb2371249f41cf42bae8884863e8e8965ec69bebe53132"}, + {file = "aiohttp-3.8.6.tar.gz", hash = "sha256:b0cf2a4501bff9330a8a5248b4ce951851e415bdcce9dc158e76cfd55e15085c"}, ] [package.dependencies] @@ -149,13 +149,13 @@ frozenlist = ">=1.1.0" [[package]] name = "alembic" -version = "1.11.3" +version = "1.12.1" description = "A database migration tool for SQLAlchemy." optional = false python-versions = ">=3.7" files = [ - {file = "alembic-1.11.3-py3-none-any.whl", hash = "sha256:d6c96c2482740592777c400550a523bc7a9aada4e210cae2e733354ddae6f6f8"}, - {file = "alembic-1.11.3.tar.gz", hash = "sha256:3db4ce81a9072e1b5aa44c2d202add24553182672a12daf21608d6f62a8f9cf9"}, + {file = "alembic-1.12.1-py3-none-any.whl", hash = "sha256:47d52e3dfb03666ed945becb723d6482e52190917fdb47071440cfdba05d92cb"}, + {file = "alembic-1.12.1.tar.gz", hash = "sha256:bca5877e9678b454706347bc10b97cb7d67f300320fa5c3a94423e8266e2823f"}, ] [package.dependencies] @@ -166,6 +166,17 @@ typing-extensions = ">=4" [package.extras] tz = ["python-dateutil"] +[[package]] +name = "annotated-types" +version = "0.6.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, + {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, +] + [[package]] name = "antlr4-python3-runtime" version = "4.9.3" @@ -178,34 +189,34 @@ files = [ [[package]] name = "anyio" -version = "3.7.1" +version = "4.0.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, - {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, + {file = "anyio-4.0.0-py3-none-any.whl", hash = "sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f"}, + {file = "anyio-4.0.0.tar.gz", hash = "sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a"}, ] [package.dependencies] -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" [package.extras] -doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] -test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (<0.22)"] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.22)"] [[package]] name = "apache-airflow" -version = "2.7.0" +version = "2.8.0" description = "Programmatically author, schedule and monitor data pipelines" optional = false -python-versions = "~=3.8" +python-versions = "<3.12,~=3.8" files = [ - {file = "apache-airflow-2.7.0.tar.gz", hash = "sha256:06fba3df5943b6eda5e2f033e7e45b6ea557d89909ca36e61614ea61075f9722"}, - {file = "apache_airflow-2.7.0-py3-none-any.whl", hash = "sha256:8e3cf4b3cd8583a2e76bd04827af8d34747e0cf30a28cf0e70f4f4f39ce61f6d"}, + {file = "apache-airflow-2.8.0.tar.gz", hash = "sha256:5917ee148125892764f4306ec76a62c66a5801218a99edfd3fe46e968cb1a344"}, + {file = "apache_airflow-2.8.0-py3-none-any.whl", hash = "sha256:4ee532b97ef6520ad8e1ffda325aabe265f007a14166570d5f710d4999c9ad1c"}, ] [package.dependencies] @@ -219,21 +230,21 @@ argcomplete = ">=1.10" asgiref = "*" attrs = ">=22.1.0" blinker = "*" -cattrs = ">=22.1.0" colorlog = ">=4.0.2,<5.0" configupdater = ">=3.1.1" -connexion = {version = ">=2.10.0", extras = ["flask"]} +connexion = {version = ">=2.10.0,<3.0", extras = ["flask"]} cron-descriptor = ">=1.2.24" croniter = ">=0.3.17" cryptography = ">=0.9.3" deprecated = ">=1.2.13" dill = ">=0.2.2" flask = ">=2.2,<2.3" -flask-appbuilder = "4.3.3" +flask-appbuilder = "4.3.10" flask-caching = ">=1.5.0" flask-login = ">=0.6.2" flask-session = ">=0.4.0" flask-wtf = ">=0.15" +fsspec = ">=2023.10.0" google-re2 = ">=1.0" graphviz = ">=0.12" gunicorn = ">=20.1.0" @@ -249,14 +260,14 @@ markdown-it-py = ">=2.1.0" markupsafe = ">=1.1.1" marshmallow-oneofschema = ">=2.0.1" mdit-py-plugins = ">=0.3.0" -opentelemetry-api = "1.15.0" +opentelemetry-api = ">=1.15.0" opentelemetry-exporter-otlp = "*" packaging = ">=14.0" pathspec = ">=0.9.0" -pendulum = ">=2.0" +pendulum = ">=2.0,<3.0" pluggy = ">=1.0" psutil = ">=4.2.0" -pydantic = ">=1.10.0,<2.0.0" +pydantic = ">=2.3.0" pygments = ">=2.0.1" pyjwt = ">=2.0.0" python-daemon = ">=3.0.0" @@ -267,21 +278,22 @@ rfc3339-validator = ">=0.1.4" rich = ">=12.4.4" rich-argparse = ">=1.0.0" setproctitle = ">=1.1.8" -sqlalchemy = ">=1.4,<2.0" +sqlalchemy = ">=1.4.28,<2.0" sqlalchemy-jsonfield = ">=1.0" tabulate = ">=0.7.5" tenacity = ">=6.2.0,<8.2.0 || >8.2.0" termcolor = ">=1.1.0" typing-extensions = ">=4.0.0" unicodecsv = ">=0.14.1" -werkzeug = ">=2.0" +universal-pathlib = ">=0.1.4" +werkzeug = ">=2.0,<3" [package.extras] aiobotocore = ["aiobotocore (>=2.1.1)"] airbyte = ["apache-airflow-providers-airbyte"] alibaba = ["apache-airflow-providers-alibaba"] -all = ["PyGithub (!=1.58)", "PyOpenSSL", "adal (>=1.2.7)", "aiobotocore (>=2.1.1)", "aiohttp", "aiohttp (>=3.6.3,<4)", "alibabacloud-adb20211201 (>=1.0.0)", "alibabacloud-tea-openapi (>=0.3.7)", "amqp", "analytics-python (>=1.2.9)", "apache-airflow (>=2.4.0)", "apache-airflow (>=2.7.0)", "apache-airflow-providers-airbyte", "apache-airflow-providers-alibaba", "apache-airflow-providers-amazon", "apache-airflow-providers-apache-beam", "apache-airflow-providers-apache-cassandra", "apache-airflow-providers-apache-drill", "apache-airflow-providers-apache-druid", "apache-airflow-providers-apache-flink", "apache-airflow-providers-apache-hdfs", "apache-airflow-providers-apache-hive", "apache-airflow-providers-apache-impala", "apache-airflow-providers-apache-kafka", "apache-airflow-providers-apache-kylin", "apache-airflow-providers-apache-livy", "apache-airflow-providers-apache-pig", "apache-airflow-providers-apache-pinot", "apache-airflow-providers-apache-spark", "apache-airflow-providers-apache-sqoop", "apache-airflow-providers-apprise", "apache-airflow-providers-arangodb", "apache-airflow-providers-asana", "apache-airflow-providers-atlassian-jira", "apache-airflow-providers-celery", "apache-airflow-providers-cloudant", "apache-airflow-providers-cncf-kubernetes", "apache-airflow-providers-common-sql", "apache-airflow-providers-daskexecutor", "apache-airflow-providers-databricks", "apache-airflow-providers-datadog", "apache-airflow-providers-dbt-cloud", "apache-airflow-providers-dingding", "apache-airflow-providers-discord", "apache-airflow-providers-docker", "apache-airflow-providers-elasticsearch", "apache-airflow-providers-exasol", "apache-airflow-providers-facebook", "apache-airflow-providers-ftp", "apache-airflow-providers-github", "apache-airflow-providers-google", "apache-airflow-providers-grpc", "apache-airflow-providers-hashicorp", "apache-airflow-providers-http", "apache-airflow-providers-imap", "apache-airflow-providers-influxdb", "apache-airflow-providers-jdbc", "apache-airflow-providers-jenkins", "apache-airflow-providers-microsoft-azure", "apache-airflow-providers-microsoft-mssql", "apache-airflow-providers-microsoft-psrp", "apache-airflow-providers-microsoft-winrm", "apache-airflow-providers-mongo", "apache-airflow-providers-mysql", "apache-airflow-providers-neo4j", "apache-airflow-providers-odbc", "apache-airflow-providers-openfaas", "apache-airflow-providers-openlineage", "apache-airflow-providers-opsgenie", "apache-airflow-providers-oracle", "apache-airflow-providers-pagerduty", "apache-airflow-providers-papermill", "apache-airflow-providers-plexus", "apache-airflow-providers-postgres", "apache-airflow-providers-presto", "apache-airflow-providers-qubole", "apache-airflow-providers-redis", "apache-airflow-providers-salesforce", "apache-airflow-providers-samba", "apache-airflow-providers-segment", "apache-airflow-providers-sendgrid", "apache-airflow-providers-sftp", "apache-airflow-providers-singularity", "apache-airflow-providers-slack", "apache-airflow-providers-smtp", "apache-airflow-providers-snowflake", "apache-airflow-providers-sqlite", "apache-airflow-providers-ssh", "apache-airflow-providers-tableau", "apache-airflow-providers-tabular", "apache-airflow-providers-telegram", "apache-airflow-providers-trino", "apache-airflow-providers-vertica", "apache-airflow-providers-zendesk", "apache-beam (>=2.47.0)", "apprise", "arrow (>=0.16.0)", "asana (>=0.10,<4.0.0)", "asgiref", "asgiref (>=3.5.2)", "atlasclient (>=0.1.2)", "atlassian-python-api (>=1.14.2)", "attrs (>=22.2)", "authlib (>=1.0.0)", "azure-batch (>=8.0.0)", "azure-cosmos (>=4.0.0)", "azure-datalake-store (>=0.0.45)", "azure-identity (>=1.3.1)", "azure-keyvault-secrets (>=4.1.0)", "azure-kusto-data (>=0.0.43,<0.1)", "azure-mgmt-containerinstance (>=1.5.0,<2.0)", "azure-mgmt-datafactory (>=1.0.0,<2.0)", "azure-mgmt-datalake-store (>=0.5.0)", "azure-mgmt-resource (>=2.2.0)", "azure-servicebus (>=7.6.1)", "azure-storage-blob (>=12.14.0)", "azure-storage-common (>=2.1.0)", "azure-storage-file (>=2.1.0)", "azure-storage-file-datalake (>=12.9.1)", "azure-synapse-spark", "bcrypt (>=2.0.0)", "blinker (>=1.1)", "boto3 (>=1.24.0)", "cassandra-driver (>=3.13.0)", "celery (>=5.2.3,<6)", "cgroupspy (>=0.2.2)", "cloudant (>=2.0)", "cloudpickle (>=1.4.1)", "confluent-kafka (>=1.8.2)", "cryptography (>=2.0.0)", "dask (>=2.9.0,!=2022.10.1,!=2023.5.0)", "databricks-sql-connector (>=2.0.0,<3.0.0)", "datadog (>=0.14.0)", "distributed (>=2.11.1,!=2023.5.0)", "dnspython (>=1.13.0)", "docker (>=5.0.3)", "elasticsearch (>7,<7.15.0)", "eventlet (>=0.33.3)", "facebook-business (>=6.0.2)", "flask-appbuilder[oauth] (==4.3.3)", "flask-bcrypt (>=0.7.1)", "flower (>=1.0.0)", "gcloud-aio-auth (>=4.0.0,<5.0.0)", "gcloud-aio-bigquery (>=6.1.2)", "gcloud-aio-storage", "gevent (>=0.13)", "google-ads (>=21.2.0)", "google-api-core (>=2.11.0)", "google-api-python-client (>=1.6.0)", "google-auth (>=1.0.0)", "google-auth (>=1.0.0,<3.0.0)", "google-auth-httplib2 (>=0.0.1)", "google-cloud-aiplatform (>=1.22.1)", "google-cloud-automl (>=2.11.0)", "google-cloud-bigquery-datatransfer (>=3.11.0)", "google-cloud-bigtable (>=2.17.0)", "google-cloud-build (>=3.13.0)", "google-cloud-compute (>=1.10.0)", "google-cloud-container (>=2.17.4)", "google-cloud-datacatalog (>=3.11.1)", "google-cloud-dataflow-client (>=0.8.2)", "google-cloud-dataform (>=0.5.0)", "google-cloud-dataplex (>=1.4.2)", "google-cloud-dataproc (>=5.4.0)", "google-cloud-dataproc-metastore (>=1.12.0)", "google-cloud-dlp (>=3.12.0)", "google-cloud-kms (>=2.15.0)", "google-cloud-language (>=2.9.0)", "google-cloud-logging (>=3.5.0)", "google-cloud-memcache (>=1.7.0)", "google-cloud-monitoring (>=2.14.1)", "google-cloud-orchestration-airflow (>=1.7.0)", "google-cloud-os-login (>=2.9.1)", "google-cloud-pubsub (>=2.15.0)", "google-cloud-redis (>=2.12.0)", "google-cloud-secret-manager (>=2.16.0)", "google-cloud-spanner (>=3.11.1)", "google-cloud-speech (>=2.18.0)", "google-cloud-storage (>=2.7.0)", "google-cloud-storage-transfer (>=1.4.1)", "google-cloud-tasks (>=2.13.0)", "google-cloud-texttospeech (>=2.14.1)", "google-cloud-translate (>=3.11.0)", "google-cloud-videointelligence (>=2.11.0)", "google-cloud-vision (>=3.4.0)", "google-cloud-workflows (>=1.10.0)", "greenlet (>=0.4.9)", "grpcio (>=1.15.0)", "grpcio-gcp (>=0.2.2)", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "hmsclient (>=0.1.0)", "httpx", "hvac (>=0.10)", "impyla (>=0.18.0,<1.0)", "influxdb-client (>=1.19.0)", "jaydebeapi (>=1.1.1)", "json-merge-patch (>=0.2)", "jsonpath-ng (>=1.5.3)", "kubernetes (>=21.7.0,<24)", "kubernetes-asyncio (>=18.20.1,<25)", "kylinpy (>=2.6)", "ldap3 (>=2.5.1)", "looker-sdk (>=22.2.0)", "mypy-boto3-appflow (>=1.24.0,<1.28.12)", "mypy-boto3-rds (>=1.24.0)", "mypy-boto3-redshift-data (>=1.24.0)", "mypy-boto3-s3 (>=1.24.0)", "mysqlclient (>=1.3.6)", "neo4j (>=4.2.1)", "openlineage-integration-common (>=0.28.0)", "openlineage-python (>=0.28.0)", "opentelemetry-exporter-prometheus", "opsgenie-sdk (>=2.1.5)", "oracledb (>=1.0.0)", "oss2 (>=2.14.0)", "pandas (>=0.17.1)", "pandas-gbq", "papermill[all] (>=1.2.1)", "paramiko (>=2.6.0)", "pdpyras (>=4.1.2)", "pinotdb (>0.4.7)", "plyvel", "presto-python-client (>=0.8.2)", "proto-plus (>=1.19.6)", "psycopg2-binary (>=2.8.0)", "pyarrow (>=9.0.0)", "pydruid (>=0.4.1)", "pyexasol (>=0.5.1)", "pyhive[hive] (>=0.6.0)", "pykerberos (>=1.1.13)", "pymongo (>=3.6.0)", "pymssql (>=2.1.5)", "pyodbc", "pypsrp (>=0.8.0)", "pyspark", "python-arango (>=7.3.2)", "python-dotenv (>=0.21.0)", "python-jenkins (>=1.0.0)", "python-ldap", "python-telegram-bot (>=20.0.0)", "pywinrm (>=0.4)", "qds-sdk (>=1.10.4)", "redis (>=3.2.0)", "redshift-connector (>=2.0.888)", "requests (>=2.26.0)", "requests (>=2.27,<3)", "requests-kerberos (>=0.10.0)", "requests-toolbelt", "sasl (>=0.3.1)", "scrapbook[all]", "sendgrid (>=6.0.0)", "sentry-sdk (>=0.8.0)", "simple-salesforce (>=1.0.0)", "slack-sdk (>=3.0.0)", "smbprotocol (>=1.5.0)", "snowflake-connector-python (>=2.4.1)", "snowflake-sqlalchemy (>=1.1.0)", "spython (>=0.0.56)", "sqlalchemy-bigquery (>=1.2.1)", "sqlalchemy-drill (>=1.1.0)", "sqlalchemy-redshift (>=0.8.6)", "sqlalchemy-spanner (>=1.6.2)", "sqlparse (>=0.4.2)", "sshtunnel (>=0.3.2)", "statsd (>=3.3.0)", "tableauserverclient", "thrift (>=0.9.2)", "thrift-sasl (>=0.2.0)", "trino (>=0.318.0)", "vertica-python (>=0.5.1)", "virtualenv", "watchtower (>=2.0.1,<2.1.0)", "zenpy (>=2.0.24)"] -all-dbs = ["aiohttp (>=3.6.3,<4)", "apache-airflow (>=2.4.0)", "apache-airflow-providers-apache-cassandra", "apache-airflow-providers-apache-drill", "apache-airflow-providers-apache-druid", "apache-airflow-providers-apache-hdfs", "apache-airflow-providers-apache-hive", "apache-airflow-providers-apache-impala", "apache-airflow-providers-apache-pinot", "apache-airflow-providers-arangodb", "apache-airflow-providers-cloudant", "apache-airflow-providers-common-sql (>=1.3.1)", "apache-airflow-providers-common-sql (>=1.5.0)", "apache-airflow-providers-databricks", "apache-airflow-providers-exasol", "apache-airflow-providers-influxdb", "apache-airflow-providers-microsoft-mssql", "apache-airflow-providers-mongo", "apache-airflow-providers-mysql", "apache-airflow-providers-neo4j", "apache-airflow-providers-postgres", "apache-airflow-providers-presto", "apache-airflow-providers-trino", "apache-airflow-providers-vertica", "cassandra-driver (>=3.13.0)", "cloudant (>=2.0)", "databricks-sql-connector (>=2.0.0,<3.0.0)", "dnspython (>=1.13.0)", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "hmsclient (>=0.1.0)", "impyla (>=0.18.0,<1.0)", "influxdb-client (>=1.19.0)", "mysqlclient (>=1.3.6)", "neo4j (>=4.2.1)", "pandas (>=0.17.1)", "pinotdb (>0.4.7)", "presto-python-client (>=0.8.2)", "psycopg2-binary (>=2.8.0)", "pydruid (>=0.4.1)", "pyexasol (>=0.5.1)", "pyhive[hive] (>=0.6.0)", "pymongo (>=3.6.0)", "pymssql (>=2.1.5)", "python-arango (>=7.3.2)", "requests (>=2.26.0)", "requests (>=2.27,<3)", "sasl (>=0.3.1)", "sqlalchemy-drill (>=1.1.0)", "thrift (>=0.9.2)", "trino (>=0.318.0)", "vertica-python (>=0.5.1)"] +all = ["PyGithub (!=1.58)", "PyOpenSSL", "adal (>=1.2.7)", "adlfs (>=2023.10.0)", "aiobotocore (>=2.1.1)", "aiofiles (>=23.2.0)", "aiohttp", "aiohttp (>=3.6.3,<4)", "alibabacloud-adb20211201 (>=1.0.0)", "alibabacloud-tea-openapi (>=0.3.7)", "amqp", "analytics-python (>=1.2.9)", "apache-airflow (>=2.6.0)", "apache-airflow (>=2.7.0)", "apache-airflow (>=2.8.0)", "apache-airflow-providers-airbyte", "apache-airflow-providers-alibaba", "apache-airflow-providers-amazon", "apache-airflow-providers-apache-beam", "apache-airflow-providers-apache-cassandra", "apache-airflow-providers-apache-drill", "apache-airflow-providers-apache-druid", "apache-airflow-providers-apache-flink", "apache-airflow-providers-apache-hdfs", "apache-airflow-providers-apache-hive", "apache-airflow-providers-apache-impala", "apache-airflow-providers-apache-kafka", "apache-airflow-providers-apache-kylin", "apache-airflow-providers-apache-livy", "apache-airflow-providers-apache-pig", "apache-airflow-providers-apache-pinot", "apache-airflow-providers-apache-spark", "apache-airflow-providers-apprise", "apache-airflow-providers-arangodb", "apache-airflow-providers-asana", "apache-airflow-providers-atlassian-jira", "apache-airflow-providers-celery", "apache-airflow-providers-cloudant", "apache-airflow-providers-cncf-kubernetes", "apache-airflow-providers-cohere", "apache-airflow-providers-common-io", "apache-airflow-providers-common-sql", "apache-airflow-providers-databricks", "apache-airflow-providers-datadog", "apache-airflow-providers-dbt-cloud", "apache-airflow-providers-dingding", "apache-airflow-providers-discord", "apache-airflow-providers-docker", "apache-airflow-providers-elasticsearch", "apache-airflow-providers-exasol", "apache-airflow-providers-facebook", "apache-airflow-providers-ftp", "apache-airflow-providers-github", "apache-airflow-providers-google", "apache-airflow-providers-grpc", "apache-airflow-providers-hashicorp", "apache-airflow-providers-http", "apache-airflow-providers-imap", "apache-airflow-providers-influxdb", "apache-airflow-providers-jdbc", "apache-airflow-providers-jenkins", "apache-airflow-providers-microsoft-azure", "apache-airflow-providers-microsoft-mssql", "apache-airflow-providers-microsoft-psrp", "apache-airflow-providers-microsoft-winrm", "apache-airflow-providers-mongo", "apache-airflow-providers-mysql", "apache-airflow-providers-neo4j", "apache-airflow-providers-odbc", "apache-airflow-providers-openai", "apache-airflow-providers-openfaas", "apache-airflow-providers-openlineage", "apache-airflow-providers-opensearch", "apache-airflow-providers-opsgenie", "apache-airflow-providers-oracle", "apache-airflow-providers-pagerduty", "apache-airflow-providers-papermill", "apache-airflow-providers-pgvector", "apache-airflow-providers-pinecone", "apache-airflow-providers-postgres", "apache-airflow-providers-presto", "apache-airflow-providers-redis", "apache-airflow-providers-salesforce", "apache-airflow-providers-samba", "apache-airflow-providers-segment", "apache-airflow-providers-sendgrid", "apache-airflow-providers-sftp", "apache-airflow-providers-singularity", "apache-airflow-providers-slack", "apache-airflow-providers-smtp", "apache-airflow-providers-snowflake", "apache-airflow-providers-sqlite", "apache-airflow-providers-ssh", "apache-airflow-providers-tableau", "apache-airflow-providers-tabular", "apache-airflow-providers-telegram", "apache-airflow-providers-trino", "apache-airflow-providers-vertica", "apache-airflow-providers-weaviate", "apache-airflow-providers-yandex", "apache-airflow-providers-zendesk", "apache-beam (>=2.47.0)", "apprise", "asana (>=0.10,<4.0.0)", "asgiref", "asgiref (>=3.5.2)", "atlasclient (>=0.1.2)", "atlassian-python-api (>=1.14.2)", "attrs (>=22.2)", "authlib (>=1.0.0)", "azure-batch (>=8.0.0)", "azure-cosmos (>=4.0.0)", "azure-datalake-store (>=0.0.45)", "azure-identity (>=1.3.1)", "azure-keyvault-secrets (>=4.1.0)", "azure-kusto-data (>=4.1.0)", "azure-mgmt-containerinstance (>=9.0.0)", "azure-mgmt-containerregistry (>=8.0.0)", "azure-mgmt-cosmosdb", "azure-mgmt-datafactory (>=2.0.0)", "azure-mgmt-datalake-store (>=0.5.0)", "azure-mgmt-resource (>=2.2.0)", "azure-mgmt-storage (>=16.0.0)", "azure-servicebus (>=7.6.1)", "azure-storage-blob (>=12.14.0)", "azure-storage-file-datalake (>=12.9.1)", "azure-storage-file-share", "azure-synapse-artifacts (>=0.17.0)", "azure-synapse-spark", "bcrypt (>=2.0.0)", "blinker (>=1.1)", "boto3 (>=1.28.0)", "botocore (>=1.31.0)", "cassandra-driver (>=3.13.0)", "celery (>=5.3.0,!=5.3.2,!=5.3.3,<6)", "cgroupspy (>=0.2.2)", "cloudant (>=2.0)", "cohere (>=4.27)", "confluent-kafka (>=1.8.2)", "cryptography (>=2.0.0)", "databricks-sql-connector (>=2.0.0,!=2.9.0,<3.0.0)", "datadog (>=0.14.0)", "dnspython (>=1.13.0)", "docker (>=5.0.3)", "elasticsearch (>=8.10,<9)", "eventlet (>=0.33.3)", "facebook-business (>=6.0.2)", "flask-appbuilder[oauth] (==4.3.10)", "flask-bcrypt (>=0.7.1)", "flower (>=1.0.0)", "gcloud-aio-auth (>=4.0.0,<5.0.0)", "gcloud-aio-bigquery (>=6.1.2)", "gcloud-aio-storage", "gcsfs (>=2023.10.0)", "gevent (>=0.13)", "google-ads (>=22.1.0)", "google-api-core (>=2.11.0)", "google-api-python-client (>=1.6.0)", "google-auth (>=1.0.0)", "google-auth (>=1.0.0,<3.0.0)", "google-auth-httplib2 (>=0.0.1)", "google-cloud-aiplatform (>=1.22.1)", "google-cloud-automl (>=2.12.0)", "google-cloud-batch (>=0.13.0)", "google-cloud-bigquery-datatransfer (>=3.13.0)", "google-cloud-bigtable (>=2.17.0)", "google-cloud-build (>=3.22.0)", "google-cloud-compute (>=1.10.0)", "google-cloud-container (>=2.17.4)", "google-cloud-datacatalog (>=3.11.1)", "google-cloud-dataflow-client (>=0.8.6)", "google-cloud-dataform (>=0.5.0)", "google-cloud-dataplex (>=1.10.0)", "google-cloud-dataproc (>=5.8.0)", "google-cloud-dataproc-metastore (>=1.12.0)", "google-cloud-dlp (>=3.12.0)", "google-cloud-kms (>=2.15.0)", "google-cloud-language (>=2.9.0)", "google-cloud-logging (>=3.5.0)", "google-cloud-memcache (>=1.7.0)", "google-cloud-monitoring (>=2.18.0)", "google-cloud-orchestration-airflow (>=1.10.0)", "google-cloud-os-login (>=2.9.1)", "google-cloud-pubsub (>=2.19.0)", "google-cloud-redis (>=2.12.0)", "google-cloud-run (>=0.9.0)", "google-cloud-secret-manager (>=2.16.0)", "google-cloud-spanner (>=3.11.1)", "google-cloud-speech (>=2.18.0)", "google-cloud-storage (>=2.7.0)", "google-cloud-storage-transfer (>=1.4.1)", "google-cloud-tasks (>=2.13.0)", "google-cloud-texttospeech (>=2.14.1)", "google-cloud-translate (>=3.11.0)", "google-cloud-videointelligence (>=2.11.0)", "google-cloud-vision (>=3.4.0)", "google-cloud-workflows (>=1.10.0)", "google-re2 (>=1.0)", "greenlet (>=0.4.9)", "grpcio (>=1.15.0)", "grpcio-gcp (>=0.2.2)", "grpcio-status", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "hmsclient (>=0.1.0)", "httpx", "hvac (>=0.10)", "impyla (>=0.18.0,<1.0)", "inflection (>=0.5.1)", "influxdb-client (>=1.19.0)", "ipykernel", "jaydebeapi (>=1.1.1)", "json-merge-patch (>=0.2)", "jsonpath-ng (>=1.5.3)", "kubernetes (>=21.7.0,<24)", "kubernetes-asyncio (>=18.20.1,<25)", "kylinpy (>=2.6)", "ldap3 (>=2.5.1)", "looker-sdk (>=22.2.0)", "mysql-connector-python (>=8.0.11)", "mysqlclient (>=1.3.6)", "neo4j (>=4.2.1)", "openai[datalib] (>=1.0)", "openlineage-integration-common (>=0.28.0)", "openlineage-python (>=0.28.0)", "opensearch-py (>=2.2.0)", "opentelemetry-exporter-prometheus", "opsgenie-sdk (>=2.1.5)", "oracledb (>=1.0.0)", "oss2 (>=2.14.0)", "pandas (>=0.17.1)", "pandas-gbq", "papermill[all] (>=1.2.1)", "paramiko (>=2.6.0)", "paramiko (>=2.8.0)", "pdpyras (>=4.1.2)", "pgvector (>=0.2.3)", "pinecone-client (>=2.2.4)", "pinotdb (>0.4.7)", "plyvel", "presto-python-client (>=0.8.4)", "proto-plus (>=1.19.6)", "psycopg2-binary (>=2.8.0)", "pyarrow (>=9.0.0)", "pyarrow-hotfix", "pydruid (>=0.4.1)", "pyexasol (>=0.5.1)", "pyhive[hive-pure-sasl] (>=0.7.0)", "pykerberos (>=1.1.13)", "pymongo (>=3.6.0)", "pymssql (>=2.1.8)", "pyodbc", "pypsrp (>=0.8.0)", "pyspark", "python-arango (>=7.3.2)", "python-dotenv (>=0.21.0)", "python-jenkins (>=1.0.0)", "python-ldap", "python-telegram-bot (>=20.0.0)", "python3-saml (>=1.16.0)", "pywinrm (>=0.4)", "redis (>=4.5.2,!=4.5.5,<5.0.0)", "redshift-connector (>=2.0.888)", "requests (>=2.26.0)", "requests (>=2.27,<3)", "requests-kerberos (>=0.10.0)", "requests-toolbelt", "s3fs (>=2023.10.0)", "scrapbook[all]", "sendgrid (>=6.0.0)", "sentry-sdk (>=1.32.0,!=1.33.0)", "simple-salesforce (>=1.0.0)", "slack-sdk (>=3.0.0)", "smbprotocol (>=1.5.0)", "snowflake-connector-python (>=2.7.8)", "snowflake-sqlalchemy (>=1.1.0)", "spython (>=0.0.56)", "sqlalchemy-bigquery (>=1.2.1)", "sqlalchemy-drill (>=1.1.0)", "sqlalchemy-redshift (>=0.8.6)", "sqlalchemy-spanner (>=1.6.2)", "sqlparse (>=0.4.2)", "sshtunnel (>=0.3.2)", "statsd (>=3.3.0)", "tableauserverclient", "thrift (>=0.9.2)", "thrift-sasl (>=0.2.0)", "trino (>=0.318.0)", "vertica-python (>=0.5.1)", "virtualenv", "watchtower (>=2.0.1,<4)", "weaviate-client (>=3.24.2)", "yandexcloud (>=0.228.0)", "zenpy (>=2.0.24)"] +all-dbs = ["aiohttp (>=3.6.3,<4)", "apache-airflow (>=2.6.0)", "apache-airflow-providers-apache-cassandra", "apache-airflow-providers-apache-drill", "apache-airflow-providers-apache-druid", "apache-airflow-providers-apache-hdfs", "apache-airflow-providers-apache-hive", "apache-airflow-providers-apache-impala", "apache-airflow-providers-apache-pinot", "apache-airflow-providers-arangodb", "apache-airflow-providers-cloudant", "apache-airflow-providers-common-sql (>=1.3.1)", "apache-airflow-providers-common-sql (>=1.8.1)", "apache-airflow-providers-databricks", "apache-airflow-providers-exasol", "apache-airflow-providers-influxdb", "apache-airflow-providers-microsoft-mssql", "apache-airflow-providers-mongo", "apache-airflow-providers-mysql", "apache-airflow-providers-neo4j", "apache-airflow-providers-postgres", "apache-airflow-providers-presto", "apache-airflow-providers-trino", "apache-airflow-providers-vertica", "cassandra-driver (>=3.13.0)", "cloudant (>=2.0)", "databricks-sql-connector (>=2.0.0,!=2.9.0,<3.0.0)", "dnspython (>=1.13.0)", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "hmsclient (>=0.1.0)", "impyla (>=0.18.0,<1.0)", "influxdb-client (>=1.19.0)", "mysql-connector-python (>=8.0.11)", "mysqlclient (>=1.3.6)", "neo4j (>=4.2.1)", "pandas (>=0.17.1)", "pinotdb (>0.4.7)", "presto-python-client (>=0.8.4)", "psycopg2-binary (>=2.8.0)", "pydruid (>=0.4.1)", "pyexasol (>=0.5.1)", "pyhive[hive-pure-sasl] (>=0.7.0)", "pymongo (>=3.6.0)", "pymssql (>=2.1.8)", "python-arango (>=7.3.2)", "requests (>=2.26.0)", "requests (>=2.27,<3)", "sqlalchemy-drill (>=1.1.0)", "thrift (>=0.9.2)", "trino (>=0.318.0)", "vertica-python (>=0.5.1)"] amazon = ["apache-airflow-providers-amazon"] apache-atlas = ["atlasclient (>=0.1.2)"] apache-beam = ["apache-airflow-providers-apache-beam"] @@ -298,7 +310,6 @@ apache-livy = ["apache-airflow-providers-apache-livy"] apache-pig = ["apache-airflow-providers-apache-pig"] apache-pinot = ["apache-airflow-providers-apache-pinot"] apache-spark = ["apache-airflow-providers-apache-spark"] -apache-sqoop = ["apache-airflow-providers-apache-sqoop"] apache-webhdfs = ["hdfs[avro,dataframe,kerberos] (>=2.0.4)"] apprise = ["apache-airflow-providers-apprise"] arangodb = ["apache-airflow-providers-arangodb"] @@ -309,24 +320,24 @@ atlassian-jira = ["apache-airflow-providers-atlassian-jira"] aws = ["apache-airflow-providers-amazon"] azure = ["apache-airflow-providers-microsoft-azure"] cassandra = ["apache-airflow-providers-apache-cassandra"] -celery = ["apache-airflow (>=2.4.0)", "apache-airflow-providers-celery", "celery (>=5.2.3,<6)", "flower (>=1.0.0)"] +celery = ["apache-airflow (>=2.6.0)", "apache-airflow-providers-celery", "celery (>=5.3.0,!=5.3.2,!=5.3.3,<6)", "flower (>=1.0.0)", "google-re2 (>=1.0)"] cgroups = ["cgroupspy (>=0.2.2)"] cloudant = ["apache-airflow-providers-cloudant"] -cncf-kubernetes = ["apache-airflow (>=2.4.0)", "apache-airflow-providers-cncf-kubernetes", "asgiref (>=3.5.2)", "cryptography (>=2.0.0)", "kubernetes (>=21.7.0,<24)", "kubernetes-asyncio (>=18.20.1,<25)"] +cncf-kubernetes = ["aiofiles (>=23.2.0)", "apache-airflow (>=2.6.0)", "apache-airflow-providers-cncf-kubernetes", "asgiref (>=3.5.2)", "cryptography (>=2.0.0)", "google-re2 (>=1.0)", "kubernetes (>=21.7.0,<24)", "kubernetes-asyncio (>=18.20.1,<25)"] +cohere = ["apache-airflow-providers-cohere"] +common-io = ["apache-airflow-providers-common-io"] common-sql = ["apache-airflow-providers-common-sql"] -dask = ["apache-airflow (>=2.4.0)", "apache-airflow-providers-daskexecutor", "cloudpickle (>=1.4.1)", "dask (>=2.9.0,!=2022.10.1,!=2023.5.0)", "distributed (>=2.11.1,!=2023.5.0)"] -daskexecutor = ["apache-airflow (>=2.4.0)", "apache-airflow-providers-daskexecutor", "cloudpickle (>=1.4.1)", "dask (>=2.9.0,!=2022.10.1,!=2023.5.0)", "distributed (>=2.11.1,!=2023.5.0)"] databricks = ["apache-airflow-providers-databricks"] datadog = ["apache-airflow-providers-datadog"] dbt-cloud = ["apache-airflow-providers-dbt-cloud"] deprecated-api = ["requests (>=2.26.0)"] -devel = ["aiobotocore (>=2.1.1)", "aioresponses", "apache-airflow (>=2.4.0)", "apache-airflow-providers-common-sql", "astroid (>=2.12.3)", "aws-xray-sdk", "bcrypt (>=2.0.0)", "beautifulsoup4 (>=4.7.1)", "black", "blinker", "bowler", "cgroupspy (>=0.2.2)", "checksumdir", "click (>=8.0)", "click (>=8.0,!=8.1.4,!=8.1.5)", "coverage", "cryptography (>=2.0.0)", "docutils (<0.17.0)", "eralchemy2", "filelock", "flask-bcrypt (>=0.7.1)", "gitpython", "ipdb", "jira", "jsondiff", "jsonpath-ng (>=1.5.3)", "kubernetes (>=21.7.0,<24)", "mongomock", "moto[cloudformation,glue] (>=4.0)", "mypy (==1.2.0)", "mysqlclient (>=1.3.6)", "pandas (>=0.17.1)", "paramiko", "pipdeptree", "pre-commit", "pyarrow (>=9.0.0)", "pygithub", "pypsrp", "pytest", "pytest-asyncio", "pytest-capture-warnings", "pytest-cov", "pytest-httpx", "pytest-instafail", "pytest-mock", "pytest-rerunfailures", "pytest-timeouts", "pytest-xdist", "python-jose", "pywinrm", "qds-sdk (>=1.9.6)", "requests-mock", "rich-click (>=1.5)", "ruff (>=0.0.219)", "semver", "sphinx (>=5.2.0)", "sphinx-airflow-theme", "sphinx-argparse (>=0.1.13)", "sphinx-autoapi (>=2.0.0)", "sphinx-copybutton", "sphinx-jinja (>=2.0)", "sphinx-rtd-theme (>=0.1.6)", "sphinxcontrib-httpdomain (>=1.7.0)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-spelling (>=7.3)", "time-machine", "towncrier", "twine", "types-Deprecated", "types-Markdown", "types-PyMySQL", "types-PyYAML", "types-boto", "types-certifi", "types-croniter", "types-docutils", "types-paramiko", "types-protobuf", "types-python-dateutil", "types-python-slugify", "types-pytz", "types-redis", "types-requests", "types-setuptools", "types-tabulate", "types-termcolor", "types-toml", "wheel", "yamllint"] -devel-all = ["PyGithub (!=1.58)", "PyOpenSSL", "adal (>=1.2.7)", "aiobotocore (>=2.1.1)", "aiohttp", "aiohttp (>=3.6.3,<4)", "aioresponses", "alibabacloud-adb20211201 (>=1.0.0)", "alibabacloud-tea-openapi (>=0.3.7)", "amqp", "analytics-python (>=1.2.9)", "apache-airflow (>=2.4.0)", "apache-airflow (>=2.7.0)", "apache-airflow-providers-airbyte", "apache-airflow-providers-alibaba", "apache-airflow-providers-amazon", "apache-airflow-providers-apache-beam", "apache-airflow-providers-apache-cassandra", "apache-airflow-providers-apache-drill", "apache-airflow-providers-apache-druid", "apache-airflow-providers-apache-flink", "apache-airflow-providers-apache-hdfs", "apache-airflow-providers-apache-hive", "apache-airflow-providers-apache-impala", "apache-airflow-providers-apache-kafka", "apache-airflow-providers-apache-kylin", "apache-airflow-providers-apache-livy", "apache-airflow-providers-apache-pig", "apache-airflow-providers-apache-pinot", "apache-airflow-providers-apache-spark", "apache-airflow-providers-apache-sqoop", "apache-airflow-providers-apprise", "apache-airflow-providers-arangodb", "apache-airflow-providers-asana", "apache-airflow-providers-atlassian-jira", "apache-airflow-providers-celery", "apache-airflow-providers-cloudant", "apache-airflow-providers-cncf-kubernetes", "apache-airflow-providers-common-sql", "apache-airflow-providers-daskexecutor", "apache-airflow-providers-databricks", "apache-airflow-providers-datadog", "apache-airflow-providers-dbt-cloud", "apache-airflow-providers-dingding", "apache-airflow-providers-discord", "apache-airflow-providers-docker", "apache-airflow-providers-elasticsearch", "apache-airflow-providers-exasol", "apache-airflow-providers-facebook", "apache-airflow-providers-ftp", "apache-airflow-providers-github", "apache-airflow-providers-google", "apache-airflow-providers-grpc", "apache-airflow-providers-hashicorp", "apache-airflow-providers-http", "apache-airflow-providers-imap", "apache-airflow-providers-influxdb", "apache-airflow-providers-jdbc", "apache-airflow-providers-jenkins", "apache-airflow-providers-microsoft-azure", "apache-airflow-providers-microsoft-mssql", "apache-airflow-providers-microsoft-psrp", "apache-airflow-providers-microsoft-winrm", "apache-airflow-providers-mongo", "apache-airflow-providers-mysql", "apache-airflow-providers-neo4j", "apache-airflow-providers-odbc", "apache-airflow-providers-openfaas", "apache-airflow-providers-openlineage", "apache-airflow-providers-opsgenie", "apache-airflow-providers-oracle", "apache-airflow-providers-pagerduty", "apache-airflow-providers-papermill", "apache-airflow-providers-plexus", "apache-airflow-providers-postgres", "apache-airflow-providers-presto", "apache-airflow-providers-qubole", "apache-airflow-providers-redis", "apache-airflow-providers-salesforce", "apache-airflow-providers-samba", "apache-airflow-providers-segment", "apache-airflow-providers-sendgrid", "apache-airflow-providers-sftp", "apache-airflow-providers-singularity", "apache-airflow-providers-slack", "apache-airflow-providers-smtp", "apache-airflow-providers-snowflake", "apache-airflow-providers-sqlite", "apache-airflow-providers-ssh", "apache-airflow-providers-tableau", "apache-airflow-providers-tabular", "apache-airflow-providers-telegram", "apache-airflow-providers-trino", "apache-airflow-providers-vertica", "apache-airflow-providers-zendesk", "apache-beam (>=2.47.0)", "apprise", "arrow (>=0.16.0)", "asana (>=0.10,<4.0.0)", "asgiref", "asgiref (>=3.5.2)", "astroid (>=2.12.3)", "atlasclient (>=0.1.2)", "atlassian-python-api (>=1.14.2)", "attrs (>=22.2)", "authlib (>=1.0.0)", "aws-xray-sdk", "azure-batch (>=8.0.0)", "azure-cosmos (>=4.0.0)", "azure-datalake-store (>=0.0.45)", "azure-identity (>=1.3.1)", "azure-keyvault-secrets (>=4.1.0)", "azure-kusto-data (>=0.0.43,<0.1)", "azure-mgmt-containerinstance (>=1.5.0,<2.0)", "azure-mgmt-datafactory (>=1.0.0,<2.0)", "azure-mgmt-datalake-store (>=0.5.0)", "azure-mgmt-resource (>=2.2.0)", "azure-servicebus (>=7.6.1)", "azure-storage-blob (>=12.14.0)", "azure-storage-common (>=2.1.0)", "azure-storage-file (>=2.1.0)", "azure-storage-file-datalake (>=12.9.1)", "azure-synapse-spark", "bcrypt (>=2.0.0)", "beautifulsoup4 (>=4.7.1)", "black", "blinker", "blinker (>=1.1)", "boto3 (>=1.24.0)", "bowler", "cassandra-driver (>=3.13.0)", "celery (>=5.2.3,<6)", "cgroupspy (>=0.2.2)", "checksumdir", "click (>=8.0)", "click (>=8.0,!=8.1.4,!=8.1.5)", "cloudant (>=2.0)", "cloudpickle (>=1.4.1)", "confluent-kafka (>=1.8.2)", "coverage", "cryptography (>=2.0.0)", "dask (>=2.9.0,!=2022.10.1,!=2023.5.0)", "databricks-sql-connector (>=2.0.0,<3.0.0)", "datadog (>=0.14.0)", "distributed (>=2.11.1,!=2023.5.0)", "dnspython (>=1.13.0)", "docker (>=5.0.3)", "docutils (<0.17.0)", "elasticsearch (>7,<7.15.0)", "eralchemy2", "eventlet (>=0.33.3)", "facebook-business (>=6.0.2)", "filelock", "flask-appbuilder[oauth] (==4.3.3)", "flask-bcrypt (>=0.7.1)", "flower (>=1.0.0)", "gcloud-aio-auth (>=4.0.0,<5.0.0)", "gcloud-aio-bigquery (>=6.1.2)", "gcloud-aio-storage", "gevent (>=0.13)", "gitpython", "google-ads (>=21.2.0)", "google-api-core (>=2.11.0)", "google-api-python-client (>=1.6.0)", "google-auth (>=1.0.0)", "google-auth (>=1.0.0,<3.0.0)", "google-auth-httplib2 (>=0.0.1)", "google-cloud-aiplatform (>=1.22.1)", "google-cloud-automl (>=2.11.0)", "google-cloud-bigquery-datatransfer (>=3.11.0)", "google-cloud-bigtable (>=2.17.0)", "google-cloud-build (>=3.13.0)", "google-cloud-compute (>=1.10.0)", "google-cloud-container (>=2.17.4)", "google-cloud-datacatalog (>=3.11.1)", "google-cloud-dataflow-client (>=0.8.2)", "google-cloud-dataform (>=0.5.0)", "google-cloud-dataplex (>=1.4.2)", "google-cloud-dataproc (>=5.4.0)", "google-cloud-dataproc-metastore (>=1.12.0)", "google-cloud-dlp (>=3.12.0)", "google-cloud-kms (>=2.15.0)", "google-cloud-language (>=2.9.0)", "google-cloud-logging (>=3.5.0)", "google-cloud-memcache (>=1.7.0)", "google-cloud-monitoring (>=2.14.1)", "google-cloud-orchestration-airflow (>=1.7.0)", "google-cloud-os-login (>=2.9.1)", "google-cloud-pubsub (>=2.15.0)", "google-cloud-redis (>=2.12.0)", "google-cloud-secret-manager (>=2.16.0)", "google-cloud-spanner (>=3.11.1)", "google-cloud-speech (>=2.18.0)", "google-cloud-storage (>=2.7.0)", "google-cloud-storage-transfer (>=1.4.1)", "google-cloud-tasks (>=2.13.0)", "google-cloud-texttospeech (>=2.14.1)", "google-cloud-translate (>=3.11.0)", "google-cloud-videointelligence (>=2.11.0)", "google-cloud-vision (>=3.4.0)", "google-cloud-workflows (>=1.10.0)", "greenlet (>=0.4.9)", "grpcio (>=1.15.0)", "grpcio-gcp (>=0.2.2)", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "hmsclient (>=0.1.0)", "httpx", "hvac (>=0.10)", "impyla (>=0.18.0,<1.0)", "influxdb-client (>=1.19.0)", "ipdb", "jaydebeapi (>=1.1.1)", "jira", "json-merge-patch (>=0.2)", "jsondiff", "jsonpath-ng (>=1.5.3)", "kubernetes (>=21.7.0,<24)", "kubernetes-asyncio (>=18.20.1,<25)", "kylinpy (>=2.6)", "ldap3 (>=2.5.1)", "looker-sdk (>=22.2.0)", "mongomock", "moto[cloudformation,glue] (>=4.0)", "mypy (==1.2.0)", "mypy-boto3-appflow (>=1.24.0,<1.28.12)", "mypy-boto3-rds (>=1.24.0)", "mypy-boto3-redshift-data (>=1.24.0)", "mypy-boto3-s3 (>=1.24.0)", "mysqlclient (>=1.3.6)", "neo4j (>=4.2.1)", "openlineage-integration-common (>=0.28.0)", "openlineage-python (>=0.28.0)", "opentelemetry-exporter-prometheus", "opsgenie-sdk (>=2.1.5)", "oracledb (>=1.0.0)", "oss2 (>=2.14.0)", "pandas (>=0.17.1)", "pandas-gbq", "papermill[all] (>=1.2.1)", "paramiko", "paramiko (>=2.6.0)", "pdpyras (>=4.1.2)", "pinotdb (>0.4.7)", "pipdeptree", "plyvel", "pre-commit", "presto-python-client (>=0.8.2)", "proto-plus (>=1.19.6)", "psycopg2-binary (>=2.8.0)", "pyarrow (>=9.0.0)", "pydruid (>=0.4.1)", "pyexasol (>=0.5.1)", "pygithub", "pyhive[hive] (>=0.6.0)", "pykerberos (>=1.1.13)", "pymongo (>=3.6.0)", "pymssql (>=2.1.5)", "pyodbc", "pypsrp", "pypsrp (>=0.8.0)", "pyspark", "pytest", "pytest-asyncio", "pytest-capture-warnings", "pytest-cov", "pytest-httpx", "pytest-instafail", "pytest-mock", "pytest-rerunfailures", "pytest-timeouts", "pytest-xdist", "python-arango (>=7.3.2)", "python-dotenv (>=0.21.0)", "python-jenkins (>=1.0.0)", "python-jose", "python-ldap", "python-telegram-bot (>=20.0.0)", "pywinrm", "pywinrm (>=0.4)", "qds-sdk (>=1.10.4)", "qds-sdk (>=1.9.6)", "redis (>=3.2.0)", "redshift-connector (>=2.0.888)", "requests (>=2.26.0)", "requests (>=2.27,<3)", "requests-kerberos (>=0.10.0)", "requests-mock", "requests-toolbelt", "rich-click (>=1.5)", "ruff (>=0.0.219)", "sasl (>=0.3.1)", "scrapbook[all]", "semver", "sendgrid (>=6.0.0)", "sentry-sdk (>=0.8.0)", "simple-salesforce (>=1.0.0)", "slack-sdk (>=3.0.0)", "smbprotocol (>=1.5.0)", "snowflake-connector-python (>=2.4.1)", "snowflake-sqlalchemy (>=1.1.0)", "sphinx (>=5.2.0)", "sphinx-airflow-theme", "sphinx-argparse (>=0.1.13)", "sphinx-autoapi (>=2.0.0)", "sphinx-copybutton", "sphinx-jinja (>=2.0)", "sphinx-rtd-theme (>=0.1.6)", "sphinxcontrib-httpdomain (>=1.7.0)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-spelling (>=7.3)", "spython (>=0.0.56)", "sqlalchemy-bigquery (>=1.2.1)", "sqlalchemy-drill (>=1.1.0)", "sqlalchemy-redshift (>=0.8.6)", "sqlalchemy-spanner (>=1.6.2)", "sqlparse (>=0.4.2)", "sshtunnel (>=0.3.2)", "statsd (>=3.3.0)", "tableauserverclient", "thrift (>=0.9.2)", "thrift-sasl (>=0.2.0)", "time-machine", "towncrier", "trino (>=0.318.0)", "twine", "types-Deprecated", "types-Markdown", "types-PyMySQL", "types-PyYAML", "types-boto", "types-certifi", "types-croniter", "types-docutils", "types-paramiko", "types-protobuf", "types-python-dateutil", "types-python-slugify", "types-pytz", "types-redis", "types-requests", "types-setuptools", "types-tabulate", "types-termcolor", "types-toml", "vertica-python (>=0.5.1)", "virtualenv", "watchtower (>=2.0.1,<2.1.0)", "wheel", "yamllint", "zenpy (>=2.0.24)"] -devel-ci = ["PyGithub (!=1.58)", "PyOpenSSL", "adal (>=1.2.7)", "aiobotocore (>=2.1.1)", "aiohttp", "aiohttp (>=3.6.3,<4)", "aioresponses", "alibabacloud-adb20211201 (>=1.0.0)", "alibabacloud-tea-openapi (>=0.3.7)", "amqp", "analytics-python (>=1.2.9)", "apache-airflow (>=2.4.0)", "apache-airflow (>=2.7.0)", "apache-airflow-providers-airbyte", "apache-airflow-providers-alibaba", "apache-airflow-providers-amazon", "apache-airflow-providers-apache-beam", "apache-airflow-providers-apache-cassandra", "apache-airflow-providers-apache-drill", "apache-airflow-providers-apache-druid", "apache-airflow-providers-apache-flink", "apache-airflow-providers-apache-hdfs", "apache-airflow-providers-apache-hive", "apache-airflow-providers-apache-impala", "apache-airflow-providers-apache-kafka", "apache-airflow-providers-apache-kylin", "apache-airflow-providers-apache-livy", "apache-airflow-providers-apache-pig", "apache-airflow-providers-apache-pinot", "apache-airflow-providers-apache-spark", "apache-airflow-providers-apache-sqoop", "apache-airflow-providers-apprise", "apache-airflow-providers-arangodb", "apache-airflow-providers-asana", "apache-airflow-providers-atlassian-jira", "apache-airflow-providers-celery", "apache-airflow-providers-cloudant", "apache-airflow-providers-cncf-kubernetes", "apache-airflow-providers-common-sql", "apache-airflow-providers-daskexecutor", "apache-airflow-providers-databricks", "apache-airflow-providers-datadog", "apache-airflow-providers-dbt-cloud", "apache-airflow-providers-dingding", "apache-airflow-providers-discord", "apache-airflow-providers-docker", "apache-airflow-providers-elasticsearch", "apache-airflow-providers-exasol", "apache-airflow-providers-facebook", "apache-airflow-providers-ftp", "apache-airflow-providers-github", "apache-airflow-providers-google", "apache-airflow-providers-grpc", "apache-airflow-providers-hashicorp", "apache-airflow-providers-http", "apache-airflow-providers-imap", "apache-airflow-providers-influxdb", "apache-airflow-providers-jdbc", "apache-airflow-providers-jenkins", "apache-airflow-providers-microsoft-azure", "apache-airflow-providers-microsoft-mssql", "apache-airflow-providers-microsoft-psrp", "apache-airflow-providers-microsoft-winrm", "apache-airflow-providers-mongo", "apache-airflow-providers-mysql", "apache-airflow-providers-neo4j", "apache-airflow-providers-odbc", "apache-airflow-providers-openfaas", "apache-airflow-providers-openlineage", "apache-airflow-providers-opsgenie", "apache-airflow-providers-oracle", "apache-airflow-providers-pagerduty", "apache-airflow-providers-papermill", "apache-airflow-providers-plexus", "apache-airflow-providers-postgres", "apache-airflow-providers-presto", "apache-airflow-providers-qubole", "apache-airflow-providers-redis", "apache-airflow-providers-salesforce", "apache-airflow-providers-samba", "apache-airflow-providers-segment", "apache-airflow-providers-sendgrid", "apache-airflow-providers-sftp", "apache-airflow-providers-singularity", "apache-airflow-providers-slack", "apache-airflow-providers-smtp", "apache-airflow-providers-snowflake", "apache-airflow-providers-sqlite", "apache-airflow-providers-ssh", "apache-airflow-providers-tableau", "apache-airflow-providers-tabular", "apache-airflow-providers-telegram", "apache-airflow-providers-trino", "apache-airflow-providers-vertica", "apache-airflow-providers-zendesk", "apache-beam (>=2.47.0)", "apprise", "arrow (>=0.16.0)", "asana (>=0.10,<4.0.0)", "asgiref", "asgiref (>=3.5.2)", "astroid (>=2.12.3)", "atlasclient (>=0.1.2)", "atlassian-python-api (>=1.14.2)", "attrs (>=22.2)", "authlib (>=1.0.0)", "aws-xray-sdk", "azure-batch (>=8.0.0)", "azure-cosmos (>=4.0.0)", "azure-datalake-store (>=0.0.45)", "azure-identity (>=1.3.1)", "azure-keyvault-secrets (>=4.1.0)", "azure-kusto-data (>=0.0.43,<0.1)", "azure-mgmt-containerinstance (>=1.5.0,<2.0)", "azure-mgmt-datafactory (>=1.0.0,<2.0)", "azure-mgmt-datalake-store (>=0.5.0)", "azure-mgmt-resource (>=2.2.0)", "azure-servicebus (>=7.6.1)", "azure-storage-blob (>=12.14.0)", "azure-storage-common (>=2.1.0)", "azure-storage-file (>=2.1.0)", "azure-storage-file-datalake (>=12.9.1)", "azure-synapse-spark", "bcrypt (>=2.0.0)", "beautifulsoup4 (>=4.7.1)", "black", "blinker", "blinker (>=1.1)", "boto3 (>=1.24.0)", "bowler", "cassandra-driver (>=3.13.0)", "celery (>=5.2.3,<6)", "cgroupspy (>=0.2.2)", "checksumdir", "click (>=8.0)", "click (>=8.0,!=8.1.4,!=8.1.5)", "cloudant (>=2.0)", "cloudpickle (>=1.4.1)", "confluent-kafka (>=1.8.2)", "coverage", "cryptography (>=2.0.0)", "dask (>=2.9.0,!=2022.10.1,!=2023.5.0)", "databricks-sql-connector (>=2.0.0,<3.0.0)", "datadog (>=0.14.0)", "distributed (>=2.11.1,!=2023.5.0)", "dnspython (>=1.13.0)", "docker (>=5.0.3)", "docutils (<0.17.0)", "elasticsearch (>7,<7.15.0)", "eralchemy2", "eventlet (>=0.33.3)", "facebook-business (>=6.0.2)", "filelock", "flask-appbuilder[oauth] (==4.3.3)", "flask-bcrypt (>=0.7.1)", "flower (>=1.0.0)", "gcloud-aio-auth (>=4.0.0,<5.0.0)", "gcloud-aio-bigquery (>=6.1.2)", "gcloud-aio-storage", "gevent (>=0.13)", "gitpython", "google-ads (>=21.2.0)", "google-api-core (>=2.11.0)", "google-api-python-client (>=1.6.0)", "google-auth (>=1.0.0)", "google-auth (>=1.0.0,<3.0.0)", "google-auth-httplib2 (>=0.0.1)", "google-cloud-aiplatform (>=1.22.1)", "google-cloud-automl (>=2.11.0)", "google-cloud-bigquery-datatransfer (>=3.11.0)", "google-cloud-bigtable (>=2.17.0)", "google-cloud-build (>=3.13.0)", "google-cloud-compute (>=1.10.0)", "google-cloud-container (>=2.17.4)", "google-cloud-datacatalog (>=3.11.1)", "google-cloud-dataflow-client (>=0.8.2)", "google-cloud-dataform (>=0.5.0)", "google-cloud-dataplex (>=1.4.2)", "google-cloud-dataproc (>=5.4.0)", "google-cloud-dataproc-metastore (>=1.12.0)", "google-cloud-dlp (>=3.12.0)", "google-cloud-kms (>=2.15.0)", "google-cloud-language (>=2.9.0)", "google-cloud-logging (>=3.5.0)", "google-cloud-memcache (>=1.7.0)", "google-cloud-monitoring (>=2.14.1)", "google-cloud-orchestration-airflow (>=1.7.0)", "google-cloud-os-login (>=2.9.1)", "google-cloud-pubsub (>=2.15.0)", "google-cloud-redis (>=2.12.0)", "google-cloud-secret-manager (>=2.16.0)", "google-cloud-spanner (>=3.11.1)", "google-cloud-speech (>=2.18.0)", "google-cloud-storage (>=2.7.0)", "google-cloud-storage-transfer (>=1.4.1)", "google-cloud-tasks (>=2.13.0)", "google-cloud-texttospeech (>=2.14.1)", "google-cloud-translate (>=3.11.0)", "google-cloud-videointelligence (>=2.11.0)", "google-cloud-vision (>=3.4.0)", "google-cloud-workflows (>=1.10.0)", "greenlet (>=0.4.9)", "grpcio (>=1.15.0)", "grpcio-gcp (>=0.2.2)", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "hmsclient (>=0.1.0)", "httpx", "hvac (>=0.10)", "impyla (>=0.18.0,<1.0)", "influxdb-client (>=1.19.0)", "ipdb", "jaydebeapi (>=1.1.1)", "jira", "json-merge-patch (>=0.2)", "jsondiff", "jsonpath-ng (>=1.5.3)", "kubernetes (>=21.7.0,<24)", "kubernetes-asyncio (>=18.20.1,<25)", "kylinpy (>=2.6)", "ldap3 (>=2.5.1)", "looker-sdk (>=22.2.0)", "mongomock", "moto[cloudformation,glue] (>=4.0)", "mypy (==1.2.0)", "mypy-boto3-appflow (>=1.24.0,<1.28.12)", "mypy-boto3-rds (>=1.24.0)", "mypy-boto3-redshift-data (>=1.24.0)", "mypy-boto3-s3 (>=1.24.0)", "mysqlclient (>=1.3.6)", "neo4j (>=4.2.1)", "openlineage-integration-common (>=0.28.0)", "openlineage-python (>=0.28.0)", "opentelemetry-exporter-prometheus", "opsgenie-sdk (>=2.1.5)", "oracledb (>=1.0.0)", "oss2 (>=2.14.0)", "pandas (>=0.17.1)", "pandas-gbq", "papermill[all] (>=1.2.1)", "paramiko", "paramiko (>=2.6.0)", "pdpyras (>=4.1.2)", "pinotdb (>0.4.7)", "pipdeptree", "plyvel", "pre-commit", "presto-python-client (>=0.8.2)", "proto-plus (>=1.19.6)", "psycopg2-binary (>=2.8.0)", "pyarrow (>=9.0.0)", "pydruid (>=0.4.1)", "pyexasol (>=0.5.1)", "pygithub", "pyhive[hive] (>=0.6.0)", "pykerberos (>=1.1.13)", "pymongo (>=3.6.0)", "pymssql (>=2.1.5)", "pyodbc", "pypsrp", "pypsrp (>=0.8.0)", "pyspark", "pytest", "pytest-asyncio", "pytest-capture-warnings", "pytest-cov", "pytest-httpx", "pytest-instafail", "pytest-mock", "pytest-rerunfailures", "pytest-timeouts", "pytest-xdist", "python-arango (>=7.3.2)", "python-dotenv (>=0.21.0)", "python-jenkins (>=1.0.0)", "python-jose", "python-ldap", "python-telegram-bot (>=20.0.0)", "pywinrm", "pywinrm (>=0.4)", "qds-sdk (>=1.10.4)", "qds-sdk (>=1.9.6)", "redis (>=3.2.0)", "redshift-connector (>=2.0.888)", "requests (>=2.26.0)", "requests (>=2.27,<3)", "requests-kerberos (>=0.10.0)", "requests-mock", "requests-toolbelt", "rich-click (>=1.5)", "ruff (>=0.0.219)", "sasl (>=0.3.1)", "scrapbook[all]", "semver", "sendgrid (>=6.0.0)", "sentry-sdk (>=0.8.0)", "simple-salesforce (>=1.0.0)", "slack-sdk (>=3.0.0)", "smbprotocol (>=1.5.0)", "snowflake-connector-python (>=2.4.1)", "snowflake-sqlalchemy (>=1.1.0)", "sphinx (>=5.2.0)", "sphinx-airflow-theme", "sphinx-argparse (>=0.1.13)", "sphinx-autoapi (>=2.0.0)", "sphinx-copybutton", "sphinx-jinja (>=2.0)", "sphinx-rtd-theme (>=0.1.6)", "sphinxcontrib-httpdomain (>=1.7.0)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-spelling (>=7.3)", "spython (>=0.0.56)", "sqlalchemy-bigquery (>=1.2.1)", "sqlalchemy-drill (>=1.1.0)", "sqlalchemy-redshift (>=0.8.6)", "sqlalchemy-spanner (>=1.6.2)", "sqlparse (>=0.4.2)", "sshtunnel (>=0.3.2)", "statsd (>=3.3.0)", "tableauserverclient", "thrift (>=0.9.2)", "thrift-sasl (>=0.2.0)", "time-machine", "towncrier", "trino (>=0.318.0)", "twine", "types-Deprecated", "types-Markdown", "types-PyMySQL", "types-PyYAML", "types-boto", "types-certifi", "types-croniter", "types-docutils", "types-paramiko", "types-protobuf", "types-python-dateutil", "types-python-slugify", "types-pytz", "types-redis", "types-requests", "types-setuptools", "types-tabulate", "types-termcolor", "types-toml", "vertica-python (>=0.5.1)", "virtualenv", "watchtower (>=2.0.1,<2.1.0)", "wheel", "yamllint", "zenpy (>=2.0.24)"] -devel-hadoop = ["aiobotocore (>=2.1.1)", "aioresponses", "apache-airflow (>=2.4.0)", "apache-airflow-providers-apache-hdfs", "apache-airflow-providers-apache-hive", "apache-airflow-providers-common-sql", "apache-airflow-providers-presto", "apache-airflow-providers-trino", "astroid (>=2.12.3)", "aws-xray-sdk", "bcrypt (>=2.0.0)", "beautifulsoup4 (>=4.7.1)", "black", "blinker", "bowler", "cgroupspy (>=0.2.2)", "checksumdir", "click (>=8.0)", "click (>=8.0,!=8.1.4,!=8.1.5)", "coverage", "cryptography (>=2.0.0)", "docutils (<0.17.0)", "eralchemy2", "filelock", "flask-bcrypt (>=0.7.1)", "gitpython", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "hmsclient (>=0.1.0)", "impyla (>=0.18.0,<1.0)", "ipdb", "jira", "jsondiff", "jsonpath-ng (>=1.5.3)", "kubernetes (>=21.7.0,<24)", "mongomock", "moto[cloudformation,glue] (>=4.0)", "mypy (==1.2.0)", "mysqlclient (>=1.3.6)", "pandas (>=0.17.1)", "paramiko", "pipdeptree", "pre-commit", "presto-python-client (>=0.8.2)", "pyarrow (>=9.0.0)", "pygithub", "pyhive[hive] (>=0.6.0)", "pykerberos (>=1.1.13)", "pypsrp", "pytest", "pytest-asyncio", "pytest-capture-warnings", "pytest-cov", "pytest-httpx", "pytest-instafail", "pytest-mock", "pytest-rerunfailures", "pytest-timeouts", "pytest-xdist", "python-jose", "pywinrm", "qds-sdk (>=1.9.6)", "requests-kerberos (>=0.10.0)", "requests-mock", "rich-click (>=1.5)", "ruff (>=0.0.219)", "sasl (>=0.3.1)", "semver", "sphinx (>=5.2.0)", "sphinx-airflow-theme", "sphinx-argparse (>=0.1.13)", "sphinx-autoapi (>=2.0.0)", "sphinx-copybutton", "sphinx-jinja (>=2.0)", "sphinx-rtd-theme (>=0.1.6)", "sphinxcontrib-httpdomain (>=1.7.0)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-spelling (>=7.3)", "thrift (>=0.9.2)", "thrift-sasl (>=0.2.0)", "time-machine", "towncrier", "twine", "types-Deprecated", "types-Markdown", "types-PyMySQL", "types-PyYAML", "types-boto", "types-certifi", "types-croniter", "types-docutils", "types-paramiko", "types-protobuf", "types-python-dateutil", "types-python-slugify", "types-pytz", "types-redis", "types-requests", "types-setuptools", "types-tabulate", "types-termcolor", "types-toml", "wheel", "yamllint"] +devel = ["aiobotocore (>=2.1.1)", "aioresponses", "apache-airflow (>=2.6.0)", "apache-airflow-providers-common-sql", "astroid (>=2.12.3,<3.0)", "aws-xray-sdk", "backports.zoneinfo (>=0.2.1)", "bcrypt (>=2.0.0)", "beautifulsoup4 (>=4.7.1)", "black", "blinker", "cgroupspy (>=0.2.2)", "checksumdir", "click (>=8.0)", "click (>=8.0,!=8.1.4,!=8.1.5)", "coverage (>=7.2)", "cryptography (>=2.0.0)", "deltalake (>=0.12.0)", "docutils (<0.17.0)", "duckdb (>=0.9.0)", "eralchemy2", "filelock", "flask-bcrypt (>=0.7.1)", "gitpython", "ipdb", "kubernetes (>=21.7.0,<24)", "mongomock", "moto[cloudformation,glue] (>=4.2.9)", "mypy (==1.2.0)", "mypy-boto3-appflow (>=1.28.0)", "mypy-boto3-rds (>=1.28.0)", "mypy-boto3-redshift-data (>=1.28.0)", "mypy-boto3-s3 (>=1.28.0)", "mysql-connector-python (>=8.0.11)", "mysqlclient (>=1.3.6)", "pandas (>=0.17.1)", "pipdeptree", "pre-commit", "pyarrow (>=9.0.0)", "pyarrow-hotfix", "pygithub", "pyiceberg (>=0.5.0)", "pytest (>=7.1)", "pytest-asyncio (!=0.23.0,!=0.23.1)", "pytest-cov", "pytest-httpx", "pytest-icdiff", "pytest-instafail", "pytest-mock", "pytest-rerunfailures", "pytest-timeouts", "pytest-xdist", "python3-saml (>=1.16.0)", "pywinrm", "requests-mock", "restructuredtext-lint", "rich-click (>=1.7.0)", "ruff (>=0.0.219)", "s3fs (>=2023.10.0)", "semver", "sphinx (>=5.2.0)", "sphinx-airflow-theme", "sphinx-argparse (>=0.1.13)", "sphinx-autoapi (>=2.0.0)", "sphinx-copybutton", "sphinx-design (>=0.5.0)", "sphinx-jinja (>=2.0)", "sphinx-rtd-theme (>=0.1.6)", "sphinxcontrib-httpdomain (>=1.7.0)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-spelling (>=7.3)", "time-machine", "towncrier", "twine", "types-Deprecated", "types-Markdown", "types-PyMySQL", "types-PyYAML", "types-aiofiles", "types-certifi", "types-croniter", "types-docutils", "types-paramiko", "types-protobuf", "types-python-dateutil", "types-python-slugify", "types-pytz", "types-redis", "types-requests", "types-setuptools", "types-tabulate", "types-termcolor", "types-toml", "wheel", "yamllint"] +devel-all = ["PyGithub (!=1.58)", "PyOpenSSL", "adal (>=1.2.7)", "adlfs (>=2023.10.0)", "aiobotocore (>=2.1.1)", "aiofiles (>=23.2.0)", "aiohttp", "aiohttp (>=3.6.3,<4)", "aioresponses", "alibabacloud-adb20211201 (>=1.0.0)", "alibabacloud-tea-openapi (>=0.3.7)", "amqp", "analytics-python (>=1.2.9)", "apache-airflow (>=2.6.0)", "apache-airflow (>=2.7.0)", "apache-airflow (>=2.8.0)", "apache-airflow-providers-airbyte", "apache-airflow-providers-alibaba", "apache-airflow-providers-amazon", "apache-airflow-providers-apache-beam", "apache-airflow-providers-apache-cassandra", "apache-airflow-providers-apache-drill", "apache-airflow-providers-apache-druid", "apache-airflow-providers-apache-flink", "apache-airflow-providers-apache-hdfs", "apache-airflow-providers-apache-hive", "apache-airflow-providers-apache-impala", "apache-airflow-providers-apache-kafka", "apache-airflow-providers-apache-kylin", "apache-airflow-providers-apache-livy", "apache-airflow-providers-apache-pig", "apache-airflow-providers-apache-pinot", "apache-airflow-providers-apache-spark", "apache-airflow-providers-apprise", "apache-airflow-providers-arangodb", "apache-airflow-providers-asana", "apache-airflow-providers-atlassian-jira", "apache-airflow-providers-celery", "apache-airflow-providers-cloudant", "apache-airflow-providers-cncf-kubernetes", "apache-airflow-providers-cohere", "apache-airflow-providers-common-io", "apache-airflow-providers-common-sql", "apache-airflow-providers-databricks", "apache-airflow-providers-datadog", "apache-airflow-providers-dbt-cloud", "apache-airflow-providers-dingding", "apache-airflow-providers-discord", "apache-airflow-providers-docker", "apache-airflow-providers-elasticsearch", "apache-airflow-providers-exasol", "apache-airflow-providers-facebook", "apache-airflow-providers-ftp", "apache-airflow-providers-github", "apache-airflow-providers-google", "apache-airflow-providers-grpc", "apache-airflow-providers-hashicorp", "apache-airflow-providers-http", "apache-airflow-providers-imap", "apache-airflow-providers-influxdb", "apache-airflow-providers-jdbc", "apache-airflow-providers-jenkins", "apache-airflow-providers-microsoft-azure", "apache-airflow-providers-microsoft-mssql", "apache-airflow-providers-microsoft-psrp", "apache-airflow-providers-microsoft-winrm", "apache-airflow-providers-mongo", "apache-airflow-providers-mysql", "apache-airflow-providers-neo4j", "apache-airflow-providers-odbc", "apache-airflow-providers-openai", "apache-airflow-providers-openfaas", "apache-airflow-providers-openlineage", "apache-airflow-providers-opensearch", "apache-airflow-providers-opsgenie", "apache-airflow-providers-oracle", "apache-airflow-providers-pagerduty", "apache-airflow-providers-papermill", "apache-airflow-providers-pgvector", "apache-airflow-providers-pinecone", "apache-airflow-providers-postgres", "apache-airflow-providers-presto", "apache-airflow-providers-redis", "apache-airflow-providers-salesforce", "apache-airflow-providers-samba", "apache-airflow-providers-segment", "apache-airflow-providers-sendgrid", "apache-airflow-providers-sftp", "apache-airflow-providers-singularity", "apache-airflow-providers-slack", "apache-airflow-providers-smtp", "apache-airflow-providers-snowflake", "apache-airflow-providers-sqlite", "apache-airflow-providers-ssh", "apache-airflow-providers-tableau", "apache-airflow-providers-tabular", "apache-airflow-providers-telegram", "apache-airflow-providers-trino", "apache-airflow-providers-vertica", "apache-airflow-providers-weaviate", "apache-airflow-providers-yandex", "apache-airflow-providers-zendesk", "apache-beam (>=2.47.0)", "apprise", "asana (>=0.10,<4.0.0)", "asgiref", "asgiref (>=3.5.2)", "astroid (>=2.12.3,<3.0)", "atlasclient (>=0.1.2)", "atlassian-python-api (>=1.14.2)", "attrs (>=22.2)", "authlib (>=1.0.0)", "aws-xray-sdk", "azure-batch (>=8.0.0)", "azure-cosmos (>=4.0.0)", "azure-datalake-store (>=0.0.45)", "azure-identity (>=1.3.1)", "azure-keyvault-secrets (>=4.1.0)", "azure-kusto-data (>=4.1.0)", "azure-mgmt-containerinstance (>=9.0.0)", "azure-mgmt-containerregistry (>=8.0.0)", "azure-mgmt-cosmosdb", "azure-mgmt-datafactory (>=2.0.0)", "azure-mgmt-datalake-store (>=0.5.0)", "azure-mgmt-resource (>=2.2.0)", "azure-mgmt-storage (>=16.0.0)", "azure-servicebus (>=7.6.1)", "azure-storage-blob (>=12.14.0)", "azure-storage-file-datalake (>=12.9.1)", "azure-storage-file-share", "azure-synapse-artifacts (>=0.17.0)", "azure-synapse-spark", "backports.zoneinfo (>=0.2.1)", "bcrypt (>=2.0.0)", "beautifulsoup4 (>=4.7.1)", "black", "blinker", "blinker (>=1.1)", "boto3 (>=1.28.0)", "botocore (>=1.31.0)", "cassandra-driver (>=3.13.0)", "celery (>=5.3.0,!=5.3.2,!=5.3.3,<6)", "cgroupspy (>=0.2.2)", "checksumdir", "click (>=8.0)", "click (>=8.0,!=8.1.4,!=8.1.5)", "cloudant (>=2.0)", "cohere (>=4.27)", "confluent-kafka (>=1.8.2)", "coverage (>=7.2)", "cryptography (>=2.0.0)", "databricks-sql-connector (>=2.0.0,!=2.9.0,<3.0.0)", "datadog (>=0.14.0)", "deltalake (>=0.12.0)", "dnspython (>=1.13.0)", "docker (>=5.0.3)", "docutils (<0.17.0)", "duckdb (>=0.9.0)", "elasticsearch (>=8.10,<9)", "eralchemy2", "eventlet (>=0.33.3)", "facebook-business (>=6.0.2)", "filelock", "flask-appbuilder[oauth] (==4.3.10)", "flask-bcrypt (>=0.7.1)", "flower (>=1.0.0)", "gcloud-aio-auth (>=4.0.0,<5.0.0)", "gcloud-aio-bigquery (>=6.1.2)", "gcloud-aio-storage", "gcsfs (>=2023.10.0)", "gevent (>=0.13)", "gitpython", "google-ads (>=22.1.0)", "google-api-core (>=2.11.0)", "google-api-python-client (>=1.6.0)", "google-auth (>=1.0.0)", "google-auth (>=1.0.0,<3.0.0)", "google-auth-httplib2 (>=0.0.1)", "google-cloud-aiplatform (>=1.22.1)", "google-cloud-automl (>=2.12.0)", "google-cloud-batch (>=0.13.0)", "google-cloud-bigquery-datatransfer (>=3.13.0)", "google-cloud-bigtable (>=2.17.0)", "google-cloud-build (>=3.22.0)", "google-cloud-compute (>=1.10.0)", "google-cloud-container (>=2.17.4)", "google-cloud-datacatalog (>=3.11.1)", "google-cloud-dataflow-client (>=0.8.6)", "google-cloud-dataform (>=0.5.0)", "google-cloud-dataplex (>=1.10.0)", "google-cloud-dataproc (>=5.8.0)", "google-cloud-dataproc-metastore (>=1.12.0)", "google-cloud-dlp (>=3.12.0)", "google-cloud-kms (>=2.15.0)", "google-cloud-language (>=2.9.0)", "google-cloud-logging (>=3.5.0)", "google-cloud-memcache (>=1.7.0)", "google-cloud-monitoring (>=2.18.0)", "google-cloud-orchestration-airflow (>=1.10.0)", "google-cloud-os-login (>=2.9.1)", "google-cloud-pubsub (>=2.19.0)", "google-cloud-redis (>=2.12.0)", "google-cloud-run (>=0.9.0)", "google-cloud-secret-manager (>=2.16.0)", "google-cloud-spanner (>=3.11.1)", "google-cloud-speech (>=2.18.0)", "google-cloud-storage (>=2.7.0)", "google-cloud-storage-transfer (>=1.4.1)", "google-cloud-tasks (>=2.13.0)", "google-cloud-texttospeech (>=2.14.1)", "google-cloud-translate (>=3.11.0)", "google-cloud-videointelligence (>=2.11.0)", "google-cloud-vision (>=3.4.0)", "google-cloud-workflows (>=1.10.0)", "google-re2 (>=1.0)", "greenlet (>=0.4.9)", "grpcio (>=1.15.0)", "grpcio-gcp (>=0.2.2)", "grpcio-status", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "hmsclient (>=0.1.0)", "httpx", "hvac (>=0.10)", "impyla (>=0.18.0,<1.0)", "inflection (>=0.5.1)", "influxdb-client (>=1.19.0)", "ipdb", "ipykernel", "jaydebeapi (>=1.1.1)", "json-merge-patch (>=0.2)", "jsonpath-ng (>=1.5.3)", "kubernetes (>=21.7.0,<24)", "kubernetes-asyncio (>=18.20.1,<25)", "kylinpy (>=2.6)", "ldap3 (>=2.5.1)", "looker-sdk (>=22.2.0)", "mongomock", "moto[cloudformation,glue] (>=4.2.9)", "mypy (==1.2.0)", "mypy-boto3-appflow (>=1.28.0)", "mypy-boto3-rds (>=1.28.0)", "mypy-boto3-redshift-data (>=1.28.0)", "mypy-boto3-s3 (>=1.28.0)", "mysql-connector-python (>=8.0.11)", "mysqlclient (>=1.3.6)", "neo4j (>=4.2.1)", "openai[datalib] (>=1.0)", "openlineage-integration-common (>=0.28.0)", "openlineage-python (>=0.28.0)", "opensearch-py (>=2.2.0)", "opentelemetry-exporter-prometheus", "opsgenie-sdk (>=2.1.5)", "oracledb (>=1.0.0)", "oss2 (>=2.14.0)", "pandas (>=0.17.1)", "pandas-gbq", "papermill[all] (>=1.2.1)", "paramiko (>=2.6.0)", "paramiko (>=2.8.0)", "pdpyras (>=4.1.2)", "pgvector (>=0.2.3)", "pinecone-client (>=2.2.4)", "pinotdb (>0.4.7)", "pipdeptree", "plyvel", "pre-commit", "presto-python-client (>=0.8.4)", "proto-plus (>=1.19.6)", "psycopg2-binary (>=2.8.0)", "pyarrow (>=9.0.0)", "pyarrow-hotfix", "pydruid (>=0.4.1)", "pyexasol (>=0.5.1)", "pygithub", "pyhive[hive-pure-sasl] (>=0.7.0)", "pyiceberg (>=0.5.0)", "pykerberos (>=1.1.13)", "pymongo (>=3.6.0)", "pymssql (>=2.1.8)", "pyodbc", "pypsrp (>=0.8.0)", "pyspark", "pytest (>=7.1)", "pytest-asyncio (!=0.23.0,!=0.23.1)", "pytest-cov", "pytest-httpx", "pytest-icdiff", "pytest-instafail", "pytest-mock", "pytest-rerunfailures", "pytest-timeouts", "pytest-xdist", "python-arango (>=7.3.2)", "python-dotenv (>=0.21.0)", "python-jenkins (>=1.0.0)", "python-ldap", "python-telegram-bot (>=20.0.0)", "python3-saml (>=1.16.0)", "pywinrm", "pywinrm (>=0.4)", "redis (>=4.5.2,!=4.5.5,<5.0.0)", "redshift-connector (>=2.0.888)", "requests (>=2.26.0)", "requests (>=2.27,<3)", "requests-kerberos (>=0.10.0)", "requests-mock", "requests-toolbelt", "restructuredtext-lint", "rich-click (>=1.7.0)", "ruff (>=0.0.219)", "s3fs (>=2023.10.0)", "scrapbook[all]", "semver", "sendgrid (>=6.0.0)", "sentry-sdk (>=1.32.0,!=1.33.0)", "simple-salesforce (>=1.0.0)", "slack-sdk (>=3.0.0)", "smbprotocol (>=1.5.0)", "snowflake-connector-python (>=2.7.8)", "snowflake-sqlalchemy (>=1.1.0)", "sphinx (>=5.2.0)", "sphinx-airflow-theme", "sphinx-argparse (>=0.1.13)", "sphinx-autoapi (>=2.0.0)", "sphinx-copybutton", "sphinx-design (>=0.5.0)", "sphinx-jinja (>=2.0)", "sphinx-rtd-theme (>=0.1.6)", "sphinxcontrib-httpdomain (>=1.7.0)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-spelling (>=7.3)", "spython (>=0.0.56)", "sqlalchemy-bigquery (>=1.2.1)", "sqlalchemy-drill (>=1.1.0)", "sqlalchemy-redshift (>=0.8.6)", "sqlalchemy-spanner (>=1.6.2)", "sqlparse (>=0.4.2)", "sshtunnel (>=0.3.2)", "statsd (>=3.3.0)", "tableauserverclient", "thrift (>=0.9.2)", "thrift-sasl (>=0.2.0)", "time-machine", "towncrier", "trino (>=0.318.0)", "twine", "types-Deprecated", "types-Markdown", "types-PyMySQL", "types-PyYAML", "types-aiofiles", "types-certifi", "types-croniter", "types-docutils", "types-paramiko", "types-protobuf", "types-python-dateutil", "types-python-slugify", "types-pytz", "types-redis", "types-requests", "types-setuptools", "types-tabulate", "types-termcolor", "types-toml", "vertica-python (>=0.5.1)", "virtualenv", "watchtower (>=2.0.1,<4)", "weaviate-client (>=3.24.2)", "wheel", "yamllint", "yandexcloud (>=0.228.0)", "zenpy (>=2.0.24)"] +devel-ci = ["PyGithub (!=1.58)", "PyOpenSSL", "adal (>=1.2.7)", "adlfs (>=2023.10.0)", "aiobotocore (>=2.1.1)", "aiofiles (>=23.2.0)", "aiohttp", "aiohttp (>=3.6.3,<4)", "aioresponses", "alibabacloud-adb20211201 (>=1.0.0)", "alibabacloud-tea-openapi (>=0.3.7)", "amqp", "analytics-python (>=1.2.9)", "apache-airflow (>=2.6.0)", "apache-airflow (>=2.7.0)", "apache-airflow (>=2.8.0)", "apache-airflow-providers-airbyte", "apache-airflow-providers-alibaba", "apache-airflow-providers-amazon", "apache-airflow-providers-apache-beam", "apache-airflow-providers-apache-cassandra", "apache-airflow-providers-apache-drill", "apache-airflow-providers-apache-druid", "apache-airflow-providers-apache-flink", "apache-airflow-providers-apache-hdfs", "apache-airflow-providers-apache-hive", "apache-airflow-providers-apache-impala", "apache-airflow-providers-apache-kafka", "apache-airflow-providers-apache-kylin", "apache-airflow-providers-apache-livy", "apache-airflow-providers-apache-pig", "apache-airflow-providers-apache-pinot", "apache-airflow-providers-apache-spark", "apache-airflow-providers-apprise", "apache-airflow-providers-arangodb", "apache-airflow-providers-asana", "apache-airflow-providers-atlassian-jira", "apache-airflow-providers-celery", "apache-airflow-providers-cloudant", "apache-airflow-providers-cncf-kubernetes", "apache-airflow-providers-cohere", "apache-airflow-providers-common-io", "apache-airflow-providers-common-sql", "apache-airflow-providers-databricks", "apache-airflow-providers-datadog", "apache-airflow-providers-dbt-cloud", "apache-airflow-providers-dingding", "apache-airflow-providers-discord", "apache-airflow-providers-docker", "apache-airflow-providers-elasticsearch", "apache-airflow-providers-exasol", "apache-airflow-providers-facebook", "apache-airflow-providers-ftp", "apache-airflow-providers-github", "apache-airflow-providers-google", "apache-airflow-providers-grpc", "apache-airflow-providers-hashicorp", "apache-airflow-providers-http", "apache-airflow-providers-imap", "apache-airflow-providers-influxdb", "apache-airflow-providers-jdbc", "apache-airflow-providers-jenkins", "apache-airflow-providers-microsoft-azure", "apache-airflow-providers-microsoft-mssql", "apache-airflow-providers-microsoft-psrp", "apache-airflow-providers-microsoft-winrm", "apache-airflow-providers-mongo", "apache-airflow-providers-mysql", "apache-airflow-providers-neo4j", "apache-airflow-providers-odbc", "apache-airflow-providers-openai", "apache-airflow-providers-openfaas", "apache-airflow-providers-openlineage", "apache-airflow-providers-opensearch", "apache-airflow-providers-opsgenie", "apache-airflow-providers-oracle", "apache-airflow-providers-pagerduty", "apache-airflow-providers-papermill", "apache-airflow-providers-pgvector", "apache-airflow-providers-pinecone", "apache-airflow-providers-postgres", "apache-airflow-providers-presto", "apache-airflow-providers-redis", "apache-airflow-providers-salesforce", "apache-airflow-providers-samba", "apache-airflow-providers-segment", "apache-airflow-providers-sendgrid", "apache-airflow-providers-sftp", "apache-airflow-providers-singularity", "apache-airflow-providers-slack", "apache-airflow-providers-smtp", "apache-airflow-providers-snowflake", "apache-airflow-providers-sqlite", "apache-airflow-providers-ssh", "apache-airflow-providers-tableau", "apache-airflow-providers-tabular", "apache-airflow-providers-telegram", "apache-airflow-providers-trino", "apache-airflow-providers-vertica", "apache-airflow-providers-weaviate", "apache-airflow-providers-yandex", "apache-airflow-providers-zendesk", "apache-beam (>=2.47.0)", "apprise", "asana (>=0.10,<4.0.0)", "asgiref", "asgiref (>=3.5.2)", "astroid (>=2.12.3,<3.0)", "atlasclient (>=0.1.2)", "atlassian-python-api (>=1.14.2)", "attrs (>=22.2)", "authlib (>=1.0.0)", "aws-xray-sdk", "azure-batch (>=8.0.0)", "azure-cosmos (>=4.0.0)", "azure-datalake-store (>=0.0.45)", "azure-identity (>=1.3.1)", "azure-keyvault-secrets (>=4.1.0)", "azure-kusto-data (>=4.1.0)", "azure-mgmt-containerinstance (>=9.0.0)", "azure-mgmt-containerregistry (>=8.0.0)", "azure-mgmt-cosmosdb", "azure-mgmt-datafactory (>=2.0.0)", "azure-mgmt-datalake-store (>=0.5.0)", "azure-mgmt-resource (>=2.2.0)", "azure-mgmt-storage (>=16.0.0)", "azure-servicebus (>=7.6.1)", "azure-storage-blob (>=12.14.0)", "azure-storage-file-datalake (>=12.9.1)", "azure-storage-file-share", "azure-synapse-artifacts (>=0.17.0)", "azure-synapse-spark", "backports.zoneinfo (>=0.2.1)", "bcrypt (>=2.0.0)", "beautifulsoup4 (>=4.7.1)", "black", "blinker", "blinker (>=1.1)", "boto3 (>=1.28.0)", "botocore (>=1.31.0)", "cassandra-driver (>=3.13.0)", "celery (>=5.3.0,!=5.3.2,!=5.3.3,<6)", "cgroupspy (>=0.2.2)", "checksumdir", "click (>=8.0)", "click (>=8.0,!=8.1.4,!=8.1.5)", "cloudant (>=2.0)", "cohere (>=4.27)", "confluent-kafka (>=1.8.2)", "coverage (>=7.2)", "cryptography (>=2.0.0)", "databricks-sql-connector (>=2.0.0,!=2.9.0,<3.0.0)", "datadog (>=0.14.0)", "deltalake (>=0.12.0)", "dnspython (>=1.13.0)", "docker (>=5.0.3)", "docutils (<0.17.0)", "duckdb (>=0.9.0)", "elasticsearch (>=8.10,<9)", "eralchemy2", "eventlet (>=0.33.3)", "facebook-business (>=6.0.2)", "filelock", "flask-appbuilder[oauth] (==4.3.10)", "flask-bcrypt (>=0.7.1)", "flower (>=1.0.0)", "gcloud-aio-auth (>=4.0.0,<5.0.0)", "gcloud-aio-bigquery (>=6.1.2)", "gcloud-aio-storage", "gcsfs (>=2023.10.0)", "gevent (>=0.13)", "gitpython", "google-ads (>=22.1.0)", "google-api-core (>=2.11.0)", "google-api-python-client (>=1.6.0)", "google-auth (>=1.0.0)", "google-auth (>=1.0.0,<3.0.0)", "google-auth-httplib2 (>=0.0.1)", "google-cloud-aiplatform (>=1.22.1)", "google-cloud-automl (>=2.12.0)", "google-cloud-batch (>=0.13.0)", "google-cloud-bigquery-datatransfer (>=3.13.0)", "google-cloud-bigtable (>=2.17.0)", "google-cloud-build (>=3.22.0)", "google-cloud-compute (>=1.10.0)", "google-cloud-container (>=2.17.4)", "google-cloud-datacatalog (>=3.11.1)", "google-cloud-dataflow-client (>=0.8.6)", "google-cloud-dataform (>=0.5.0)", "google-cloud-dataplex (>=1.10.0)", "google-cloud-dataproc (>=5.8.0)", "google-cloud-dataproc-metastore (>=1.12.0)", "google-cloud-dlp (>=3.12.0)", "google-cloud-kms (>=2.15.0)", "google-cloud-language (>=2.9.0)", "google-cloud-logging (>=3.5.0)", "google-cloud-memcache (>=1.7.0)", "google-cloud-monitoring (>=2.18.0)", "google-cloud-orchestration-airflow (>=1.10.0)", "google-cloud-os-login (>=2.9.1)", "google-cloud-pubsub (>=2.19.0)", "google-cloud-redis (>=2.12.0)", "google-cloud-run (>=0.9.0)", "google-cloud-secret-manager (>=2.16.0)", "google-cloud-spanner (>=3.11.1)", "google-cloud-speech (>=2.18.0)", "google-cloud-storage (>=2.7.0)", "google-cloud-storage-transfer (>=1.4.1)", "google-cloud-tasks (>=2.13.0)", "google-cloud-texttospeech (>=2.14.1)", "google-cloud-translate (>=3.11.0)", "google-cloud-videointelligence (>=2.11.0)", "google-cloud-vision (>=3.4.0)", "google-cloud-workflows (>=1.10.0)", "google-re2 (>=1.0)", "greenlet (>=0.4.9)", "grpcio (>=1.15.0)", "grpcio-gcp (>=0.2.2)", "grpcio-status", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "hmsclient (>=0.1.0)", "httpx", "hvac (>=0.10)", "impyla (>=0.18.0,<1.0)", "inflection (>=0.5.1)", "influxdb-client (>=1.19.0)", "ipdb", "ipykernel", "jaydebeapi (>=1.1.1)", "json-merge-patch (>=0.2)", "jsonpath-ng (>=1.5.3)", "kubernetes (>=21.7.0,<24)", "kubernetes-asyncio (>=18.20.1,<25)", "kylinpy (>=2.6)", "ldap3 (>=2.5.1)", "looker-sdk (>=22.2.0)", "mongomock", "moto[cloudformation,glue] (>=4.2.9)", "mypy (==1.2.0)", "mypy-boto3-appflow (>=1.28.0)", "mypy-boto3-rds (>=1.28.0)", "mypy-boto3-redshift-data (>=1.28.0)", "mypy-boto3-s3 (>=1.28.0)", "mysql-connector-python (>=8.0.11)", "mysqlclient (>=1.3.6)", "neo4j (>=4.2.1)", "openai[datalib] (>=1.0)", "openlineage-integration-common (>=0.28.0)", "openlineage-python (>=0.28.0)", "opensearch-py (>=2.2.0)", "opentelemetry-exporter-prometheus", "opsgenie-sdk (>=2.1.5)", "oracledb (>=1.0.0)", "oss2 (>=2.14.0)", "pandas (>=0.17.1)", "pandas-gbq", "papermill[all] (>=1.2.1)", "paramiko (>=2.6.0)", "paramiko (>=2.8.0)", "pdpyras (>=4.1.2)", "pgvector (>=0.2.3)", "pinecone-client (>=2.2.4)", "pinotdb (>0.4.7)", "pipdeptree", "plyvel", "pre-commit", "presto-python-client (>=0.8.4)", "proto-plus (>=1.19.6)", "psycopg2-binary (>=2.8.0)", "pyarrow (>=9.0.0)", "pyarrow-hotfix", "pydruid (>=0.4.1)", "pyexasol (>=0.5.1)", "pygithub", "pyhive[hive-pure-sasl] (>=0.7.0)", "pyiceberg (>=0.5.0)", "pykerberos (>=1.1.13)", "pymongo (>=3.6.0)", "pymssql (>=2.1.8)", "pyodbc", "pypsrp (>=0.8.0)", "pyspark", "pytest (>=7.1)", "pytest-asyncio (!=0.23.0,!=0.23.1)", "pytest-cov", "pytest-httpx", "pytest-icdiff", "pytest-instafail", "pytest-mock", "pytest-rerunfailures", "pytest-timeouts", "pytest-xdist", "python-arango (>=7.3.2)", "python-dotenv (>=0.21.0)", "python-jenkins (>=1.0.0)", "python-ldap", "python-telegram-bot (>=20.0.0)", "python3-saml (>=1.16.0)", "pywinrm", "pywinrm (>=0.4)", "redis (>=4.5.2,!=4.5.5,<5.0.0)", "redshift-connector (>=2.0.888)", "requests (>=2.26.0)", "requests (>=2.27,<3)", "requests-kerberos (>=0.10.0)", "requests-mock", "requests-toolbelt", "restructuredtext-lint", "rich-click (>=1.7.0)", "ruff (>=0.0.219)", "s3fs (>=2023.10.0)", "scrapbook[all]", "semver", "sendgrid (>=6.0.0)", "sentry-sdk (>=1.32.0,!=1.33.0)", "simple-salesforce (>=1.0.0)", "slack-sdk (>=3.0.0)", "smbprotocol (>=1.5.0)", "snowflake-connector-python (>=2.7.8)", "snowflake-sqlalchemy (>=1.1.0)", "sphinx (>=5.2.0)", "sphinx-airflow-theme", "sphinx-argparse (>=0.1.13)", "sphinx-autoapi (>=2.0.0)", "sphinx-copybutton", "sphinx-design (>=0.5.0)", "sphinx-jinja (>=2.0)", "sphinx-rtd-theme (>=0.1.6)", "sphinxcontrib-httpdomain (>=1.7.0)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-spelling (>=7.3)", "spython (>=0.0.56)", "sqlalchemy-bigquery (>=1.2.1)", "sqlalchemy-drill (>=1.1.0)", "sqlalchemy-redshift (>=0.8.6)", "sqlalchemy-spanner (>=1.6.2)", "sqlparse (>=0.4.2)", "sshtunnel (>=0.3.2)", "statsd (>=3.3.0)", "tableauserverclient", "thrift (>=0.9.2)", "thrift-sasl (>=0.2.0)", "time-machine", "towncrier", "trino (>=0.318.0)", "twine", "types-Deprecated", "types-Markdown", "types-PyMySQL", "types-PyYAML", "types-aiofiles", "types-certifi", "types-croniter", "types-docutils", "types-paramiko", "types-protobuf", "types-python-dateutil", "types-python-slugify", "types-pytz", "types-redis", "types-requests", "types-setuptools", "types-tabulate", "types-termcolor", "types-toml", "vertica-python (>=0.5.1)", "virtualenv", "watchtower (>=2.0.1,<4)", "weaviate-client (>=3.24.2)", "wheel", "yamllint", "yandexcloud (>=0.228.0)", "zenpy (>=2.0.24)"] +devel-hadoop = ["aiobotocore (>=2.1.1)", "aioresponses", "apache-airflow (>=2.6.0)", "apache-airflow-providers-apache-hdfs", "apache-airflow-providers-apache-hive", "apache-airflow-providers-common-sql", "apache-airflow-providers-presto", "apache-airflow-providers-trino", "astroid (>=2.12.3,<3.0)", "aws-xray-sdk", "backports.zoneinfo (>=0.2.1)", "bcrypt (>=2.0.0)", "beautifulsoup4 (>=4.7.1)", "black", "blinker", "cgroupspy (>=0.2.2)", "checksumdir", "click (>=8.0)", "click (>=8.0,!=8.1.4,!=8.1.5)", "coverage (>=7.2)", "cryptography (>=2.0.0)", "deltalake (>=0.12.0)", "docutils (<0.17.0)", "duckdb (>=0.9.0)", "eralchemy2", "filelock", "flask-bcrypt (>=0.7.1)", "gitpython", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "hmsclient (>=0.1.0)", "impyla (>=0.18.0,<1.0)", "ipdb", "kubernetes (>=21.7.0,<24)", "mongomock", "moto[cloudformation,glue] (>=4.2.9)", "mypy (==1.2.0)", "mypy-boto3-appflow (>=1.28.0)", "mypy-boto3-rds (>=1.28.0)", "mypy-boto3-redshift-data (>=1.28.0)", "mypy-boto3-s3 (>=1.28.0)", "mysql-connector-python (>=8.0.11)", "mysqlclient (>=1.3.6)", "pandas (>=0.17.1)", "pipdeptree", "pre-commit", "presto-python-client (>=0.8.4)", "pyarrow (>=9.0.0)", "pyarrow-hotfix", "pygithub", "pyhive[hive-pure-sasl] (>=0.7.0)", "pyiceberg (>=0.5.0)", "pykerberos (>=1.1.13)", "pytest (>=7.1)", "pytest-asyncio (!=0.23.0,!=0.23.1)", "pytest-cov", "pytest-httpx", "pytest-icdiff", "pytest-instafail", "pytest-mock", "pytest-rerunfailures", "pytest-timeouts", "pytest-xdist", "python3-saml (>=1.16.0)", "pywinrm", "requests-kerberos (>=0.10.0)", "requests-mock", "restructuredtext-lint", "rich-click (>=1.7.0)", "ruff (>=0.0.219)", "s3fs (>=2023.10.0)", "semver", "sphinx (>=5.2.0)", "sphinx-airflow-theme", "sphinx-argparse (>=0.1.13)", "sphinx-autoapi (>=2.0.0)", "sphinx-copybutton", "sphinx-design (>=0.5.0)", "sphinx-jinja (>=2.0)", "sphinx-rtd-theme (>=0.1.6)", "sphinxcontrib-httpdomain (>=1.7.0)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-spelling (>=7.3)", "thrift (>=0.9.2)", "thrift-sasl (>=0.2.0)", "time-machine", "towncrier", "twine", "types-Deprecated", "types-Markdown", "types-PyMySQL", "types-PyYAML", "types-aiofiles", "types-certifi", "types-croniter", "types-docutils", "types-paramiko", "types-protobuf", "types-python-dateutil", "types-python-slugify", "types-pytz", "types-redis", "types-requests", "types-setuptools", "types-tabulate", "types-termcolor", "types-toml", "wheel", "yamllint"] dingding = ["apache-airflow-providers-dingding"] discord = ["apache-airflow-providers-discord"] -doc = ["astroid (>=2.12.3)", "checksumdir", "click (>=8.0,!=8.1.4,!=8.1.5)", "docutils (<0.17.0)", "eralchemy2", "sphinx (>=5.2.0)", "sphinx-airflow-theme", "sphinx-argparse (>=0.1.13)", "sphinx-autoapi (>=2.0.0)", "sphinx-copybutton", "sphinx-jinja (>=2.0)", "sphinx-rtd-theme (>=0.1.6)", "sphinxcontrib-httpdomain (>=1.7.0)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-spelling (>=7.3)"] +doc = ["astroid (>=2.12.3,<3.0)", "checksumdir", "click (>=8.0,!=8.1.4,!=8.1.5)", "docutils (<0.17.0)", "eralchemy2", "sphinx (>=5.2.0)", "sphinx-airflow-theme", "sphinx-argparse (>=0.1.13)", "sphinx-autoapi (>=2.0.0)", "sphinx-copybutton", "sphinx-design (>=0.5.0)", "sphinx-jinja (>=2.0)", "sphinx-rtd-theme (>=0.1.6)", "sphinxcontrib-httpdomain (>=1.7.0)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-spelling (>=7.3)"] doc-gen = ["eralchemy2"] docker = ["apache-airflow-providers-docker"] druid = ["apache-airflow-providers-apache-druid"] @@ -337,9 +348,9 @@ ftp = ["apache-airflow-providers-ftp"] gcp = ["apache-airflow-providers-google"] gcp-api = ["apache-airflow-providers-google"] github = ["apache-airflow-providers-github"] -github-enterprise = ["authlib (>=1.0.0)", "flask-appbuilder[oauth] (==4.3.3)"] +github-enterprise = ["authlib (>=1.0.0)", "flask-appbuilder[oauth] (==4.3.10)"] google = ["apache-airflow-providers-google"] -google-auth = ["authlib (>=1.0.0)", "flask-appbuilder[oauth] (==4.3.3)"] +google-auth = ["authlib (>=1.0.0)", "flask-appbuilder[oauth] (==4.3.10)"] grpc = ["apache-airflow-providers-grpc"] hashicorp = ["apache-airflow-providers-hashicorp"] hdfs = ["apache-airflow-providers-apache-hdfs"] @@ -350,7 +361,7 @@ influxdb = ["apache-airflow-providers-influxdb"] jdbc = ["apache-airflow-providers-jdbc"] jenkins = ["apache-airflow-providers-jenkins"] kerberos = ["pykerberos (>=1.1.13)", "requests-kerberos (>=0.10.0)", "thrift-sasl (>=0.2.0)"] -kubernetes = ["apache-airflow (>=2.4.0)", "apache-airflow-providers-cncf-kubernetes", "asgiref (>=3.5.2)", "cryptography (>=2.0.0)", "kubernetes (>=21.7.0,<24)", "kubernetes-asyncio (>=18.20.1,<25)"] +kubernetes = ["aiofiles (>=23.2.0)", "apache-airflow (>=2.6.0)", "apache-airflow-providers-cncf-kubernetes", "asgiref (>=3.5.2)", "cryptography (>=2.0.0)", "google-re2 (>=1.0)", "kubernetes (>=21.7.0,<24)", "kubernetes-asyncio (>=18.20.1,<25)"] ldap = ["ldap3 (>=2.5.1)", "python-ldap"] leveldb = ["plyvel"] microsoft-azure = ["apache-airflow-providers-microsoft-azure"] @@ -362,29 +373,32 @@ mssql = ["apache-airflow-providers-microsoft-mssql"] mysql = ["apache-airflow-providers-mysql"] neo4j = ["apache-airflow-providers-neo4j"] odbc = ["apache-airflow-providers-odbc"] +openai = ["apache-airflow-providers-openai"] openfaas = ["apache-airflow-providers-openfaas"] openlineage = ["apache-airflow-providers-openlineage"] +opensearch = ["apache-airflow-providers-opensearch"] opsgenie = ["apache-airflow-providers-opsgenie"] oracle = ["apache-airflow-providers-oracle"] otel = ["opentelemetry-exporter-prometheus"] pagerduty = ["apache-airflow-providers-pagerduty"] -pandas = ["pandas (>=0.17.1)", "pyarrow (>=9.0.0)"] +pandas = ["pandas (>=0.17.1)", "pyarrow (>=9.0.0)", "pyarrow-hotfix"] papermill = ["apache-airflow-providers-papermill"] password = ["bcrypt (>=2.0.0)", "flask-bcrypt (>=0.7.1)"] +pgvector = ["apache-airflow-providers-pgvector"] +pinecone = ["apache-airflow-providers-pinecone"] pinot = ["apache-airflow-providers-apache-pinot"] -plexus = ["apache-airflow-providers-plexus"] postgres = ["apache-airflow-providers-postgres"] presto = ["apache-airflow-providers-presto"] -qds = ["apache-airflow-providers-qubole"] -qubole = ["apache-airflow-providers-qubole"] rabbitmq = ["amqp"] redis = ["apache-airflow-providers-redis"] s3 = ["apache-airflow-providers-amazon"] +s3fs = ["s3fs (>=2023.10.0)"] salesforce = ["apache-airflow-providers-salesforce"] samba = ["apache-airflow-providers-samba"] +saml = ["python3-saml (>=1.16.0)"] segment = ["apache-airflow-providers-segment"] sendgrid = ["apache-airflow-providers-sendgrid"] -sentry = ["blinker (>=1.1)", "sentry-sdk (>=0.8.0)"] +sentry = ["blinker (>=1.1)", "sentry-sdk (>=1.32.0,!=1.33.0)"] sftp = ["apache-airflow-providers-sftp"] singularity = ["apache-airflow-providers-singularity"] slack = ["apache-airflow-providers-slack"] @@ -400,23 +414,25 @@ telegram = ["apache-airflow-providers-telegram"] trino = ["apache-airflow-providers-trino"] vertica = ["apache-airflow-providers-vertica"] virtualenv = ["virtualenv"] +weaviate = ["apache-airflow-providers-weaviate"] webhdfs = ["hdfs[avro,dataframe,kerberos] (>=2.0.4)"] winrm = ["apache-airflow-providers-microsoft-winrm"] +yandex = ["apache-airflow-providers-yandex"] zendesk = ["apache-airflow-providers-zendesk"] [[package]] name = "apache-airflow-providers-common-sql" -version = "1.7.0" +version = "1.8.0" description = "Provider for Apache Airflow. Implements apache-airflow-providers-common-sql package" optional = false python-versions = "~=3.8" files = [ - {file = "apache-airflow-providers-common-sql-1.7.0.tar.gz", hash = "sha256:dfead1b6e874d176c476779d3089431dd066d3a1c2348fb5aebddd8afe0da458"}, - {file = "apache_airflow_providers_common_sql-1.7.0-py3-none-any.whl", hash = "sha256:6b3c27f99be524091d91e22e5d5075cb7b5b8cd7a763906271f38c72da947db2"}, + {file = "apache-airflow-providers-common-sql-1.8.0.tar.gz", hash = "sha256:4d8d99f33f7b5a3e313ef12c5a2f10d1612477ed2e784d0ffb721447e076e3f7"}, + {file = "apache_airflow_providers_common_sql-1.8.0-py3-none-any.whl", hash = "sha256:45117fa38f5a2e83cdb9a8d3bdfdbd602bfdc7a894d087b26e6ebb94df79ec32"}, ] [package.dependencies] -apache-airflow = ">=2.4.0" +apache-airflow = ">=2.5.0" sqlparse = ">=0.4.2" [package.extras] @@ -425,46 +441,48 @@ pandas = ["pandas (>=0.17.1)"] [[package]] name = "apache-airflow-providers-ftp" -version = "3.5.0" +version = "3.6.0" description = "Provider for Apache Airflow. Implements apache-airflow-providers-ftp package" optional = false python-versions = "~=3.8" files = [ - {file = "apache-airflow-providers-ftp-3.5.0.tar.gz", hash = "sha256:7afc424242c309adf48138edbbba33536152fcbb8c09ee70bbb6ba932c323831"}, - {file = "apache_airflow_providers_ftp-3.5.0-py3-none-any.whl", hash = "sha256:87a8c86d8c5a7a7adbf99a1d88628ac17e658ad134b53ac5e885aa0d192159b6"}, + {file = "apache-airflow-providers-ftp-3.6.0.tar.gz", hash = "sha256:160f12e9f78ffbcdca4bdffbac93c1f04641fd3f1f7d236c7bfe79cd0a68d14b"}, + {file = "apache_airflow_providers_ftp-3.6.0-py3-none-any.whl", hash = "sha256:03264207293710c3821f5ccd548c5e89a3c5ca7562bc4ff629e6f73d112a71a4"}, ] [package.dependencies] -apache-airflow = ">=2.4.0" +apache-airflow = ">=2.5.0" [package.extras] openlineage = ["apache-airflow-providers-openlineage"] [[package]] name = "apache-airflow-providers-google" -version = "10.6.0" -description = "Provider for Apache Airflow. Implements apache-airflow-providers-google package" +version = "10.12.0" +description = "Provider package apache-airflow-providers-google for Apache Airflow" optional = false python-versions = "~=3.8" files = [ - {file = "apache-airflow-providers-google-10.6.0.tar.gz", hash = "sha256:2d801bb5f78ad2e5416632c1b5792b818e75a0dbccd1b6305e5193decce1947a"}, - {file = "apache_airflow_providers_google-10.6.0-py3-none-any.whl", hash = "sha256:1a7741db32a4dfe5b7721c4ed1d52632476cb1e5da19ccaea4c907019114c0a1"}, + {file = "apache_airflow_providers_google-10.12.0-py3-none-any.whl", hash = "sha256:a79c845382e672eab30757dfcd62cee8de5ac766e2d38558e1eb3e5fc1b00990"}, + {file = "apache_airflow_providers_google-10.12.0.tar.gz", hash = "sha256:cedfd906b054036c2d0de40b9ecfa70d45828945b47313c37e9722ba275a9028"}, ] [package.dependencies] -apache-airflow = ">=2.4.0" -apache-airflow-providers-common-sql = ">=1.3.1" +apache-airflow = ">=2.5.0" +apache-airflow-providers-common-sql = ">=1.7.2" asgiref = ">=3.5.2" gcloud-aio-auth = ">=4.0.0,<5.0.0" gcloud-aio-bigquery = ">=6.1.2" gcloud-aio-storage = "*" -google-ads = ">=21.2.0" +gcsfs = ">=2023.9.2" +google-ads = ">=22.1.0" google-api-core = ">=2.11.0" google-api-python-client = ">=1.6.0" google-auth = ">=1.0.0" google-auth-httplib2 = ">=0.0.1" google-cloud-aiplatform = ">=1.22.1" google-cloud-automl = ">=2.11.0" +google-cloud-batch = ">=0.13.0" google-cloud-bigquery-datatransfer = ">=3.11.0" google-cloud-bigtable = ">=2.17.0" google-cloud-build = ">=3.13.0" @@ -474,7 +492,7 @@ google-cloud-datacatalog = ">=3.11.1" google-cloud-dataflow-client = ">=0.8.2" google-cloud-dataform = ">=0.5.0" google-cloud-dataplex = ">=1.4.2" -google-cloud-dataproc = ">=5.4.0" +google-cloud-dataproc = ">=5.5.0" google-cloud-dataproc-metastore = ">=1.12.0" google-cloud-dlp = ">=3.12.0" google-cloud-kms = ">=2.15.0" @@ -486,6 +504,7 @@ google-cloud-orchestration-airflow = ">=1.7.0" google-cloud-os-login = ">=2.9.1" google-cloud-pubsub = ">=2.15.0" google-cloud-redis = ">=2.12.0" +google-cloud-run = ">=0.9.0" google-cloud-secret-manager = ">=2.16.0" google-cloud-spanner = ">=3.11.1" google-cloud-speech = ">=2.18.0" @@ -530,49 +549,49 @@ trino = ["apache-airflow-providers-trino"] [[package]] name = "apache-airflow-providers-http" -version = "4.5.0" +version = "4.6.0" description = "Provider for Apache Airflow. Implements apache-airflow-providers-http package" optional = false python-versions = "~=3.8" files = [ - {file = "apache-airflow-providers-http-4.5.0.tar.gz", hash = "sha256:bdbccab003e6be2375d5b44fb86569047c8e15f364ad7ab82e95d3207526ada0"}, - {file = "apache_airflow_providers_http-4.5.0-py3-none-any.whl", hash = "sha256:3f0d6f64911ca55bfc73eb9a3b5b8eeec0434e9ee37cd3dd7ee17a11a24c968e"}, + {file = "apache-airflow-providers-http-4.6.0.tar.gz", hash = "sha256:c9b08782031daa8c18ba62c2c8ae687659968d636fbf6b9fbed488d1fe4f0162"}, + {file = "apache_airflow_providers_http-4.6.0-py3-none-any.whl", hash = "sha256:ca3cf6c209cb27144fd4d676ee5feef96a1ed67002f13bf4a8b74d859ef8b56c"}, ] [package.dependencies] aiohttp = "*" -apache-airflow = ">=2.4.0" +apache-airflow = ">=2.5.0" asgiref = "*" requests = ">=2.26.0" requests-toolbelt = "*" [[package]] name = "apache-airflow-providers-imap" -version = "3.3.0" +version = "3.4.0" description = "Provider for Apache Airflow. Implements apache-airflow-providers-imap package" optional = false python-versions = "~=3.8" files = [ - {file = "apache-airflow-providers-imap-3.3.0.tar.gz", hash = "sha256:8c32f7bcb6df6807ed40d0df573f663dd922ff2a226fe4042b82d42afd8b0e0d"}, - {file = "apache_airflow_providers_imap-3.3.0-py3-none-any.whl", hash = "sha256:2085946878ca81eb724afcf5f279cb0d1e2954c5f558b471ff542bfa06cedb2a"}, + {file = "apache-airflow-providers-imap-3.4.0.tar.gz", hash = "sha256:347f78efa0e1353f90be78244fad0136d7c0cb1af25b9a3ba296d4e31fb53f6c"}, + {file = "apache_airflow_providers_imap-3.4.0-py3-none-any.whl", hash = "sha256:4972793b0dbb25d5372fe1bf174329958075985c0beca013459ec89fcbbca620"}, ] [package.dependencies] -apache-airflow = ">=2.4.0" +apache-airflow = ">=2.5.0" [[package]] name = "apache-airflow-providers-sqlite" -version = "3.4.3" +version = "3.5.0" description = "Provider for Apache Airflow. Implements apache-airflow-providers-sqlite package" optional = false python-versions = "~=3.8" files = [ - {file = "apache-airflow-providers-sqlite-3.4.3.tar.gz", hash = "sha256:347d2db03eaa5ea9fef414666565ffa5e849935cbc30e37237edcaa822b5ced8"}, - {file = "apache_airflow_providers_sqlite-3.4.3-py3-none-any.whl", hash = "sha256:4ffa6a50f0ea1b4e51240b657dfec3fb026c87bdfa71af908a56461df6a6f2e0"}, + {file = "apache-airflow-providers-sqlite-3.5.0.tar.gz", hash = "sha256:6f47c25d7fb026fa8b8b4dc8edfee1491998255048255625716fceaae2c67024"}, + {file = "apache_airflow_providers_sqlite-3.5.0-py3-none-any.whl", hash = "sha256:7baba67c9ddf75b31d8197e22ca491c2e1cf9e4c6306c1788c150b5457c3a182"}, ] [package.dependencies] -apache-airflow = ">=2.4.0" +apache-airflow = ">=2.5.0" apache-airflow-providers-common-sql = ">=1.3.1" [package.extras] @@ -602,6 +621,17 @@ tests = ["PyYAML (>=3.10)", "marshmallow (>=3.13.0)", "openapi-spec-validator (< validation = ["openapi-spec-validator (<0.5)", "prance[osv] (>=0.11)"] yaml = ["PyYAML (>=3.10)"] +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = "*" +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] + [[package]] name = "appnope" version = "0.1.3" @@ -615,13 +645,13 @@ files = [ [[package]] name = "argcomplete" -version = "3.1.1" +version = "3.1.2" description = "Bash tab completion for argparse" optional = false python-versions = ">=3.6" files = [ - {file = "argcomplete-3.1.1-py3-none-any.whl", hash = "sha256:35fa893a88deea85ea7b20d241100e64516d6af6d7b0ae2bed1d263d26f70948"}, - {file = "argcomplete-3.1.1.tar.gz", hash = "sha256:6c4c563f14f01440aaffa3eae13441c5db2357b5eec639abe7c0b15334627dff"}, + {file = "argcomplete-3.1.2-py3-none-any.whl", hash = "sha256:d97c036d12a752d1079f190bc1521c545b941fda89ad85d15afa909b4d1b9a99"}, + {file = "argcomplete-3.1.2.tar.gz", hash = "sha256:d5d1e5efd41435260b8f85673b74ea2e883affcbec9f4230c582689e8e78251b"}, ] [package.extras] @@ -646,30 +676,31 @@ tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] [[package]] name = "asttokens" -version = "2.2.1" +version = "2.4.1" description = "Annotate AST trees with source code positions" optional = false python-versions = "*" files = [ - {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, - {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, ] [package.dependencies] -six = "*" +six = ">=1.12.0" [package.extras] -test = ["astroid", "pytest"] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] [[package]] name = "async-timeout" -version = "4.0.2" +version = "4.0.3" description = "Timeout context manager for asyncio programs" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] [[package]] @@ -706,96 +737,128 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte [[package]] name = "avro" -version = "1.11.1" +version = "1.11.3" description = "Avro is a serialization and RPC framework." optional = false python-versions = ">=3.6" files = [ - {file = "avro-1.11.1.tar.gz", hash = "sha256:f123623ecc648d0e20ce14f8ed85162140c13cc4b108865d1b2529fbfa06c008"}, + {file = "avro-1.11.3.tar.gz", hash = "sha256:3393bb5139f9cf0791d205756ce1e39a5b58586af5b153d6a3b5a199610e9d17"}, ] [package.extras] snappy = ["python-snappy"] zstandard = ["zstandard"] +[[package]] +name = "azure-common" +version = "1.1.28" +description = "Microsoft Azure Client Library for Python (Common)" +optional = false +python-versions = "*" +files = [ + {file = "azure-common-1.1.28.zip", hash = "sha256:4ac0cd3214e36b6a1b6a442686722a5d8cc449603aa833f3f0f40bda836704a3"}, + {file = "azure_common-1.1.28-py2.py3-none-any.whl", hash = "sha256:5c12d3dcf4ec20599ca6b0d3e09e86e146353d443e7fcc050c9a19c1f9df20ad"}, +] + [[package]] name = "azure-core" -version = "1.26.4" +version = "1.29.5" description = "Microsoft Azure Core Library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "azure-core-1.26.4.zip", hash = "sha256:075fe06b74c3007950dd93d49440c2f3430fd9b4a5a2756ec8c79454afc989c6"}, - {file = "azure_core-1.26.4-py3-none-any.whl", hash = "sha256:d9664b4bc2675d72fba461a285ac43ae33abb2967014a955bf136d9703a2ab3c"}, + {file = "azure-core-1.29.5.tar.gz", hash = "sha256:52983c89d394c6f881a121e5101c5fa67278ca3b1f339c8fb2ef39230c70e9ac"}, + {file = "azure_core-1.29.5-py3-none-any.whl", hash = "sha256:0fa04b7b1f7d44a4fb8468c4093deb2ea01fdf4faddbf802ed9205615f99d68c"}, ] [package.dependencies] requests = ">=2.18.4" six = ">=1.11.0" -typing-extensions = ">=4.3.0" +typing-extensions = ">=4.6.0" [package.extras] aio = ["aiohttp (>=3.0)"] [[package]] name = "azure-identity" -version = "1.12.0" +version = "1.15.0" description = "Microsoft Azure Identity Library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "azure-identity-1.12.0.zip", hash = "sha256:7f9b1ae7d97ea7af3f38dd09305e19ab81a1e16ab66ea186b6579d85c1ca2347"}, - {file = "azure_identity-1.12.0-py3-none-any.whl", hash = "sha256:2a58ce4a209a013e37eaccfd5937570ab99e9118b3e1acf875eed3a85d541b92"}, + {file = "azure-identity-1.15.0.tar.gz", hash = "sha256:4c28fc246b7f9265610eb5261d65931183d019a23d4b0e99357facb2e6c227c8"}, + {file = "azure_identity-1.15.0-py3-none-any.whl", hash = "sha256:a14b1f01c7036f11f148f22cd8c16e05035293d714458d6b44ddf534d93eb912"}, ] [package.dependencies] -azure-core = ">=1.11.0,<2.0.0" +azure-core = ">=1.23.0,<2.0.0" cryptography = ">=2.5" -msal = ">=1.12.0,<2.0.0" +msal = ">=1.24.0,<2.0.0" msal-extensions = ">=0.3.0,<2.0.0" -six = ">=1.12.0" + +[[package]] +name = "azure-mgmt-core" +version = "1.4.0" +description = "Microsoft Azure Management Core Library for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "azure-mgmt-core-1.4.0.zip", hash = "sha256:d195208340094f98e5a6661b781cde6f6a051e79ce317caabd8ff97030a9b3ae"}, + {file = "azure_mgmt_core-1.4.0-py3-none-any.whl", hash = "sha256:81071675f186a585555ef01816f2774d49c1c9024cb76e5720c3c0f6b337bb7d"}, +] + +[package.dependencies] +azure-core = ">=1.26.2,<2.0.0" + +[[package]] +name = "azure-mgmt-storage" +version = "20.1.0" +description = "Microsoft Azure Storage Management Client Library for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "azure-mgmt-storage-20.1.0.zip", hash = "sha256:214f3fde8c91e27d53f2e654a28d15003ad3f6f15c8438a8205f0c88a48d9451"}, + {file = "azure_mgmt_storage-20.1.0-py3-none-any.whl", hash = "sha256:afdc830329c674d96a91c963fa03ac81a4e387dfbf9f5a4e823950dc1fe95659"}, +] + +[package.dependencies] +azure-common = ">=1.1,<2.0" +azure-mgmt-core = ">=1.3.1,<2.0.0" +msrest = ">=0.6.21" [[package]] name = "azure-storage-blob" -version = "12.16.0" +version = "12.18.3" description = "Microsoft Azure Blob Storage Client Library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "azure-storage-blob-12.16.0.zip", hash = "sha256:43b45f19a518a5c6895632f263b3825ebc23574f25cc84b66e1630a6160e466f"}, - {file = "azure_storage_blob-12.16.0-py3-none-any.whl", hash = "sha256:91bb192b2a97939c4259c72373bac0f41e30810bbc853d5184f0f45904eacafd"}, + {file = "azure-storage-blob-12.18.3.tar.gz", hash = "sha256:d8ced0deee3367fa3d4f3d1a03cd9edadf4440c0a371f503d623fa6c807554ee"}, + {file = "azure_storage_blob-12.18.3-py3-none-any.whl", hash = "sha256:c278dde2ac41857a68d615c9f2b36d894ba877a7e84d62795603c7e79d0bb5e9"}, ] [package.dependencies] -azure-core = ">=1.26.0,<2.0.0" +azure-core = ">=1.28.0,<2.0.0" cryptography = ">=2.1.4" isodate = ">=0.6.1" -typing-extensions = ">=4.0.1" +typing-extensions = ">=4.3.0" [package.extras] -aio = ["azure-core[aio] (>=1.26.0,<2.0.0)"] +aio = ["azure-core[aio] (>=1.28.0,<2.0.0)"] [[package]] -name = "Babel" -version = "2.12.1" +name = "babel" +version = "2.13.1" description = "Internationalization utilities" optional = false python-versions = ">=3.7" files = [ - {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, - {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, + {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"}, + {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, ] -[[package]] -name = "backcall" -version = "0.2.0" -description = "Specifications for callback functions passed in to an API" -optional = false -python-versions = "*" -files = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, -] +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "backoff" @@ -826,118 +889,86 @@ soupsieve = ">1.2" html5lib = ["html5lib"] lxml = ["lxml"] -[[package]] -name = "black" -version = "22.12.0" -description = "The uncompromising code formatter." -optional = false -python-versions = ">=3.7" -files = [ - {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, - {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, - {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, - {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, - {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, - {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, - {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, - {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, - {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, - {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, - {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, - {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} - -[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 = "blinker" -version = "1.6.2" +version = "1.6.3" description = "Fast, simple object-to-object and broadcast signaling" optional = false python-versions = ">=3.7" files = [ - {file = "blinker-1.6.2-py3-none-any.whl", hash = "sha256:c3d739772abb7bc2860abf5f2ec284223d9ad5c76da018234f6f50d6f31ab1f0"}, - {file = "blinker-1.6.2.tar.gz", hash = "sha256:4afd3de66ef3a9f8067559fb7a1cbe555c17dcbe15971b05d1b625c3e7abe213"}, + {file = "blinker-1.6.3-py3-none-any.whl", hash = "sha256:296320d6c28b006eb5e32d4712202dbcdcbf5dc482da298c2f44881c43884aaa"}, + {file = "blinker-1.6.3.tar.gz", hash = "sha256:152090d27c1c5c722ee7e48504b02d76502811ce02e1523553b4cf8c8b3d3a8d"}, ] [[package]] name = "bokeh" -version = "1.4.0" +version = "3.3.0" description = "Interactive plots and applications in the browser from Python" optional = false -python-versions = "*" +python-versions = ">=3.9" files = [ - {file = "bokeh-1.4.0.tar.gz", hash = "sha256:c60d38a41a777b8147ee4134e6142cea8026b5eebf48149e370c44689869dce7"}, + {file = "bokeh-3.3.0-py3-none-any.whl", hash = "sha256:65e36824c99fd46530c559263c6d14eabed6945370cd3beffc2eeedb62d6db6d"}, + {file = "bokeh-3.3.0.tar.gz", hash = "sha256:cdbe268f842c139ba8fa0fb43c0c55c172c8215ec5a69a2629482c63c9d4039c"}, ] [package.dependencies] -Jinja2 = ">=2.7" -numpy = ">=1.7.1" +contourpy = ">=1" +Jinja2 = ">=2.9" +numpy = ">=1.16" packaging = ">=16.8" -pillow = ">=4.0" -python-dateutil = ">=2.1" +pandas = ">=1.2" +pillow = ">=7.1.0" PyYAML = ">=3.10" -six = ">=1.5.2" -tornado = ">=4.3" +tornado = ">=5.1" +xyzservices = ">=2021.09.1" [[package]] name = "boto3" -version = "1.26.115" +version = "1.28.75" description = "The AWS SDK for Python" optional = false python-versions = ">= 3.7" files = [ - {file = "boto3-1.26.115-py3-none-any.whl", hash = "sha256:deb53ad15ff0e75ae0be6d7115a2d34e4bafb0541484485f0feb61dabdfb5513"}, - {file = "boto3-1.26.115.tar.gz", hash = "sha256:2272a060005bf8299f7342cbf1344304eb44b7060cddba6784f676e3bc737bb8"}, + {file = "boto3-1.28.75-py3-none-any.whl", hash = "sha256:b959decd588982bc919bfcbebc7916926b05003a0093e7f2845362da4f5dd9fc"}, + {file = "boto3-1.28.75.tar.gz", hash = "sha256:63d772a784e8e35ee51974eb1c20dff5faa51b007d22c5647783f18966bf4042"}, ] [package.dependencies] -botocore = ">=1.29.115,<1.30.0" +botocore = ">=1.31.75,<1.32.0" jmespath = ">=0.7.1,<2.0.0" -s3transfer = ">=0.6.0,<0.7.0" +s3transfer = ">=0.7.0,<0.8.0" [package.extras] crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.29.115" +version = "1.31.75" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">= 3.7" files = [ - {file = "botocore-1.29.115-py3-none-any.whl", hash = "sha256:dff327977d7c9f98f2dc54b51b8f70326952dd50ae23b885fdfa8bfeec014b76"}, - {file = "botocore-1.29.115.tar.gz", hash = "sha256:58eee8cf8f4f3e515df29f6dc535dd86ed3f4cea40999c5bc74640ff40bdc71f"}, + {file = "botocore-1.31.75-py3-none-any.whl", hash = "sha256:fa078c4aa9a5777b3ede756540e62fec551e13d39cf7abf9a37bb81981496d68"}, + {file = "botocore-1.31.75.tar.gz", hash = "sha256:d704ea9867b2227de0350bc2a5ca2543349e164ecb5d15edbfacbb05f2056482"}, ] [package.dependencies] jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" -urllib3 = ">=1.25.4,<1.27" +urllib3 = {version = ">=1.25.4,<2.1", markers = "python_version >= \"3.10\""} [package.extras] -crt = ["awscrt (==0.16.9)"] +crt = ["awscrt (==0.16.26)"] [[package]] name = "bracex" -version = "2.3.post1" +version = "2.4" description = "Bash style brace expander." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "bracex-2.3.post1-py3-none-any.whl", hash = "sha256:351b7f20d56fb9ea91f9b9e9e7664db466eb234188c175fd943f8f755c807e73"}, - {file = "bracex-2.3.post1.tar.gz", hash = "sha256:e7b23fc8b2cd06d3dec0692baabecb249dda94e06a617901ff03a6c56fd71693"}, + {file = "bracex-2.4-py3-none-any.whl", hash = "sha256:efdc71eff95eaff5e0f8cfebe7d01adf2c8637c8c92edaf63ef348c241a82418"}, + {file = "bracex-2.4.tar.gz", hash = "sha256:a27eaf1df42cf561fed58b7a8f3fdf129d1ea16a81e1fadd1d17989bc6384beb"}, ] [[package]] @@ -953,13 +984,13 @@ files = [ [[package]] name = "cachetools" -version = "5.3.0" +version = "5.3.2" description = "Extensible memoizing collections and decorators" optional = false -python-versions = "~=3.7" +python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.0-py3-none-any.whl", hash = "sha256:429e1a1e845c008ea6c85aa35d4b98b65d6a9763eeef3e37e92728a12d1de9d4"}, - {file = "cachetools-5.3.0.tar.gz", hash = "sha256:13dfddc7b8df938c21a940dfa6557ce6e94a2f1cdfa58eb90c805721d58f2c14"}, + {file = "cachetools-5.3.2-py3-none-any.whl", hash = "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1"}, + {file = "cachetools-5.3.2.tar.gz", hash = "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2"}, ] [[package]] @@ -989,86 +1020,74 @@ ujson = ["ujson (>=5.4.0,<6.0.0)"] [[package]] name = "certifi" -version = "2022.12.7" +version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, ] [[package]] name = "cffi" -version = "1.15.1" +version = "1.16.0" description = "Foreign Function Interface for Python calling C code." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, ] [package.dependencies] @@ -1076,119 +1095,134 @@ pycparser = "*" [[package]] name = "cfgv" -version = "3.3.1" +version = "3.4.0" description = "Validate configuration and produce human readable error messages." optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.8" files = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, ] [[package]] name = "chardet" -version = "5.2.0" -description = "Universal encoding detector for Python 3" +version = "4.0.0" +description = "Universal encoding detector for Python 2 and 3" optional = false -python-versions = ">=3.7" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ - {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, - {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, + {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, + {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, ] [[package]] name = "charset-normalizer" -version = "3.1.0" +version = "3.3.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, - {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, + {file = "charset-normalizer-3.3.1.tar.gz", hash = "sha256:d9137a876020661972ca6eec0766d81aef8a5627df628b664b234b73396e727e"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8aee051c89e13565c6bd366813c386939f8e928af93c29fda4af86d25b73d8f8"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:352a88c3df0d1fa886562384b86f9a9e27563d4704ee0e9d56ec6fcd270ea690"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:223b4d54561c01048f657fa6ce41461d5ad8ff128b9678cfe8b2ecd951e3f8a2"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f861d94c2a450b974b86093c6c027888627b8082f1299dfd5a4bae8e2292821"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1171ef1fc5ab4693c5d151ae0fdad7f7349920eabbaca6271f95969fa0756c2d"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28f512b9a33235545fbbdac6a330a510b63be278a50071a336afc1b78781b147"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0e842112fe3f1a4ffcf64b06dc4c61a88441c2f02f373367f7b4c1aa9be2ad5"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f9bc2ce123637a60ebe819f9fccc614da1bcc05798bbbaf2dd4ec91f3e08846"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f194cce575e59ffe442c10a360182a986535fd90b57f7debfaa5c845c409ecc3"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9a74041ba0bfa9bc9b9bb2cd3238a6ab3b7618e759b41bd15b5f6ad958d17605"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b578cbe580e3b41ad17b1c428f382c814b32a6ce90f2d8e39e2e635d49e498d1"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6db3cfb9b4fcecb4390db154e75b49578c87a3b9979b40cdf90d7e4b945656e1"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:debb633f3f7856f95ad957d9b9c781f8e2c6303ef21724ec94bea2ce2fcbd056"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-win32.whl", hash = "sha256:87071618d3d8ec8b186d53cb6e66955ef2a0e4fa63ccd3709c0c90ac5a43520f"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:e372d7dfd154009142631de2d316adad3cc1c36c32a38b16a4751ba78da2a397"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae4070f741f8d809075ef697877fd350ecf0b7c5837ed68738607ee0a2c572cf"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58e875eb7016fd014c0eea46c6fa92b87b62c0cb31b9feae25cbbe62c919f54d"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dbd95e300367aa0827496fe75a1766d198d34385a58f97683fe6e07f89ca3e3c"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de0b4caa1c8a21394e8ce971997614a17648f94e1cd0640fbd6b4d14cab13a72"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:985c7965f62f6f32bf432e2681173db41336a9c2611693247069288bcb0c7f8b"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a15c1fe6d26e83fd2e5972425a772cca158eae58b05d4a25a4e474c221053e2d"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae55d592b02c4349525b6ed8f74c692509e5adffa842e582c0f861751701a673"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be4d9c2770044a59715eb57c1144dedea7c5d5ae80c68fb9959515037cde2008"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:851cf693fb3aaef71031237cd68699dded198657ec1e76a76eb8be58c03a5d1f"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:31bbaba7218904d2eabecf4feec0d07469284e952a27400f23b6628439439fa7"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:871d045d6ccc181fd863a3cd66ee8e395523ebfbc57f85f91f035f50cee8e3d4"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:501adc5eb6cd5f40a6f77fbd90e5ab915c8fd6e8c614af2db5561e16c600d6f3"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f5fb672c396d826ca16a022ac04c9dce74e00a1c344f6ad1a0fdc1ba1f332213"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-win32.whl", hash = "sha256:bb06098d019766ca16fc915ecaa455c1f1cd594204e7f840cd6258237b5079a8"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:8af5a8917b8af42295e86b64903156b4f110a30dca5f3b5aedea123fbd638bff"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7ae8e5142dcc7a49168f4055255dbcced01dc1714a90a21f87448dc8d90617d1"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5b70bab78accbc672f50e878a5b73ca692f45f5b5e25c8066d748c09405e6a55"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ceca5876032362ae73b83347be8b5dbd2d1faf3358deb38c9c88776779b2e2f"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34d95638ff3613849f473afc33f65c401a89f3b9528d0d213c7037c398a51296"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9edbe6a5bf8b56a4a84533ba2b2f489d0046e755c29616ef8830f9e7d9cf5728"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6a02a3c7950cafaadcd46a226ad9e12fc9744652cc69f9e5534f98b47f3bbcf"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10b8dd31e10f32410751b3430996f9807fc4d1587ca69772e2aa940a82ab571a"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edc0202099ea1d82844316604e17d2b175044f9bcb6b398aab781eba957224bd"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b891a2f68e09c5ef989007fac11476ed33c5c9994449a4e2c3386529d703dc8b"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:71ef3b9be10070360f289aea4838c784f8b851be3ba58cf796262b57775c2f14"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:55602981b2dbf8184c098bc10287e8c245e351cd4fdcad050bd7199d5a8bf514"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:46fb9970aa5eeca547d7aa0de5d4b124a288b42eaefac677bde805013c95725c"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:520b7a142d2524f999447b3a0cf95115df81c4f33003c51a6ab637cbda9d0bf4"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-win32.whl", hash = "sha256:8ec8ef42c6cd5856a7613dcd1eaf21e5573b2185263d87d27c8edcae33b62a61"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:baec8148d6b8bd5cee1ae138ba658c71f5b03e0d69d5907703e3e1df96db5e41"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63a6f59e2d01310f754c270e4a257426fe5a591dc487f1983b3bbe793cf6bac6"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d6bfc32a68bc0933819cfdfe45f9abc3cae3877e1d90aac7259d57e6e0f85b1"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f3100d86dcd03c03f7e9c3fdb23d92e32abbca07e7c13ebd7ddfbcb06f5991f"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39b70a6f88eebe239fa775190796d55a33cfb6d36b9ffdd37843f7c4c1b5dc67"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e12f8ee80aa35e746230a2af83e81bd6b52daa92a8afaef4fea4a2ce9b9f4fa"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b6cefa579e1237ce198619b76eaa148b71894fb0d6bcf9024460f9bf30fd228"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:61f1e3fb621f5420523abb71f5771a204b33c21d31e7d9d86881b2cffe92c47c"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4f6e2a839f83a6a76854d12dbebde50e4b1afa63e27761549d006fa53e9aa80e"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:1ec937546cad86d0dce5396748bf392bb7b62a9eeb8c66efac60e947697f0e58"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:82ca51ff0fc5b641a2d4e1cc8c5ff108699b7a56d7f3ad6f6da9dbb6f0145b48"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:633968254f8d421e70f91c6ebe71ed0ab140220469cf87a9857e21c16687c034"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-win32.whl", hash = "sha256:c0c72d34e7de5604df0fde3644cc079feee5e55464967d10b24b1de268deceb9"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:63accd11149c0f9a99e3bc095bbdb5a464862d77a7e309ad5938fbc8721235ae"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5a3580a4fdc4ac05f9e53c57f965e3594b2f99796231380adb2baaab96e22761"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2465aa50c9299d615d757c1c888bc6fef384b7c4aec81c05a0172b4400f98557"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb7cd68814308aade9d0c93c5bd2ade9f9441666f8ba5aa9c2d4b389cb5e2a45"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91e43805ccafa0a91831f9cd5443aa34528c0c3f2cc48c4cb3d9a7721053874b"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:854cc74367180beb327ab9d00f964f6d91da06450b0855cbbb09187bcdb02de5"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c15070ebf11b8b7fd1bfff7217e9324963c82dbdf6182ff7050519e350e7ad9f"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4c99f98fc3a1835af8179dcc9013f93594d0670e2fa80c83aa36346ee763d2"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fb765362688821404ad6cf86772fc54993ec11577cd5a92ac44b4c2ba52155b"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dced27917823df984fe0c80a5c4ad75cf58df0fbfae890bc08004cd3888922a2"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a66bcdf19c1a523e41b8e9d53d0cedbfbac2e93c649a2e9502cb26c014d0980c"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ecd26be9f112c4f96718290c10f4caea6cc798459a3a76636b817a0ed7874e42"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f70fd716855cd3b855316b226a1ac8bdb3caf4f7ea96edcccc6f484217c9597"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:17a866d61259c7de1bdadef418a37755050ddb4b922df8b356503234fff7932c"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-win32.whl", hash = "sha256:548eefad783ed787b38cb6f9a574bd8664468cc76d1538215d510a3cd41406cb"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:45f053a0ece92c734d874861ffe6e3cc92150e32136dd59ab1fb070575189c97"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bc791ec3fd0c4309a753f95bb6c749ef0d8ea3aea91f07ee1cf06b7b02118f2f"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0c8c61fb505c7dad1d251c284e712d4e0372cef3b067f7ddf82a7fa82e1e9a93"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2c092be3885a1b7899cd85ce24acedc1034199d6fca1483fa2c3a35c86e43041"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2000c54c395d9e5e44c99dc7c20a64dc371f777faf8bae4919ad3e99ce5253e"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4cb50a0335382aac15c31b61d8531bc9bb657cfd848b1d7158009472189f3d62"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c30187840d36d0ba2893bc3271a36a517a717f9fd383a98e2697ee890a37c273"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe81b35c33772e56f4b6cf62cf4aedc1762ef7162a31e6ac7fe5e40d0149eb67"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0bf89afcbcf4d1bb2652f6580e5e55a840fdf87384f6063c4a4f0c95e378656"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:06cf46bdff72f58645434d467bf5228080801298fbba19fe268a01b4534467f5"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3c66df3f41abee950d6638adc7eac4730a306b022570f71dd0bd6ba53503ab57"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd805513198304026bd379d1d516afbf6c3c13f4382134a2c526b8b854da1c2e"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:9505dc359edb6a330efcd2be825fdb73ee3e628d9010597aa1aee5aa63442e97"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:31445f38053476a0c4e6d12b047b08ced81e2c7c712e5a1ad97bc913256f91b2"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-win32.whl", hash = "sha256:bd28b31730f0e982ace8663d108e01199098432a30a4c410d06fe08fdb9e93f4"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:555fe186da0068d3354cdf4bbcbc609b0ecae4d04c921cc13e209eece7720727"}, + {file = "charset_normalizer-3.3.1-py3-none-any.whl", hash = "sha256:800561453acdecedaac137bf09cd719c7a440b6800ec182f077bb8e7025fb708"}, ] [[package]] name = "click" -version = "8.1.3" +version = "8.1.7" 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"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -1236,17 +1270,17 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} [[package]] name = "comm" -version = "0.1.3" +version = "0.1.4" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false python-versions = ">=3.6" files = [ - {file = "comm-0.1.3-py3-none-any.whl", hash = "sha256:16613c6211e20223f215fc6d3b266a247b6e2641bf4e0a3ad34cb1aff2aa3f37"}, - {file = "comm-0.1.3.tar.gz", hash = "sha256:a61efa9daffcfbe66fd643ba966f846a624e4e6d6767eda9cf6e993aadaab93e"}, + {file = "comm-0.1.4-py3-none-any.whl", hash = "sha256:6d52794cba11b36ed9860999cd10fd02d6b2eac177068fdd585e1e2f8a96e67a"}, + {file = "comm-0.1.4.tar.gz", hash = "sha256:354e40a59c9dd6db50c5cc6b4acc887d82e9603787f83b68c01a80a923984d15"}, ] [package.dependencies] -traitlets = ">=5.3" +traitlets = ">=4" [package.extras] lint = ["black (>=22.6.0)", "mdformat (>0.7)", "mdformat-gfm (>=0.3.5)", "ruff (>=0.0.156)"] @@ -1310,64 +1344,136 @@ flask = ["flask (>=1.0.4,<3)", "itsdangerous (>=0.24)"] swagger-ui = ["swagger-ui-bundle (>=0.0.2,<0.1)"] tests = ["MarkupSafe (>=0.23)", "aiohttp (>=2.3.10,<4)", "aiohttp-jinja2 (>=0.14.0,<2)", "aiohttp-remotes", "decorator (>=5,<6)", "flask (>=1.0.4,<3)", "itsdangerous (>=0.24)", "pytest (>=6,<7)", "pytest-aiohttp", "pytest-cov (>=2,<3)", "swagger-ui-bundle (>=0.0.2,<0.1)", "testfixtures (>=6,<7)"] +[[package]] +name = "contourpy" +version = "1.1.1" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.8" +files = [ + {file = "contourpy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b"}, + {file = "contourpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1"}, + {file = "contourpy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d"}, + {file = "contourpy-1.1.1-cp310-cp310-win32.whl", hash = "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431"}, + {file = "contourpy-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5"}, + {file = "contourpy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62"}, + {file = "contourpy-1.1.1-cp311-cp311-win32.whl", hash = "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33"}, + {file = "contourpy-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf"}, + {file = "contourpy-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d"}, + {file = "contourpy-1.1.1-cp312-cp312-win32.whl", hash = "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6"}, + {file = "contourpy-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8"}, + {file = "contourpy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251"}, + {file = "contourpy-1.1.1-cp38-cp38-win32.whl", hash = "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7"}, + {file = "contourpy-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85"}, + {file = "contourpy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e"}, + {file = "contourpy-1.1.1-cp39-cp39-win32.whl", hash = "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0"}, + {file = "contourpy-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c"}, + {file = "contourpy-1.1.1.tar.gz", hash = "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab"}, +] + +[package.dependencies] +numpy = {version = ">=1.16,<2.0", markers = "python_version <= \"3.11\""} + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.4.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "wurlitzer"] + [[package]] name = "coverage" -version = "7.2.3" +version = "7.3.2" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "coverage-7.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e58c0d41d336569d63d1b113bd573db8363bc4146f39444125b7f8060e4e04f5"}, - {file = "coverage-7.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:344e714bd0fe921fc72d97404ebbdbf9127bac0ca1ff66d7b79efc143cf7c0c4"}, - {file = "coverage-7.2.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:974bc90d6f6c1e59ceb1516ab00cf1cdfbb2e555795d49fa9571d611f449bcb2"}, - {file = "coverage-7.2.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0743b0035d4b0e32bc1df5de70fba3059662ace5b9a2a86a9f894cfe66569013"}, - {file = "coverage-7.2.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d0391fb4cfc171ce40437f67eb050a340fdbd0f9f49d6353a387f1b7f9dd4fa"}, - {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a42e1eff0ca9a7cb7dc9ecda41dfc7cbc17cb1d02117214be0561bd1134772b"}, - {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:be19931a8dcbe6ab464f3339966856996b12a00f9fe53f346ab3be872d03e257"}, - {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:72fcae5bcac3333a4cf3b8f34eec99cea1187acd55af723bcbd559adfdcb5535"}, - {file = "coverage-7.2.3-cp310-cp310-win32.whl", hash = "sha256:aeae2aa38395b18106e552833f2a50c27ea0000122bde421c31d11ed7e6f9c91"}, - {file = "coverage-7.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:83957d349838a636e768251c7e9979e899a569794b44c3728eaebd11d848e58e"}, - {file = "coverage-7.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfd393094cd82ceb9b40df4c77976015a314b267d498268a076e940fe7be6b79"}, - {file = "coverage-7.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:182eb9ac3f2b4874a1f41b78b87db20b66da6b9cdc32737fbbf4fea0c35b23fc"}, - {file = "coverage-7.2.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bb1e77a9a311346294621be905ea8a2c30d3ad371fc15bb72e98bfcfae532df"}, - {file = "coverage-7.2.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca0f34363e2634deffd390a0fef1aa99168ae9ed2af01af4a1f5865e362f8623"}, - {file = "coverage-7.2.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55416d7385774285b6e2a5feca0af9652f7f444a4fa3d29d8ab052fafef9d00d"}, - {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:06ddd9c0249a0546997fdda5a30fbcb40f23926df0a874a60a8a185bc3a87d93"}, - {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fff5aaa6becf2c6a1699ae6a39e2e6fb0672c2d42eca8eb0cafa91cf2e9bd312"}, - {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ea53151d87c52e98133eb8ac78f1206498c015849662ca8dc246255265d9c3c4"}, - {file = "coverage-7.2.3-cp311-cp311-win32.whl", hash = "sha256:8f6c930fd70d91ddee53194e93029e3ef2aabe26725aa3c2753df057e296b925"}, - {file = "coverage-7.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:fa546d66639d69aa967bf08156eb8c9d0cd6f6de84be9e8c9819f52ad499c910"}, - {file = "coverage-7.2.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2317d5ed777bf5a033e83d4f1389fd4ef045763141d8f10eb09a7035cee774c"}, - {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be9824c1c874b73b96288c6d3de793bf7f3a597770205068c6163ea1f326e8b9"}, - {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3b2803e730dc2797a017335827e9da6da0e84c745ce0f552e66400abdfb9a1"}, - {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f69770f5ca1994cb32c38965e95f57504d3aea96b6c024624fdd5bb1aa494a1"}, - {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1127b16220f7bfb3f1049ed4a62d26d81970a723544e8252db0efde853268e21"}, - {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:aa784405f0c640940595fa0f14064d8e84aff0b0f762fa18393e2760a2cf5841"}, - {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3146b8e16fa60427e03884301bf8209221f5761ac754ee6b267642a2fd354c48"}, - {file = "coverage-7.2.3-cp37-cp37m-win32.whl", hash = "sha256:1fd78b911aea9cec3b7e1e2622c8018d51c0d2bbcf8faaf53c2497eb114911c1"}, - {file = "coverage-7.2.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f3736a5d34e091b0a611964c6262fd68ca4363df56185902528f0b75dbb9c1f"}, - {file = "coverage-7.2.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:981b4df72c93e3bc04478153df516d385317628bd9c10be699c93c26ddcca8ab"}, - {file = "coverage-7.2.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0045f8f23a5fb30b2eb3b8a83664d8dc4fb58faddf8155d7109166adb9f2040"}, - {file = "coverage-7.2.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f760073fcf8f3d6933178d67754f4f2d4e924e321f4bb0dcef0424ca0215eba1"}, - {file = "coverage-7.2.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c86bd45d1659b1ae3d0ba1909326b03598affbc9ed71520e0ff8c31a993ad911"}, - {file = "coverage-7.2.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:172db976ae6327ed4728e2507daf8a4de73c7cc89796483e0a9198fd2e47b462"}, - {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d2a3a6146fe9319926e1d477842ca2a63fe99af5ae690b1f5c11e6af074a6b5c"}, - {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f649dd53833b495c3ebd04d6eec58479454a1784987af8afb77540d6c1767abd"}, - {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c4ed4e9f3b123aa403ab424430b426a1992e6f4c8fd3cb56ea520446e04d152"}, - {file = "coverage-7.2.3-cp38-cp38-win32.whl", hash = "sha256:eb0edc3ce9760d2f21637766c3aa04822030e7451981ce569a1b3456b7053f22"}, - {file = "coverage-7.2.3-cp38-cp38-win_amd64.whl", hash = "sha256:63cdeaac4ae85a179a8d6bc09b77b564c096250d759eed343a89d91bce8b6367"}, - {file = "coverage-7.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:20d1a2a76bb4eb00e4d36b9699f9b7aba93271c9c29220ad4c6a9581a0320235"}, - {file = "coverage-7.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ea748802cc0de4de92ef8244dd84ffd793bd2e7be784cd8394d557a3c751e21"}, - {file = "coverage-7.2.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21b154aba06df42e4b96fc915512ab39595105f6c483991287021ed95776d934"}, - {file = "coverage-7.2.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd214917cabdd6f673a29d708574e9fbdb892cb77eb426d0eae3490d95ca7859"}, - {file = "coverage-7.2.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c2e58e45fe53fab81f85474e5d4d226eeab0f27b45aa062856c89389da2f0d9"}, - {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:87ecc7c9a1a9f912e306997ffee020297ccb5ea388421fe62a2a02747e4d5539"}, - {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:387065e420aed3c71b61af7e82c7b6bc1c592f7e3c7a66e9f78dd178699da4fe"}, - {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ea3f5bc91d7d457da7d48c7a732beaf79d0c8131df3ab278e6bba6297e23c6c4"}, - {file = "coverage-7.2.3-cp39-cp39-win32.whl", hash = "sha256:ae7863a1d8db6a014b6f2ff9c1582ab1aad55a6d25bac19710a8df68921b6e30"}, - {file = "coverage-7.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:3f04becd4fcda03c0160d0da9c8f0c246bc78f2f7af0feea1ec0930e7c93fa4a"}, - {file = "coverage-7.2.3-pp37.pp38.pp39-none-any.whl", hash = "sha256:965ee3e782c7892befc25575fa171b521d33798132692df428a09efacaffe8d0"}, - {file = "coverage-7.2.3.tar.gz", hash = "sha256:d298c2815fa4891edd9abe5ad6e6cb4207104c7dd9fd13aea3fdebf6f9b91259"}, + {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, + {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, + {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, + {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, + {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, + {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, + {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, + {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, + {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, + {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, + {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, + {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, + {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, + {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, + {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, + {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, + {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, + {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, + {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, + {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, ] [package.dependencies] @@ -1391,68 +1497,64 @@ dev = ["polib"] [[package]] name = "croniter" -version = "1.4.1" +version = "2.0.1" description = "croniter provides iteration for datetime object with cron like format" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "croniter-1.4.1-py2.py3-none-any.whl", hash = "sha256:9595da48af37ea06ec3a9f899738f1b2c1c13da3c38cea606ef7cd03ea421128"}, - {file = "croniter-1.4.1.tar.gz", hash = "sha256:1a6df60eacec3b7a0aa52a8f2ef251ae3dd2a7c7c8b9874e73e791636d55a361"}, + {file = "croniter-2.0.1-py2.py3-none-any.whl", hash = "sha256:4cb064ce2d8f695b3b078be36ff50115cf8ac306c10a7e8653ee2a5b534673d7"}, + {file = "croniter-2.0.1.tar.gz", hash = "sha256:d199b2ec3ea5e82988d1f72022433c5f9302b3b3ea9e6bfd6a1518f6ea5e700a"}, ] [package.dependencies] python-dateutil = "*" +pytz = ">2021.1" [[package]] name = "cryptography" -version = "40.0.2" +version = "38.0.4" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.6" files = [ - {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:8f79b5ff5ad9d3218afb1e7e20ea74da5f76943ee5edb7f76e56ec5161ec782b"}, - {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:05dc219433b14046c476f6f09d7636b92a1c3e5808b9a6536adf4932b3b2c440"}, - {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4df2af28d7bedc84fe45bd49bc35d710aede676e2a4cb7fc6d103a2adc8afe4d"}, - {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dcca15d3a19a66e63662dc8d30f8036b07be851a8680eda92d079868f106288"}, - {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a04386fb7bc85fab9cd51b6308633a3c271e3d0d3eae917eebab2fac6219b6d2"}, - {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:adc0d980fd2760c9e5de537c28935cc32b9353baaf28e0814df417619c6c8c3b"}, - {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d5a1bd0e9e2031465761dfa920c16b0065ad77321d8a8c1f5ee331021fda65e9"}, - {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a95f4802d49faa6a674242e25bfeea6fc2acd915b5e5e29ac90a32b1139cae1c"}, - {file = "cryptography-40.0.2-cp36-abi3-win32.whl", hash = "sha256:aecbb1592b0188e030cb01f82d12556cf72e218280f621deed7d806afd2113f9"}, - {file = "cryptography-40.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:b12794f01d4cacfbd3177b9042198f3af1c856eedd0a98f10f141385c809a14b"}, - {file = "cryptography-40.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:142bae539ef28a1c76794cca7f49729e7c54423f615cfd9b0b1fa90ebe53244b"}, - {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:956ba8701b4ffe91ba59665ed170a2ebbdc6fc0e40de5f6059195d9f2b33ca0e"}, - {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f01c9863da784558165f5d4d916093737a75203a5c5286fde60e503e4276c7a"}, - {file = "cryptography-40.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3daf9b114213f8ba460b829a02896789751626a2a4e7a43a28ee77c04b5e4958"}, - {file = "cryptography-40.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48f388d0d153350f378c7f7b41497a54ff1513c816bcbbcafe5b829e59b9ce5b"}, - {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c0764e72b36a3dc065c155e5b22f93df465da9c39af65516fe04ed3c68c92636"}, - {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cbaba590180cba88cb99a5f76f90808a624f18b169b90a4abb40c1fd8c19420e"}, - {file = "cryptography-40.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7a38250f433cd41df7fcb763caa3ee9362777fdb4dc642b9a349721d2bf47404"}, - {file = "cryptography-40.0.2.tar.gz", hash = "sha256:c33c0d32b8594fa647d2e01dbccc303478e16fdd7cf98652d5b3ed11aa5e5c99"}, + {file = "cryptography-38.0.4-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:2fa36a7b2cc0998a3a4d5af26ccb6273f3df133d61da2ba13b3286261e7efb70"}, + {file = "cryptography-38.0.4-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:1f13ddda26a04c06eb57119caf27a524ccae20533729f4b1e4a69b54e07035eb"}, + {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2ec2a8714dd005949d4019195d72abed84198d877112abb5a27740e217e0ea8d"}, + {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50a1494ed0c3f5b4d07650a68cd6ca62efe8b596ce743a5c94403e6f11bf06c1"}, + {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10498349d4c8eab7357a8f9aa3463791292845b79597ad1b98a543686fb1ec8"}, + {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:10652dd7282de17990b88679cb82f832752c4e8237f0c714be518044269415db"}, + {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:bfe6472507986613dc6cc00b3d492b2f7564b02b3b3682d25ca7f40fa3fd321b"}, + {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ce127dd0a6a0811c251a6cddd014d292728484e530d80e872ad9806cfb1c5b3c"}, + {file = "cryptography-38.0.4-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:53049f3379ef05182864d13bb9686657659407148f901f3f1eee57a733fb4b00"}, + {file = "cryptography-38.0.4-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:8a4b2bdb68a447fadebfd7d24855758fe2d6fecc7fed0b78d190b1af39a8e3b0"}, + {file = "cryptography-38.0.4-cp36-abi3-win32.whl", hash = "sha256:1d7e632804a248103b60b16fb145e8df0bc60eed790ece0d12efe8cd3f3e7744"}, + {file = "cryptography-38.0.4-cp36-abi3-win_amd64.whl", hash = "sha256:8e45653fb97eb2f20b8c96f9cd2b3a0654d742b47d638cf2897afbd97f80fa6d"}, + {file = "cryptography-38.0.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca57eb3ddaccd1112c18fc80abe41db443cc2e9dcb1917078e02dfa010a4f353"}, + {file = "cryptography-38.0.4-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:c9e0d79ee4c56d841bd4ac6e7697c8ff3c8d6da67379057f29e66acffcd1e9a7"}, + {file = "cryptography-38.0.4-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:0e70da4bdff7601b0ef48e6348339e490ebfb0cbe638e083c9c41fb49f00c8bd"}, + {file = "cryptography-38.0.4-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:998cd19189d8a747b226d24c0207fdaa1e6658a1d3f2494541cb9dfbf7dcb6d2"}, + {file = "cryptography-38.0.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67461b5ebca2e4c2ab991733f8ab637a7265bb582f07c7c88914b5afb88cb95b"}, + {file = "cryptography-38.0.4-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:4eb85075437f0b1fd8cd66c688469a0c4119e0ba855e3fef86691971b887caf6"}, + {file = "cryptography-38.0.4-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3178d46f363d4549b9a76264f41c6948752183b3f587666aff0555ac50fd7876"}, + {file = "cryptography-38.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6391e59ebe7c62d9902c24a4d8bcbc79a68e7c4ab65863536127c8a9cd94043b"}, + {file = "cryptography-38.0.4-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:78e47e28ddc4ace41dd38c42e6feecfdadf9c3be2af389abbfeef1ff06822285"}, + {file = "cryptography-38.0.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fb481682873035600b5502f0015b664abc26466153fab5c6bc92c1ea69d478b"}, + {file = "cryptography-38.0.4-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:4367da5705922cf7070462e964f66e4ac24162e22ab0a2e9d31f1b270dd78083"}, + {file = "cryptography-38.0.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b4cad0cea995af760f82820ab4ca54e5471fc782f70a007f31531957f43e9dee"}, + {file = "cryptography-38.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:80ca53981ceeb3241998443c4964a387771588c4e4a5d92735a493af868294f9"}, + {file = "cryptography-38.0.4.tar.gz", hash = "sha256:175c1a818b87c9ac80bb7377f5520b7f31b3ef2a0004e2420319beadedb67290"}, ] [package.dependencies] cffi = ">=1.12" [package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "check-manifest", "mypy", "ruff"] +pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] sdist = ["setuptools-rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist"] -test-randomorder = ["pytest-randomly"] -tox = ["tox"] - -[[package]] -name = "csscompressor" -version = "0.9.5" -description = "A python port of YUI CSS Compressor" -optional = false -python-versions = "*" -files = [ - {file = "csscompressor-0.9.5.tar.gz", hash = "sha256:afa22badbcf3120a4f392e4d22f9fff485c044a1feda4a950ecc5eba9dd31a05"}, -] +test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pytz"] [[package]] name = "darglint" @@ -1484,40 +1586,40 @@ pyarrow = ">=3.0.0" [[package]] name = "dbldatagen" -version = "0.3.4.post1" +version = "0.3.5" description = "Databricks Labs - PySpark Synthetic Data Generator" optional = false python-versions = ">=3.8.10" files = [ - {file = "dbldatagen-0.3.4.post1-py3-none-any.whl", hash = "sha256:db866c493460cf609ee15e806c39d9ad6e0aa07eec51e7997b181fdbe6112494"}, - {file = "dbldatagen-0.3.4.post1.tar.gz", hash = "sha256:35df1eefeb5646da1a50504bca0c743eec9cdf7e5a407b537e535a5614c9ae72"}, + {file = "dbldatagen-0.3.5-py3-none-any.whl", hash = "sha256:75db379c68adda518fbe5d09184ca0756255f2086d8466fbdeaba29863b98349"}, + {file = "dbldatagen-0.3.5.tar.gz", hash = "sha256:d50dd7f2180d6f3e21a107b8759d62f9a9dd093b64833f73940d99f58723c4b4"}, ] [[package]] name = "debugpy" -version = "1.6.7" +version = "1.8.0" description = "An implementation of the Debug Adapter Protocol for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "debugpy-1.6.7-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b3e7ac809b991006ad7f857f016fa92014445085711ef111fdc3f74f66144096"}, - {file = "debugpy-1.6.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3876611d114a18aafef6383695dfc3f1217c98a9168c1aaf1a02b01ec7d8d1e"}, - {file = "debugpy-1.6.7-cp310-cp310-win32.whl", hash = "sha256:33edb4afa85c098c24cc361d72ba7c21bb92f501104514d4ffec1fb36e09c01a"}, - {file = "debugpy-1.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:ed6d5413474e209ba50b1a75b2d9eecf64d41e6e4501977991cdc755dc83ab0f"}, - {file = "debugpy-1.6.7-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:38ed626353e7c63f4b11efad659be04c23de2b0d15efff77b60e4740ea685d07"}, - {file = "debugpy-1.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279d64c408c60431c8ee832dfd9ace7c396984fd7341fa3116aee414e7dcd88d"}, - {file = "debugpy-1.6.7-cp37-cp37m-win32.whl", hash = "sha256:dbe04e7568aa69361a5b4c47b4493d5680bfa3a911d1e105fbea1b1f23f3eb45"}, - {file = "debugpy-1.6.7-cp37-cp37m-win_amd64.whl", hash = "sha256:f90a2d4ad9a035cee7331c06a4cf2245e38bd7c89554fe3b616d90ab8aab89cc"}, - {file = "debugpy-1.6.7-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5224eabbbeddcf1943d4e2821876f3e5d7d383f27390b82da5d9558fd4eb30a9"}, - {file = "debugpy-1.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae1123dff5bfe548ba1683eb972329ba6d646c3a80e6b4c06cd1b1dd0205e9b"}, - {file = "debugpy-1.6.7-cp38-cp38-win32.whl", hash = "sha256:9cd10cf338e0907fdcf9eac9087faa30f150ef5445af5a545d307055141dd7a4"}, - {file = "debugpy-1.6.7-cp38-cp38-win_amd64.whl", hash = "sha256:aaf6da50377ff4056c8ed470da24632b42e4087bc826845daad7af211e00faad"}, - {file = "debugpy-1.6.7-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0679b7e1e3523bd7d7869447ec67b59728675aadfc038550a63a362b63029d2c"}, - {file = "debugpy-1.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de86029696e1b3b4d0d49076b9eba606c226e33ae312a57a46dca14ff370894d"}, - {file = "debugpy-1.6.7-cp39-cp39-win32.whl", hash = "sha256:d71b31117779d9a90b745720c0eab54ae1da76d5b38c8026c654f4a066b0130a"}, - {file = "debugpy-1.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:c0ff93ae90a03b06d85b2c529eca51ab15457868a377c4cc40a23ab0e4e552a3"}, - {file = "debugpy-1.6.7-py2.py3-none-any.whl", hash = "sha256:53f7a456bc50706a0eaabecf2d3ce44c4d5010e46dfc65b6b81a518b42866267"}, - {file = "debugpy-1.6.7.zip", hash = "sha256:c4c2f0810fa25323abfdfa36cbbbb24e5c3b1a42cb762782de64439c575d67f2"}, + {file = "debugpy-1.8.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb"}, + {file = "debugpy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada"}, + {file = "debugpy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:a8b7a2fd27cd9f3553ac112f356ad4ca93338feadd8910277aff71ab24d8775f"}, + {file = "debugpy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5d9de202f5d42e62f932507ee8b21e30d49aae7e46d5b1dd5c908db1d7068637"}, + {file = "debugpy-1.8.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:ef54404365fae8d45cf450d0544ee40cefbcb9cb85ea7afe89a963c27028261e"}, + {file = "debugpy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60009b132c91951354f54363f8ebdf7457aeb150e84abba5ae251b8e9f29a8a6"}, + {file = "debugpy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:8cd0197141eb9e8a4566794550cfdcdb8b3db0818bdf8c49a8e8f8053e56e38b"}, + {file = "debugpy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:a64093656c4c64dc6a438e11d59369875d200bd5abb8f9b26c1f5f723622e153"}, + {file = "debugpy-1.8.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:b05a6b503ed520ad58c8dc682749113d2fd9f41ffd45daec16e558ca884008cd"}, + {file = "debugpy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c6fb41c98ec51dd010d7ed650accfd07a87fe5e93eca9d5f584d0578f28f35f"}, + {file = "debugpy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:46ab6780159eeabb43c1495d9c84cf85d62975e48b6ec21ee10c95767c0590aa"}, + {file = "debugpy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:bdc5ef99d14b9c0fcb35351b4fbfc06ac0ee576aeab6b2511702e5a648a2e595"}, + {file = "debugpy-1.8.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:61eab4a4c8b6125d41a34bad4e5fe3d2cc145caecd63c3fe953be4cc53e65bf8"}, + {file = "debugpy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:125b9a637e013f9faac0a3d6a82bd17c8b5d2c875fb6b7e2772c5aba6d082332"}, + {file = "debugpy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:57161629133113c97b387382045649a2b985a348f0c9366e22217c87b68b73c6"}, + {file = "debugpy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:e3412f9faa9ade82aa64a50b602544efcba848c91384e9f93497a458767e6926"}, + {file = "debugpy-1.8.0-py2.py3-none-any.whl", hash = "sha256:9c9b0ac1ce2a42888199df1a1906e45e6f3c9555497643a85e0bf2406e3ffbc4"}, + {file = "debugpy-1.8.0.zip", hash = "sha256:12af2c55b419521e33d5fb21bd022df0b5eb267c3e178f1d374a63a2a6bdccd0"}, ] [[package]] @@ -1532,31 +1634,49 @@ files = [ ] [[package]] -name = "Deprecated" -version = "1.2.13" +name = "deprecated" +version = "1.2.14" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "Deprecated-1.2.13-py2.py3-none-any.whl", hash = "sha256:64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d"}, - {file = "Deprecated-1.2.13.tar.gz", hash = "sha256:43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d"}, + {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, + {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, ] [package.dependencies] wrapt = ">=1.10,<2" [package.extras] -dev = ["PyTest", "PyTest (<5)", "PyTest-Cov", "PyTest-Cov (<2.6)", "bump2version (<1)", "configparser (<5)", "importlib-metadata (<3)", "importlib-resources (<4)", "sphinx (<2)", "sphinxcontrib-websupport (<2)", "tox", "zipp (<2)"] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] + +[[package]] +name = "deptry" +version = "0.12.0" +description = "A command line utility to check for unused, missing and transitive dependencies in a Python project." +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "deptry-0.12.0-py3-none-any.whl", hash = "sha256:69c801a6ae1b39c7b8e0daf40dbe8b75f1f161277d206dd8f921f32cd22dad91"}, + {file = "deptry-0.12.0.tar.gz", hash = "sha256:ac3cd32d149c92a9af12f63cd9486ddd1760f0277ed0cf306c6ef0388f57ff0a"}, +] + +[package.dependencies] +chardet = ">=4.0.0" +click = ">=8.0.0,<9.0.0" +colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} +pathspec = ">=0.9.0" +tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version < \"3.11\""} [[package]] name = "dill" -version = "0.3.6" -description = "serialize all of python" +version = "0.3.7" +description = "serialize all of Python" optional = false python-versions = ">=3.7" files = [ - {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, - {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, + {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, + {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, ] [package.extras] @@ -1564,13 +1684,13 @@ graph = ["objgraph (>=1.7.2)"] [[package]] name = "distlib" -version = "0.3.6" +version = "0.3.7" 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"}, + {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, + {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, ] [[package]] @@ -1592,6 +1712,31 @@ idna = ["idna (>=2.1,<4.0)"] trio = ["trio (>=0.14,<0.23)"] wmi = ["wmi (>=1.5.1,<2.0.0)"] +[[package]] +name = "docker-pycreds" +version = "0.4.0" +description = "Python bindings for the docker credentials store API" +optional = false +python-versions = "*" +files = [ + {file = "docker-pycreds-0.4.0.tar.gz", hash = "sha256:6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4"}, + {file = "docker_pycreds-0.4.0-py2.py3-none-any.whl", hash = "sha256:7266112468627868005106ec19cd0d722702d2b7d5912a28e19b826c3d37af49"}, +] + +[package.dependencies] +six = ">=1.4.0" + +[[package]] +name = "docstring-parser-fork" +version = "0.0.5" +description = "Parse Python docstrings in reST, Google and Numpydoc format" +optional = false +python-versions = ">=3.6,<4.0" +files = [ + {file = "docstring_parser_fork-0.0.5-py3-none-any.whl", hash = "sha256:d521dea9b9cc6c60ab5569fa0c1115e3b84a83e6413266fb111a7c81cb935997"}, + {file = "docstring_parser_fork-0.0.5.tar.gz", hash = "sha256:395ae8ee6a359e268670ebc4fe9a40dab917a94f6decd7cda8e86f9bea5c9456"}, +] + [[package]] name = "docutils" version = "0.20.1" @@ -1603,6 +1748,17 @@ files = [ {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, ] +[[package]] +name = "dotty-dict" +version = "1.3.1" +description = "Dictionary wrapper for quick access to deeply nested keys." +optional = false +python-versions = ">=3.5,<4.0" +files = [ + {file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"}, + {file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"}, +] + [[package]] name = "email-validator" version = "1.3.1" @@ -1620,13 +1776,13 @@ idna = ">=2.0.0" [[package]] name = "exceptiongroup" -version = "1.1.1" +version = "1.1.3" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, - {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, ] [package.extras] @@ -1648,48 +1804,49 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] name = "executing" -version = "1.2.0" +version = "2.0.1" description = "Get the currently executing AST node of a frame, and other information" optional = false -python-versions = "*" +python-versions = ">=3.5" files = [ - {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, - {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, ] [package.extras] -tests = ["asttokens", "littleutils", "pytest", "rich"] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] [[package]] name = "filelock" -version = "3.12.0" +version = "3.13.1" description = "A platform independent file lock." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "filelock-3.12.0-py3-none-any.whl", hash = "sha256:ad98852315c2ab702aeb628412cbf7e95b7ce8c3bf9565670b4eaecf1db370a9"}, - {file = "filelock-3.12.0.tar.gz", hash = "sha256:fc03ae43288c013d2ea83c8597001b1129db351aad9c57fe2409327916b8e718"}, + {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, + {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, ] [package.extras] -docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] [[package]] name = "flake8" -version = "5.0.4" +version = "6.1.0" description = "the modular source code checker: pep8 pyflakes and co" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.8.1" files = [ - {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, - {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, + {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"}, + {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"}, ] [package.dependencies] mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.9.0,<2.10.0" -pyflakes = ">=2.5.0,<2.6.0" +pycodestyle = ">=2.11.0,<2.12.0" +pyflakes = ">=3.1.0,<3.2.0" [[package]] name = "flask" @@ -1714,13 +1871,13 @@ dotenv = ["python-dotenv"] [[package]] name = "flask-appbuilder" -version = "4.3.3" +version = "4.3.10" description = "Simple and rapid application development framework, built on top of Flask. includes detailed security, auto CRUD generation for your models, google charts and much more." optional = false python-versions = "~=3.7" files = [ - {file = "Flask-AppBuilder-4.3.3.tar.gz", hash = "sha256:b420379f74788e431a2763f8d3749cc37712df682dc00a45538d85d989340768"}, - {file = "Flask_AppBuilder-4.3.3-py3-none-any.whl", hash = "sha256:7eb1904d8f61297778ebf0d0b83f1d74b154534c9e84af3bb9198cfc0f51ff05"}, + {file = "Flask-AppBuilder-4.3.10.tar.gz", hash = "sha256:4173c878e56b81c6acac5e3c80c133f4183f43442fd944552bd9f4023f5baceb"}, + {file = "Flask_AppBuilder-4.3.10-py3-none-any.whl", hash = "sha256:c0af506e1a68e7ee14f26a16fda829f1a14f8343654c30bdbb1351d23c545df9"}, ] [package.dependencies] @@ -1728,7 +1885,7 @@ apispec = {version = ">=6.0.0,<7", extras = ["yaml"]} click = ">=8,<9" colorama = ">=0.3.9,<1" email-validator = ">=1.0.5,<2" -Flask = ">=2,<3" +Flask = ">=2,<2.3.0" Flask-Babel = ">=1,<3" Flask-JWT-Extended = ">=4.0.0,<5.0.0" Flask-Limiter = ">3,<4" @@ -1743,12 +1900,14 @@ PyJWT = ">=2.0.0,<3.0.0" python-dateutil = ">=2.3,<3" SQLAlchemy = "<1.5" sqlalchemy-utils = ">=0.32.21,<1" +werkzeug = "<3" WTForms = "<4" [package.extras] jmespath = ["jmespath (>=0.9.5)"] oauth = ["Authlib (>=0.14,<2.0.0)"] openid = ["Flask-OpenID (>=1.2.5,<2)"] +talisman = ["flask-talisman (>=1.0.0,<2.0)"] [[package]] name = "flask-babel" @@ -1772,32 +1931,32 @@ dev = ["Pallets-Sphinx-Themes", "bumpversion", "ghp-import", "pytest", "pytest-m [[package]] name = "flask-caching" -version = "2.0.2" +version = "2.1.0" description = "Adds caching support to Flask applications." optional = false python-versions = ">=3.7" files = [ - {file = "Flask-Caching-2.0.2.tar.gz", hash = "sha256:24b60c552d59a9605cc1b6a42c56cdb39a82a28dab4532bbedb9222ae54ecb4e"}, - {file = "Flask_Caching-2.0.2-py3-none-any.whl", hash = "sha256:19571f2570e9b8dd9dd9d2f49d7cbee69c14ebe8cc001100b1eb98c379dd80ad"}, + {file = "Flask-Caching-2.1.0.tar.gz", hash = "sha256:b7500c145135836a952e3de3a80881d9654e327a29c852c9265607f5c449235c"}, + {file = "Flask_Caching-2.1.0-py3-none-any.whl", hash = "sha256:f02645a629a8c89800d96dc8f690a574a0d49dcd66c7536badc6d362ba46b716"}, ] [package.dependencies] cachelib = ">=0.9.0,<0.10.0" -Flask = "<3" +Flask = "*" [[package]] name = "flask-jwt-extended" -version = "4.5.2" +version = "4.5.3" description = "Extended JWT integration with Flask" optional = false python-versions = ">=3.7,<4" files = [ - {file = "Flask-JWT-Extended-4.5.2.tar.gz", hash = "sha256:ba56245ba43b71c8ae936784b867625dce8b9956faeedec2953222e57942fb0b"}, - {file = "Flask_JWT_Extended-4.5.2-py2.py3-none-any.whl", hash = "sha256:e0ef23d8c863746bd141046167073699e1a7b03c97169cbba70f05b8d9cd6b9e"}, + {file = "Flask-JWT-Extended-4.5.3.tar.gz", hash = "sha256:061ef3d25ed5743babe4964ab38f36d870e6d2fd8a126bab5d77ddef8a01932b"}, + {file = "Flask_JWT_Extended-4.5.3-py2.py3-none-any.whl", hash = "sha256:eaec42af107dcb919785a4b3766c09ffba9f286b92a8d58603933f28fd4db6a3"}, ] [package.dependencies] -Flask = ">=2.0,<3.0" +Flask = ">=2.0,<4.0" PyJWT = ">=2.0,<3.0" Werkzeug = ">=0.14" @@ -1806,13 +1965,13 @@ asymmetric-crypto = ["cryptography (>=3.3.1)"] [[package]] name = "flask-limiter" -version = "3.3.1" +version = "3.5.0" description = "Rate limiting for flask applications" optional = false python-versions = ">=3.7" files = [ - {file = "Flask-Limiter-3.3.1.tar.gz", hash = "sha256:2b99fec0cfc44f490bd729da52bb89c5c4158f38812d0f3854c01d0a83664923"}, - {file = "Flask_Limiter-3.3.1-py3-none-any.whl", hash = "sha256:3451fb8d84f50007753b799831c57c59c1eb3432cc9754cc4b7e41a88d8bdf51"}, + {file = "Flask-Limiter-3.5.0.tar.gz", hash = "sha256:13a3491b994c49f7cb4706587a38ca47e8162b576530472df38be68104f299c0"}, + {file = "Flask_Limiter-3.5.0-py3-none-any.whl", hash = "sha256:dbda4174f44e6cb858c6eb75e7488186f2977dd5d33d7028ba1aabf179de1bee"}, ] [package.dependencies] @@ -1829,13 +1988,13 @@ redis = ["limits[redis]"] [[package]] name = "flask-login" -version = "0.6.2" +version = "0.6.3" description = "User authentication and session management for Flask." optional = false python-versions = ">=3.7" files = [ - {file = "Flask-Login-0.6.2.tar.gz", hash = "sha256:c0a7baa9fdc448cdd3dd6f0939df72eec5177b2f7abe6cb82fc934d29caac9c3"}, - {file = "Flask_Login-0.6.2-py3-none-any.whl", hash = "sha256:1ef79843f5eddd0f143c2cd994c1b05ac83c0401dc6234c143495af9a939613f"}, + {file = "Flask-Login-0.6.3.tar.gz", hash = "sha256:5e23d14a607ef12806c699590b89d0f0e0d67baeec599d75947bf9c147330333"}, + {file = "Flask_Login-0.6.3-py3-none-any.whl", hash = "sha256:849b25b82a436bf830a054e74214074af59097171562ab10bfa999e6b78aae5d"}, ] [package.dependencies] @@ -1874,157 +2033,212 @@ SQLAlchemy = ">=0.8.0" [[package]] name = "flask-wtf" -version = "1.1.1" +version = "1.2.1" description = "Form rendering, validation, and CSRF protection for Flask with WTForms." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Flask-WTF-1.1.1.tar.gz", hash = "sha256:41c4244e9ae626d63bed42ae4785b90667b885b1535d5a4095e1f63060d12aa9"}, - {file = "Flask_WTF-1.1.1-py3-none-any.whl", hash = "sha256:7887d6f1ebb3e17bf648647422f0944c9a469d0fcf63e3b66fb9a83037e38b2c"}, + {file = "flask_wtf-1.2.1-py3-none-any.whl", hash = "sha256:fa6793f2fb7e812e0fe9743b282118e581fb1b6c45d414b8af05e659bd653287"}, + {file = "flask_wtf-1.2.1.tar.gz", hash = "sha256:8bb269eb9bb46b87e7c8233d7e7debdf1f8b74bf90cc1789988c29b37a97b695"}, ] [package.dependencies] -Flask = "*" +flask = "*" itsdangerous = "*" -WTForms = "*" +wtforms = "*" [package.extras] email = ["email-validator"] [[package]] name = "frozenlist" -version = "1.3.3" +version = "1.4.0" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, + {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, + {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, + {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, + {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, + {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, + {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, + {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, + {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, + {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, +] + +[[package]] +name = "fsspec" +version = "2023.10.0" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2023.10.0-py3-none-any.whl", hash = "sha256:346a8f024efeb749d2a5fca7ba8854474b1ff9af7c3faaf636a4548781136529"}, + {file = "fsspec-2023.10.0.tar.gz", hash = "sha256:330c66757591df346ad3091a53bd907e15348c2ba17d63fd54f5c39c4457d2a5"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + +[[package]] +name = "future" +version = "0.18.3" +description = "Clean single-source support for Python 3 and 2" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, - {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, - {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, - {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, - {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, - {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, - {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, - {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, - {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, - {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, - {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, + {file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"}, ] [[package]] name = "gcloud-aio-auth" -version = "4.2.3" +version = "4.1.5" description = "Python Client for Google Cloud Auth" optional = false python-versions = ">=3.7,<4.0" files = [ - {file = "gcloud_aio_auth-4.2.3-py3-none-any.whl", hash = "sha256:e4adadd36e35eeeb8537b926840372c3080c2f5a6909d44aa1bacbced2260bb1"}, - {file = "gcloud_aio_auth-4.2.3.tar.gz", hash = "sha256:8e12297c5b45cfc20d629b83e1233f83a1c7d5f830f24f31bc5bb8816c0cda1b"}, + {file = "gcloud_aio_auth-4.1.5-py3-none-any.whl", hash = "sha256:606431bd670effc4b67456877747d400c4dd0d8d20bbca98c72f09041359985f"}, + {file = "gcloud_aio_auth-4.1.5.tar.gz", hash = "sha256:12b8308f32a83b76ae04129800df8eb09e8803219c2ebabccad2364f39744f79"}, ] [package.dependencies] aiohttp = ">=3.3.0,<4.0.0" backoff = ">=1.0.0,<3.0.0" -chardet = ">=2.0,<6.0" -cryptography = ">=2.0.0,<42.0.0" +chardet = {version = ">=2.0,<4.1", markers = "python_version >= \"3.7\""} +cryptography = ">=2.0.0,<39.0.0" +future = ">=0.17.0,<0.19.0" pyjwt = ">=1.5.3,<3.0.0" -setuptools = ">=66.0.0,<67.0.0" +six = ">=1.11.0,<2.0.0" [[package]] name = "gcloud-aio-bigquery" -version = "6.3.0" +version = "7.0.0" description = "Python Client for Google Cloud BigQuery" optional = false -python-versions = ">=3.7,<4.0" +python-versions = ">=3.8,<4.0" files = [ - {file = "gcloud_aio_bigquery-6.3.0-py3-none-any.whl", hash = "sha256:9479b2c8c3267b6fa13e31cd3b42544ba2a5fbac5af9cc30d7cf3cbe461166c4"}, - {file = "gcloud_aio_bigquery-6.3.0.tar.gz", hash = "sha256:4448e8a8ba0aefbb12e75c80a7a2de415e31307816815b698c7957af7e406477"}, + {file = "gcloud_aio_bigquery-7.0.0-py3-none-any.whl", hash = "sha256:188b96b16b0fdbef2a0bc15ffce3f5a930ecc36de537fcfa5794fc397506fdd8"}, + {file = "gcloud_aio_bigquery-7.0.0.tar.gz", hash = "sha256:2cd1c7c9dcb68122ff6187f2b533941c86d954e5312d942c8107aac4d20ea2ec"}, ] [package.dependencies] -gcloud-aio-auth = ">=3.1.0,<5.0.0" -setuptools = ">=66.0.0,<67.0.0" +gcloud-aio-auth = ">=3.1.0,<6.0.0" [[package]] name = "gcloud-aio-storage" -version = "8.3.0" +version = "9.0.0" description = "Python Client for Google Cloud Storage" optional = false -python-versions = ">=3.7,<4.0" +python-versions = ">=3.8,<4.0" files = [ - {file = "gcloud_aio_storage-8.3.0-py3-none-any.whl", hash = "sha256:6154eb9fe7e254f1ee3312cf3cc464109da8fce979815b183727b60347daec59"}, - {file = "gcloud_aio_storage-8.3.0.tar.gz", hash = "sha256:222ccd4cfbbd7d4a5e5bfa8010235f70b65697e68f25bf68fb3e570dceac78e8"}, + {file = "gcloud_aio_storage-9.0.0-py3-none-any.whl", hash = "sha256:223583018b0ad68f22201593970c638e00fb86f40d9bb9187b17910a02ab118c"}, + {file = "gcloud_aio_storage-9.0.0.tar.gz", hash = "sha256:99e6d30c65809ceafe059d496dbf10a4186edb1850fe9634988e096966503046"}, ] [package.dependencies] aiofiles = ">=0.6.0,<24.0.0" -gcloud-aio-auth = ">=3.6.0,<5.0.0" -pyasn1-modules = ">=0.2.1,<0.3.0" +gcloud-aio-auth = ">=3.6.0,<6.0.0" +pyasn1-modules = ">=0.2.1,<0.4.0" rsa = ">=3.1.4,<5.0.0" -setuptools = ">=66.0.0,<67.0.0" + +[[package]] +name = "gcsfs" +version = "2023.10.0" +description = "Convenient Filesystem interface over GCS" +optional = false +python-versions = ">=3.8" +files = [ + {file = "gcsfs-2023.10.0-py2.py3-none-any.whl", hash = "sha256:f3ad41652a596ca56e44778e041f428d022add3eff62b97a47302014affd270f"}, + {file = "gcsfs-2023.10.0.tar.gz", hash = "sha256:1915e6d766faad9a295e815b13c59966b925a274108b8a56f673623bf4aef83f"}, +] + +[package.dependencies] +aiohttp = "<4.0.0a0 || >4.0.0a0,<4.0.0a1 || >4.0.0a1" +decorator = ">4.1.2" +fsspec = "2023.10.0" +google-auth = ">=1.2" +google-auth-oauthlib = "*" +google-cloud-storage = "*" +requests = "*" + +[package.extras] +crc = ["crcmod"] +gcsfuse = ["fusepy"] [[package]] name = "ghp-import" @@ -2045,41 +2259,58 @@ dev = ["flake8", "markdown", "twine", "wheel"] [[package]] name = "gitdb" -version = "4.0.10" +version = "4.0.11" 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"}, + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, ] [package.dependencies] smmap = ">=3.0.1,<6" [[package]] -name = "GitPython" -version = "3.1.31" +name = "gitpython" +version = "3.1.40" 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"}, + {file = "GitPython-3.1.40-py3-none-any.whl", hash = "sha256:cf14627d5a8049ffbf49915732e5eddbe8134c3bdb9d476e6182b676fc573f8a"}, + {file = "GitPython-3.1.40.tar.gz", hash = "sha256:22b126e9ffb671fdd0c129796343a02bf67bf2994b35449ffc9321aa755e18a4"}, ] [package.dependencies] gitdb = ">=4.0.1,<5" +[package.extras] +test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-instafail", "pytest-subtests", "pytest-sugar"] + +[[package]] +name = "google" +version = "3.0.0" +description = "Python bindings to the Google search engine." +optional = false +python-versions = "*" +files = [ + {file = "google-3.0.0-py2.py3-none-any.whl", hash = "sha256:889cf695f84e4ae2c55fbc0cfdaf4c1e729417fa52ab1db0485202ba173e4935"}, + {file = "google-3.0.0.tar.gz", hash = "sha256:143530122ee5130509ad5e989f0512f7cb218b2d4eddbafbad40fd10e8d8ccbe"}, +] + +[package.dependencies] +beautifulsoup4 = "*" + [[package]] name = "google-ads" -version = "21.3.0" +version = "22.1.0" description = "Client library for the Google Ads API" optional = false -python-versions = ">=3.7" +python-versions = ">=3.7, <3.12" files = [ - {file = "google-ads-21.3.0.tar.gz", hash = "sha256:bd4fcb6bd5e55bace413e889e82012d48578aa28f7b4d726c86e2d594c753c6c"}, - {file = "google_ads-21.3.0-py3-none-any.whl", hash = "sha256:961943fc737941a38f1a826681f7974448df7c60e6c8db2ac7168b26d66738a7"}, + {file = "google-ads-22.1.0.tar.gz", hash = "sha256:cfab38b40eb8424a4a514823bd8b911a57ef55dd64e2112cfa46a70d8090de98"}, + {file = "google_ads-22.1.0-py3-none-any.whl", hash = "sha256:6fdd3fb635678fbb3c8f87271afc81f0e139882b83b48505160fc4daacf33ad0"}, ] [package.dependencies] @@ -2089,7 +2320,7 @@ googleapis-common-protos = ">=1.56.0,<2.0.0" grpcio = ">=1.38.1,<2.0.0" grpcio-status = ">=1.38.1,<2.0.0" proto-plus = ">=1.19.6,<2.0.0" -protobuf = ">=3.12.0,<3.18.dev0 || >=3.20.dev0,<5.0.0dev" +protobuf = ">=3.12.0,<3.18.dev0 || >=3.20.dev0,<5.0.0" PyYAML = ">=5.1,<7.0" setuptools = ">=40.3.0" @@ -2098,37 +2329,37 @@ tests = ["nox (>=2020.12.31,<2022.6)"] [[package]] name = "google-api-core" -version = "2.11.0" +version = "2.12.0" description = "Google API client core library" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-core-2.11.0.tar.gz", hash = "sha256:4b9bb5d5a380a0befa0573b302651b8a9a89262c1730e37bf423cec511804c22"}, - {file = "google_api_core-2.11.0-py3-none-any.whl", hash = "sha256:ce222e27b0de0d7bc63eb043b956996d6dccab14cc3b690aaea91c9cc99dc16e"}, + {file = "google-api-core-2.12.0.tar.gz", hash = "sha256:c22e01b1e3c4dcd90998494879612c38d0a3411d1f7b679eb89e2abe3ce1f553"}, + {file = "google_api_core-2.12.0-py3-none-any.whl", hash = "sha256:ec6054f7d64ad13b41e43d96f735acbd763b0f3b695dabaa2d579673f6a6e160"}, ] [package.dependencies] -google-auth = ">=2.14.1,<3.0dev" -googleapis-common-protos = ">=1.56.2,<2.0dev" +google-auth = ">=2.14.1,<3.0.dev0" +googleapis-common-protos = ">=1.56.2,<2.0.dev0" grpcio = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} -grpcio-status = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" -requests = ">=2.18.0,<3.0.0dev" +grpcio-status = {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""} +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" +requests = ">=2.18.0,<3.0.0.dev0" [package.extras] -grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0dev)", "grpcio-status (>=1.49.1,<2.0dev)"] -grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] -grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.97.0" +version = "2.106.0" description = "Google API Client Library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-python-client-2.97.0.tar.gz", hash = "sha256:48277291894876a1ca7ed4127e055e81f81e6343ced1b544a7200ae2c119dcd7"}, - {file = "google_api_python_client-2.97.0-py2.py3-none-any.whl", hash = "sha256:5215f4cd577753fc4192ccfbe0bb8b55d4bb5fd68fa6268ac5cf271b6305de31"}, + {file = "google-api-python-client-2.106.0.tar.gz", hash = "sha256:f6a3862be2f6e5e0536d7bd47b5af3f24ac0b9147c76c830cafb3329d71d5724"}, + {file = "google_api_python_client-2.106.0-py2.py3-none-any.whl", hash = "sha256:c47c0dae5dd20aa43e4ea184566fe59d0c8fd0b86dd223b29040d8ea4f7ed6ea"}, ] [package.dependencies] @@ -2140,53 +2371,51 @@ uritemplate = ">=3.0.1,<5" [[package]] name = "google-auth" -version = "2.17.3" +version = "2.23.4" description = "Google Authentication Library" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +python-versions = ">=3.7" files = [ - {file = "google-auth-2.17.3.tar.gz", hash = "sha256:ce311e2bc58b130fddf316df57c9b3943c2a7b4f6ec31de9663a9333e4064efc"}, - {file = "google_auth-2.17.3-py2.py3-none-any.whl", hash = "sha256:f586b274d3eb7bd932ea424b1c702a30e0393a2e2bc4ca3eae8263ffd8be229f"}, + {file = "google-auth-2.23.4.tar.gz", hash = "sha256:79905d6b1652187def79d491d6e23d0cbb3a21d3c7ba0dbaa9c8a01906b13ff3"}, + {file = "google_auth-2.23.4-py2.py3-none-any.whl", hash = "sha256:d4bbc92fe4b8bfd2f3e8d88e5ba7085935da208ee38a134fc280e7ce682a05f2"}, ] [package.dependencies] cachetools = ">=2.0.0,<6.0" pyasn1-modules = ">=0.2.1" -rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} -six = ">=1.9.0" +rsa = ">=3.1.4,<5" [package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "requests (>=2.20.0,<3.0.0dev)"] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] -requests = ["requests (>=2.20.0,<3.0.0dev)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "google-auth-httplib2" -version = "0.1.0" +version = "0.1.1" description = "Google Authentication Library: httplib2 transport" optional = false python-versions = "*" files = [ - {file = "google-auth-httplib2-0.1.0.tar.gz", hash = "sha256:a07c39fd632becacd3f07718dfd6021bf396978f03ad3ce4321d060015cc30ac"}, - {file = "google_auth_httplib2-0.1.0-py2.py3-none-any.whl", hash = "sha256:31e49c36c6b5643b57e82617cb3e021e3e1d2df9da63af67252c02fa9c1f4a10"}, + {file = "google-auth-httplib2-0.1.1.tar.gz", hash = "sha256:c64bc555fdc6dd788ea62ecf7bccffcf497bf77244887a3f3d7a5a02f8e3fc29"}, + {file = "google_auth_httplib2-0.1.1-py2.py3-none-any.whl", hash = "sha256:42c50900b8e4dcdf8222364d1f0efe32b8421fb6ed72f2613f12f75cc933478c"}, ] [package.dependencies] google-auth = "*" -httplib2 = ">=0.15.0" -six = "*" +httplib2 = ">=0.19.0" [[package]] name = "google-auth-oauthlib" -version = "1.0.0" +version = "0.8.0" description = "Google Authentication Library" optional = false python-versions = ">=3.6" files = [ - {file = "google-auth-oauthlib-1.0.0.tar.gz", hash = "sha256:e375064964820b47221a7e1b7ee1fd77051b6323c3f9e3e19785f78ab67ecfc5"}, - {file = "google_auth_oauthlib-1.0.0-py2.py3-none-any.whl", hash = "sha256:95880ca704928c300f48194d1770cf5b1462835b6e49db61445a520f793fd5fb"}, + {file = "google-auth-oauthlib-0.8.0.tar.gz", hash = "sha256:81056a310fb1c4a3e5a7e1a443e1eb96593c6bbc55b26c0261e4d3295d3e6593"}, + {file = "google_auth_oauthlib-0.8.0-py2.py3-none-any.whl", hash = "sha256:40cc612a13c3336d5433e94e2adb42a0c88f6feb6c55769e44500fc70043a576"}, ] [package.dependencies] @@ -2198,13 +2427,13 @@ tool = ["click (>=6.0.0)"] [[package]] name = "google-cloud-aiplatform" -version = "1.30.1" +version = "1.36.0" description = "Vertex AI API client library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "google-cloud-aiplatform-1.30.1.tar.gz", hash = "sha256:7552a6b2e66d7a9ff3c4b2bb95b0e9c182e7475dfb35d6347e9299f78779135a"}, - {file = "google_cloud_aiplatform-1.30.1-py2.py3-none-any.whl", hash = "sha256:ab1bbd4cf83cf583b7dea7e53421ad076f18b63e93cb22fb53c03176d5aa9258"}, + {file = "google-cloud-aiplatform-1.36.0.tar.gz", hash = "sha256:c35eb179fa3107c262024a63bb4a3dc1887678424a0b9f49f0da3f5179896186"}, + {file = "google_cloud_aiplatform-1.36.0-py2.py3-none-any.whl", hash = "sha256:06adb1605208a9bdbadd8c4deeaeb6511a7f59220ef606e2d95ccc1da705ebda"}, ] [package.dependencies] @@ -2215,33 +2444,35 @@ google-cloud-storage = ">=1.32.0,<3.0.0dev" packaging = ">=14.3" proto-plus = ">=1.22.0,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" -shapely = "<2.0.0" +shapely = "<3.0.0dev" [package.extras] autologging = ["mlflow (>=1.27.0,<=2.1.1)"] cloud-profiler = ["tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "werkzeug (>=2.0.0,<2.1.0dev)"] -datasets = ["pyarrow (>=3.0.0,<8.0dev)"] +datasets = ["pyarrow (>=10.0.1)", "pyarrow (>=3.0.0,<8.0dev)"] endpoint = ["requests (>=2.28.1)"] -full = ["docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<0.76.0)", "google-cloud-bigquery-storage", "google-vizier (==0.0.4)", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pyyaml (>=5.3,<7)", "requests (>=2.28.1)", "starlette (>=0.17.1)", "tensorflow (>=2.3.0,<3.0.0dev)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)"] +full = ["cloudpickle (<3.0)", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<0.103.1)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-logging (<4.0)", "google-vizier (==0.0.11)", "google-vizier (==0.0.4)", "google-vizier (>=0.0.14)", "google-vizier (>=0.1.6)", "httpx (>=0.23.0,<0.25.0)", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=10.0.1)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyyaml (==5.3.1)", "ray[default] (>=2.4,<2.5)", "ray[default] (>=2.5,<2.5.1)", "requests (>=2.28.1)", "starlette (>=0.17.1)", "tensorflow (>=2.3.0,<3.0.0dev)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)"] lit = ["explainable-ai-sdk (>=1.0.0)", "lit-nlp (==0.4.0)", "pandas (>=1.0.0)", "tensorflow (>=2.3.0,<3.0.0dev)"] metadata = ["numpy (>=1.15.0)", "pandas (>=1.0.0)"] -pipelines = ["pyyaml (>=5.3,<7)"] -prediction = ["docker (>=5.0.3)", "fastapi (>=0.71.0,<0.76.0)", "starlette (>=0.17.1)", "uvicorn[standard] (>=0.16.0)"] +pipelines = ["pyyaml (==5.3.1)"] +prediction = ["docker (>=5.0.3)", "fastapi (>=0.71.0,<0.103.1)", "httpx (>=0.23.0,<0.25.0)", "starlette (>=0.17.1)", "uvicorn[standard] (>=0.16.0)"] +preview = ["cloudpickle (<3.0)", "google-cloud-logging (<4.0)"] private-endpoints = ["requests (>=2.28.1)", "urllib3 (>=1.21.1,<1.27)"] +ray = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "pandas (>=1.0.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "ray[default] (>=2.4,<2.5)", "ray[default] (>=2.5,<2.5.1)"] tensorboard = ["tensorflow (>=2.3.0,<3.0.0dev)"] -testing = ["docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<0.76.0)", "google-cloud-bigquery-storage", "google-vizier (==0.0.4)", "grpcio-testing", "ipython", "kfp", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pytest-asyncio", "pytest-xdist", "pyyaml (>=5.3,<7)", "requests (>=2.28.1)", "scikit-learn", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)", "xgboost"] -vizier = ["google-vizier (==0.0.4)"] +testing = ["bigframes", "cloudpickle (<3.0)", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<0.103.1)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-logging (<4.0)", "google-vizier (==0.0.11)", "google-vizier (==0.0.4)", "google-vizier (>=0.0.14)", "google-vizier (>=0.1.6)", "grpcio-testing", "httpx (>=0.23.0,<0.25.0)", "ipython", "kfp", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=10.0.1)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyfakefs", "pytest-asyncio", "pytest-xdist", "pyyaml (==5.3.1)", "ray[default] (>=2.4,<2.5)", "ray[default] (>=2.5,<2.5.1)", "requests (>=2.28.1)", "requests-toolbelt (<1.0.0)", "scikit-learn", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.3.0,<=2.12.0)", "tensorflow (>=2.4.0,<3.0.0dev)", "torch (>=2.0.0,<2.1.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)", "xgboost", "xgboost-ray"] +vizier = ["google-vizier (==0.0.11)", "google-vizier (==0.0.4)", "google-vizier (>=0.0.14)", "google-vizier (>=0.1.6)"] xai = ["tensorflow (>=2.3.0,<3.0.0dev)"] [[package]] name = "google-cloud-appengine-logging" -version = "1.3.1" +version = "1.3.2" description = "Google Cloud Appengine Logging API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-appengine-logging-1.3.1.tar.gz", hash = "sha256:b3f5f797d6bacc60654de21901902f8a7878f7168d76be5d47c7775fe0c3e0a8"}, - {file = "google_cloud_appengine_logging-1.3.1-py2.py3-none-any.whl", hash = "sha256:8b1ec202de1ad4dbe5e40076af0324e179695b8dc4735c7dcedf6297786e761f"}, + {file = "google-cloud-appengine-logging-1.3.2.tar.gz", hash = "sha256:a2989fca0e88463b56432aa821e64b81c3d171ee37b84771189b48e8b97cd496"}, + {file = "google_cloud_appengine_logging-1.3.2-py2.py3-none-any.whl", hash = "sha256:6ac6261567b56611f6891fa650f76db8a48d528762e5c2a09230b41d82ee2be0"}, ] [package.dependencies] @@ -2266,13 +2497,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4 [[package]] name = "google-cloud-automl" -version = "2.11.2" +version = "2.11.3" description = "Google Cloud Automl API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-automl-2.11.2.tar.gz", hash = "sha256:c3893339ef1acfacdc30ba0d61b7e4bc2e40ab9cc26d2370ebe3c761990466a2"}, - {file = "google_cloud_automl-2.11.2-py2.py3-none-any.whl", hash = "sha256:4111ae06852d858e2ab6fa4520cc8b32bcee8a0c3fbf87f418eb998b7a7e11a1"}, + {file = "google-cloud-automl-2.11.3.tar.gz", hash = "sha256:55ca909fbc36b13a431ca7e78b0930b045c36bc60857e1b58e56cf3aef0d565d"}, + {file = "google_cloud_automl-2.11.3-py2.py3-none-any.whl", hash = "sha256:9f92c4ca4b0e0f6f31fb0676a6a9e6afd5685fd484bdc9c67beba052bbab2352"}, ] [package.dependencies] @@ -2285,15 +2516,31 @@ libcst = ["libcst (>=0.2.5)"] pandas = ["pandas (>=1.0.5)"] storage = ["google-cloud-storage (>=1.18.0,<3.0.0dev)"] +[[package]] +name = "google-cloud-batch" +version = "0.17.2" +description = "Google Cloud Batch API client library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-cloud-batch-0.17.2.tar.gz", hash = "sha256:381ac83d18b46354cb5c51d33dbfcede62b039f3f13960ac9691cb4178f3c5b7"}, + {file = "google_cloud_batch-0.17.2-py2.py3-none-any.whl", hash = "sha256:c614f17d47095fd0b41e3f7de2e66f6ec5f1168d682b8338dfa3c18803234be0"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + [[package]] name = "google-cloud-bigquery" -version = "3.11.4" +version = "3.13.0" description = "Google BigQuery API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-bigquery-3.11.4.tar.gz", hash = "sha256:697df117241a2283bcbb93b21e10badc14e51c9a90800d2a7e1a3e1c7d842974"}, - {file = "google_cloud_bigquery-3.11.4-py2.py3-none-any.whl", hash = "sha256:5fa7897743a0ed949ade25a0942fc9e7557d8fce307c6f8a76d1b604cf27f1b1"}, + {file = "google-cloud-bigquery-3.13.0.tar.gz", hash = "sha256:794ccfc93ccb0e0ad689442f896f9c82de56da0fe18a195531bb37096c2657d6"}, + {file = "google_cloud_bigquery-3.13.0-py2.py3-none-any.whl", hash = "sha256:eda3dbcff676e17962c54e5224e415b55e4f6833a5c896c6c8902b69e7dba4b4"}, ] [package.dependencies] @@ -2308,9 +2555,9 @@ python-dateutil = ">=2.7.2,<3.0dev" requests = ">=2.21.0,<3.0.0dev" [package.extras] -all = ["Shapely (>=1.8.4,<2.0dev)", "db-dtypes (>=0.3.0,<2.0.0dev)", "geopandas (>=0.9.0,<1.0dev)", "google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)", "ipywidgets (>=7.7.0)", "opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)", "tqdm (>=4.7.4,<5.0.0dev)"] +all = ["Shapely (>=1.8.4,<3.0.0dev)", "db-dtypes (>=0.3.0,<2.0.0dev)", "geopandas (>=0.9.0,<1.0dev)", "google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)", "ipywidgets (>=7.7.0)", "opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)", "tqdm (>=4.7.4,<5.0.0dev)"] bqstorage = ["google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "pyarrow (>=3.0.0)"] -geopandas = ["Shapely (>=1.8.4,<2.0dev)", "geopandas (>=0.9.0,<1.0dev)"] +geopandas = ["Shapely (>=1.8.4,<3.0.0dev)", "geopandas (>=0.9.0,<1.0dev)"] ipython = ["ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)"] ipywidgets = ["ipykernel (>=6.0.0)", "ipywidgets (>=7.7.0)"] opentelemetry = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] @@ -2319,13 +2566,13 @@ tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] [[package]] name = "google-cloud-bigquery-datatransfer" -version = "3.12.0" +version = "3.12.1" description = "Google Cloud Bigquery Datatransfer API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-bigquery-datatransfer-3.12.0.tar.gz", hash = "sha256:e63c5c37af453ee019ef1881701bb9f9a13eab8394f4e94cfa2f5b77abcc9c92"}, - {file = "google_cloud_bigquery_datatransfer-3.12.0-py2.py3-none-any.whl", hash = "sha256:13d48e9fd20b493dbbbc184a4c7ae5f1a2ff0ebc2b63c19c16cb7cf0b30acc2a"}, + {file = "google-cloud-bigquery-datatransfer-3.12.1.tar.gz", hash = "sha256:b845a74081ace32c9bbae93382b02a69db8560a356f61fd6a2e5f63334958148"}, + {file = "google_cloud_bigquery_datatransfer-3.12.1-py2.py3-none-any.whl", hash = "sha256:cb24e51155fb221cfc09f2a5b047f2dc8dbb1d106b84463c1300af0a6dcc7bae"}, ] [package.dependencies] @@ -2377,13 +2624,13 @@ libcst = ["libcst (>=0.2.5)"] [[package]] name = "google-cloud-build" -version = "3.20.0" +version = "3.20.1" description = "Google Cloud Build API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-build-3.20.0.tar.gz", hash = "sha256:82db53e2bebcfd2777b9a5b4c5805e13dc57b4cf781d5b5e3cf0a9894d1ae133"}, - {file = "google_cloud_build-3.20.0-py2.py3-none-any.whl", hash = "sha256:877ec8c8e75a8ee32273bb2c8f0427fced54ba51dfe9d49f49c90ef9ff50a135"}, + {file = "google-cloud-build-3.20.1.tar.gz", hash = "sha256:4588bfe36638c54dfb752f6cf6a0b216acd2f98c1dacde9e5e820e0c1b1eba1b"}, + {file = "google_cloud_build-3.20.1-py2.py3-none-any.whl", hash = "sha256:b11112cea6b700902d2a52deee27fba172d9244dbc2ba5d51bbfcd146b5f28f4"}, ] [package.dependencies] @@ -2394,13 +2641,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-compute" -version = "1.14.0" +version = "1.14.1" description = "Google Cloud Compute API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-compute-1.14.0.tar.gz", hash = "sha256:02d1a3cfe82127efd623ca696af905d89e87aaaeb9a5062159bdcf3747fd8f66"}, - {file = "google_cloud_compute-1.14.0-py2.py3-none-any.whl", hash = "sha256:601e6b9f26bae44a4551249daf933e34def4bea95a007294dacc197b3102b52d"}, + {file = "google-cloud-compute-1.14.1.tar.gz", hash = "sha256:acd987647d7c826aa97b4418141c740ead5e8811d3349315f2f89a30c01c7f4b"}, + {file = "google_cloud_compute-1.14.1-py2.py3-none-any.whl", hash = "sha256:b40d6aeeb2c5ce373675c869f1404a1bc19b9763b746ad8f2d91ed1148893d6f"}, ] [package.dependencies] @@ -2410,13 +2657,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-container" -version = "2.30.0" +version = "2.32.0" description = "Google Cloud Container API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-container-2.30.0.tar.gz", hash = "sha256:891ebe0377a4471977cc0d4aec331ac387723308ccff2c61ffbb4e1fffe6c176"}, - {file = "google_cloud_container-2.30.0-py2.py3-none-any.whl", hash = "sha256:85bc6ade6cf6fa3afe28c473903f309ae815cbe6a6b2421482cc161989ba6e7d"}, + {file = "google-cloud-container-2.32.0.tar.gz", hash = "sha256:694fb8da77963653e1c70fa60928b4a11faf8e1f1580a39025053a3e1bcce6de"}, + {file = "google_cloud_container-2.32.0-py2.py3-none-any.whl", hash = "sha256:a5555c6c19679332086859838fbaee468cb206e5e76365bb5027d5305a2c5bf4"}, ] [package.dependencies] @@ -2426,13 +2673,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-core" -version = "2.3.2" +version = "2.3.3" description = "Google Cloud API client core library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-core-2.3.2.tar.gz", hash = "sha256:b9529ee7047fd8d4bf4a2182de619154240df17fbe60ead399078c1ae152af9a"}, - {file = "google_cloud_core-2.3.2-py2.py3-none-any.whl", hash = "sha256:8417acf6466be2fa85123441696c4badda48db314c607cf1e5d543fa8bdc22fe"}, + {file = "google-cloud-core-2.3.3.tar.gz", hash = "sha256:37b80273c8d7eee1ae816b3a20ae43585ea50506cb0e60f3cf5be5f87f1373cb"}, + {file = "google_cloud_core-2.3.3-py2.py3-none-any.whl", hash = "sha256:fbd11cad3e98a7e5b0343dc07cb1039a5ffd7a5bb96e1f1e27cee4bda4a90863"}, ] [package.dependencies] @@ -2444,13 +2691,13 @@ grpc = ["grpcio (>=1.38.0,<2.0dev)"] [[package]] name = "google-cloud-datacatalog" -version = "3.15.0" +version = "3.16.0" description = "Google Cloud Datacatalog API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-datacatalog-3.15.0.tar.gz", hash = "sha256:4d8fc7ad30e5a3a72ae746d269156e672b75ad3841f413e2416d114bdf20228f"}, - {file = "google_cloud_datacatalog-3.15.0-py2.py3-none-any.whl", hash = "sha256:746db6f44db63b64a2c10b8cfbfcc64351464fb8ea22e1b9bbb9377f21bf8b7d"}, + {file = "google-cloud-datacatalog-3.16.0.tar.gz", hash = "sha256:703e414396248fa98474bbab9ea962f4c96a3caf1184c903bfc9453d274b0ea2"}, + {file = "google_cloud_datacatalog-3.16.0-py2.py3-none-any.whl", hash = "sha256:06f43501ce57742f394508bca6b0eb14e6dd5aa7e0d51cc0fd9d259295d46c9f"}, ] [package.dependencies] @@ -2461,13 +2708,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-dataflow-client" -version = "0.8.4" +version = "0.8.5" description = "Google Cloud Dataflow Client API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-dataflow-client-0.8.4.tar.gz", hash = "sha256:638a7a97cefa0f1f1918eb1403e2c34f9efe748d71787f7d668fd15993b92400"}, - {file = "google_cloud_dataflow_client-0.8.4-py2.py3-none-any.whl", hash = "sha256:80f95f8ba02cc1515c2856fc1d2959504b2e119622644499da1d4faa96161714"}, + {file = "google-cloud-dataflow-client-0.8.5.tar.gz", hash = "sha256:076a8218df39a0ab2d0d46bba1c696a35c62af70ed19360f1e83d0b41ec558c4"}, + {file = "google_cloud_dataflow_client-0.8.5-py2.py3-none-any.whl", hash = "sha256:39b22249b4ce3b00c1960424a0e1e9d5f78452e0d634242eceb5809f4e21773e"}, ] [package.dependencies] @@ -2477,13 +2724,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-dataform" -version = "0.5.2" +version = "0.5.3" description = "Google Cloud Dataform API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-dataform-0.5.2.tar.gz", hash = "sha256:baceb314b2e3da37cef55540fdc60f9cba2f55a3ec2e312f2f9f17aa8e0adbb8"}, - {file = "google_cloud_dataform-0.5.2-py2.py3-none-any.whl", hash = "sha256:6a41801f48ef578be23fb0f89038e6328d3c3a27b65e1bf0175146696d16d368"}, + {file = "google-cloud-dataform-0.5.3.tar.gz", hash = "sha256:89ed0dce20ce34f74cb038d614dd71191451fb70ea60888b6dbfc4265cea7a48"}, + {file = "google_cloud_dataform-0.5.3-py2.py3-none-any.whl", hash = "sha256:aa265043272b0b925fe5e40ea928a4793e1e30f37fff4169a38dfde9d7e32dc9"}, ] [package.dependencies] @@ -2494,13 +2741,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-dataplex" -version = "1.6.2" +version = "1.7.0" description = "Google Cloud Dataplex API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-dataplex-1.6.2.tar.gz", hash = "sha256:1e39ce05c33b0905139f768123eb7216de88f909eb59d3b7a2036c811009ca34"}, - {file = "google_cloud_dataplex-1.6.2-py2.py3-none-any.whl", hash = "sha256:8e5ac11741bdfabc48aa6eff30f2809ae011add803da5f761ada48a042f4677b"}, + {file = "google-cloud-dataplex-1.7.0.tar.gz", hash = "sha256:4de1bb230f201974ae98bc4be2b814cf741aee3069b05c88902082c06b449f1f"}, + {file = "google_cloud_dataplex-1.7.0-py2.py3-none-any.whl", hash = "sha256:95f015b78f557e52f4723539a62fd5e8018c16abfef662e8fb0a1d9b2673f3b5"}, ] [package.dependencies] @@ -2511,30 +2758,30 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-dataproc" -version = "5.4.1" +version = "5.8.0" description = "Google Cloud Dataproc API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-dataproc-5.4.1.tar.gz", hash = "sha256:1896e14f63c121a3f1e2c221287cc7fd00650d2a73f8b38f82040ae6d5aab7bf"}, - {file = "google_cloud_dataproc-5.4.1-py2.py3-none-any.whl", hash = "sha256:dfc6db122b38330779882652b10aa85ace45547433ca4af020c4c262660a4074"}, + {file = "google-cloud-dataproc-5.8.0.tar.gz", hash = "sha256:b03412dd63cb84dc0bb0844cd9e9a9eef40e1d0d719649659052cccf0d3e95d7"}, + {file = "google_cloud_dataproc-5.8.0-py2.py3-none-any.whl", hash = "sha256:1b3dd086d8ee7d1055b93230338a93091e77aca167cf7e32edc0b92e8288667d"}, ] [package.dependencies] google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.0,<2.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" [[package]] name = "google-cloud-dataproc-metastore" -version = "1.12.0" +version = "1.13.0" description = "Google Cloud Dataproc Metastore API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-dataproc-metastore-1.12.0.tar.gz", hash = "sha256:6d9f3fc1af822ddfa8c5471eae663cc6bdf0423fa0ca6454f66c5f04c1ce8e5f"}, - {file = "google_cloud_dataproc_metastore-1.12.0-py2.py3-none-any.whl", hash = "sha256:092d2ea6d7f3feac044980655553f3509c285f7cd4475cd71b2f0fbbbca2a634"}, + {file = "google-cloud-dataproc-metastore-1.13.0.tar.gz", hash = "sha256:58066b89d782bcf6985afb29822fb2a1d9a67c20210c87e3a990f69e6354e52c"}, + {file = "google_cloud_dataproc_metastore-1.13.0-py2.py3-none-any.whl", hash = "sha256:76e462a42537077ba4f9b1c4c8ec5d91d4fc4bac6d3f31a81446f50d39ef850f"}, ] [package.dependencies] @@ -2545,13 +2792,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-dlp" -version = "3.12.2" +version = "3.12.3" description = "Google Cloud Dlp API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-dlp-3.12.2.tar.gz", hash = "sha256:f806f55c3e399b73ea4342c704845521de7001127d28e8c294493d0b67363416"}, - {file = "google_cloud_dlp-3.12.2-py2.py3-none-any.whl", hash = "sha256:8985ed451dcb6113dd945a7a830ed87ba5798f45ec29928b0940dae64eb8e306"}, + {file = "google-cloud-dlp-3.12.3.tar.gz", hash = "sha256:73880f2a8bfa60049576fb94d85698aa2367d32ac901b76278fe50b75663440b"}, + {file = "google_cloud_dlp-3.12.3-py2.py3-none-any.whl", hash = "sha256:db263305466d0fb22b756043c8a7e1cc2842e3ed6b59fb800b9e9af63a8b0ec8"}, ] [package.dependencies] @@ -2561,13 +2808,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-kms" -version = "2.19.1" +version = "2.19.2" description = "Google Cloud Kms API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-kms-2.19.1.tar.gz", hash = "sha256:89add70a92d45c9f7700610774368e89d4046a05243150276f65182be92dcca7"}, - {file = "google_cloud_kms-2.19.1-py2.py3-none-any.whl", hash = "sha256:1275f2e7f08ee1106e094ec39f721af383814d94a8d123cf84bc0e9e0129562e"}, + {file = "google-cloud-kms-2.19.2.tar.gz", hash = "sha256:17a5034592e85ef0031d25bbe5894bdb2d719460855980bfeb68aa4e8ffc12bd"}, + {file = "google_cloud_kms-2.19.2-py2.py3-none-any.whl", hash = "sha256:0cc0b9d16338a46b7fc5beba7e96a88df0f836586eb8650e9acd36eb249b52d9"}, ] [package.dependencies] @@ -2578,13 +2825,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-language" -version = "2.11.0" +version = "2.11.1" description = "Google Cloud Language API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-language-2.11.0.tar.gz", hash = "sha256:95d235f503d904e8854117e928ef36ac930c24825fcb8400c3f368a908fdbe14"}, - {file = "google_cloud_language-2.11.0-py2.py3-none-any.whl", hash = "sha256:cdcc83dac47c5268140429af584844f3a913301f4195883b134d2690cde69308"}, + {file = "google-cloud-language-2.11.1.tar.gz", hash = "sha256:5f184409f040c0c73057c2616e6bd2e86e45aeb646180d19c189df4aa3d02dba"}, + {file = "google_cloud_language-2.11.1-py2.py3-none-any.whl", hash = "sha256:beb5dd1344a6ed00dd04b1eb05a967e7f83fc1b51471f9bd51f238f63f46f9d4"}, ] [package.dependencies] @@ -2594,13 +2841,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-logging" -version = "3.6.0" +version = "3.8.0" description = "Stackdriver Logging API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-logging-3.6.0.tar.gz", hash = "sha256:42134223956850ddd64877c88042d31f78658e7b067a5a8e3dd28236b71f3c32"}, - {file = "google_cloud_logging-3.6.0-py2.py3-none-any.whl", hash = "sha256:6beb843cb88a9bc2f6df94ce69048243ebb360ee06979f5311ea7a0ec09bd097"}, + {file = "google-cloud-logging-3.8.0.tar.gz", hash = "sha256:fdd916e59a84aa8c02e8148d7fdd3b3b623c57b0c1ff71f43297ce8e50fc1eab"}, + {file = "google_cloud_logging-3.8.0-py2.py3-none-any.whl", hash = "sha256:c868b276b021cf5f32b6e8356b6cb3666357d149ad0fd798076043a5ec7ed988"}, ] [package.dependencies] @@ -2614,13 +2861,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-memcache" -version = "1.7.2" +version = "1.7.3" description = "Google Cloud Memcache API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-memcache-1.7.2.tar.gz", hash = "sha256:977fd8a9b2dc042dd91acd083c91793abede48d6cfea79391bdc0d68077269bc"}, - {file = "google_cloud_memcache-1.7.2-py2.py3-none-any.whl", hash = "sha256:5e60504c1d04ca84dab6cb98ff20225ce62ace09b4264a3c1c6f61ac114a682f"}, + {file = "google-cloud-memcache-1.7.3.tar.gz", hash = "sha256:a73f44ec5bfc398b4c9d94d5e77621c54795bcade19960242dec2cd91b854bcb"}, + {file = "google_cloud_memcache-1.7.3-py2.py3-none-any.whl", hash = "sha256:054e2adde4e99fca6a2e3f9ef733a2159083923c0a41af51b7d5e9d38ca9de12"}, ] [package.dependencies] @@ -2630,13 +2877,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-monitoring" -version = "2.15.1" +version = "2.16.0" description = "Stackdriver Monitoring API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-monitoring-2.15.1.tar.gz", hash = "sha256:086a845a34a6e105ab8a3a4809392ea6367a65b28b7561c26101534a8705ed37"}, - {file = "google_cloud_monitoring-2.15.1-py2.py3-none-any.whl", hash = "sha256:4394e5e031f30d622a24739678ec48a45400ead94af9a6032cbff7f66194dc12"}, + {file = "google-cloud-monitoring-2.16.0.tar.gz", hash = "sha256:3d1851009312ada5e8abf20ff761af8474b753060ab6e0b7d6ec47bc11f2b136"}, + {file = "google_cloud_monitoring-2.16.0-py2.py3-none-any.whl", hash = "sha256:5e7a7161ca48b534e4f9b62f2e210364f7a1cde1ac21503089a0daedfa079441"}, ] [package.dependencies] @@ -2649,13 +2896,13 @@ pandas = ["pandas (>=0.17.1)"] [[package]] name = "google-cloud-orchestration-airflow" -version = "1.9.1" +version = "1.9.2" description = "Google Cloud Orchestration Airflow API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-orchestration-airflow-1.9.1.tar.gz", hash = "sha256:f819cbbff173100c2e452699f2c4952c78949a899274a80f8bd78ed1a9ab9e34"}, - {file = "google_cloud_orchestration_airflow-1.9.1-py2.py3-none-any.whl", hash = "sha256:939bd8b10c0bf45ab097f5d0648971f7a2e10ecf5bbdfc7d748ba21233777afb"}, + {file = "google-cloud-orchestration-airflow-1.9.2.tar.gz", hash = "sha256:78c7cb164259c8bac9dd99ae9af9d2b4af933d3fbcd30895441479a36c5513b2"}, + {file = "google_cloud_orchestration_airflow-1.9.2-py2.py3-none-any.whl", hash = "sha256:fb1801bd11f63c94614c0f9f7a9e1ec846ffabd487a3fa4b7ee62ff784b46d29"}, ] [package.dependencies] @@ -2665,13 +2912,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-os-login" -version = "2.10.0" +version = "2.11.0" description = "Google Cloud Os Login API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-os-login-2.10.0.tar.gz", hash = "sha256:2b9917802583c8179133213b2d36485a0e275f655cfff001241bb2c2e66398df"}, - {file = "google_cloud_os_login-2.10.0-py2.py3-none-any.whl", hash = "sha256:5176ddea571463078ea819c664774c7bb4451243459639d300ac1d6615779160"}, + {file = "google-cloud-os-login-2.11.0.tar.gz", hash = "sha256:e3219d00b75ea44182871681985e9db3f1e38641bb84519dd85d3dbb62b97656"}, + {file = "google_cloud_os_login-2.11.0-py2.py3-none-any.whl", hash = "sha256:1b0679d772fbef486230208a65b3a96d513b599000beca1dc8ff5bde4838607f"}, ] [package.dependencies] @@ -2681,13 +2928,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-pubsub" -version = "2.18.2" +version = "2.18.4" description = "Google Cloud Pub/Sub API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-pubsub-2.18.2.tar.gz", hash = "sha256:5b9d14249a29c0e5bc6b98c8d7c166644cc1ada830c40f009f2bcb5882f5b105"}, - {file = "google_cloud_pubsub-2.18.2-py2.py3-none-any.whl", hash = "sha256:62976041c320cb051af86d41ec027308044a554402fb0871eba462b331d275cf"}, + {file = "google-cloud-pubsub-2.18.4.tar.gz", hash = "sha256:32eb61fd4c1dc6c842f594d69d9afa80544e3b327aa640a164eb6fb0201eaf2d"}, + {file = "google_cloud_pubsub-2.18.4-py2.py3-none-any.whl", hash = "sha256:f32144ad9ed32331a80a2f8379a3ca7526bbc01e7bd76de2e8ab52e492d21f50"}, ] [package.dependencies] @@ -2703,13 +2950,13 @@ libcst = ["libcst (>=0.3.10)"] [[package]] name = "google-cloud-redis" -version = "2.13.1" +version = "2.13.2" description = "Google Cloud Redis API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-redis-2.13.1.tar.gz", hash = "sha256:52d4f5cf9ccccdcefe5e1a9cc79bbbec84bc182f0a68d3a962cb59f0196b1467"}, - {file = "google_cloud_redis-2.13.1-py2.py3-none-any.whl", hash = "sha256:4be94499fba167e5bcc6f1a9f284c72c5efc87ed839fddade3d5f4eaac29b1c9"}, + {file = "google-cloud-redis-2.13.2.tar.gz", hash = "sha256:5c485730355d96723d64ae637f1b2264f35b57c301ec0ef2c6d30b2f06dca14e"}, + {file = "google_cloud_redis-2.13.2-py2.py3-none-any.whl", hash = "sha256:86378e8ed1c5a1c621eb2731d734436f443dffdbbafc6cd5d24511c94d6c38bc"}, ] [package.dependencies] @@ -2719,13 +2966,30 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-resource-manager" -version = "1.10.3" +version = "1.10.4" description = "Google Cloud Resource Manager API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-resource-manager-1.10.3.tar.gz", hash = "sha256:f80efcea36f10c5a81889afe93910926e3978b4b1ceeb82f563a2fc863072d14"}, - {file = "google_cloud_resource_manager-1.10.3-py2.py3-none-any.whl", hash = "sha256:1381a4b0f522248ebe0ebd1289d8822b99c54f4e1fe03924a6e723b2ed93dd7f"}, + {file = "google-cloud-resource-manager-1.10.4.tar.gz", hash = "sha256:456b25ddda3d4cd27488a72736bbc3af04d713ae2fe3655c01b66a339d28d679"}, + {file = "google_cloud_resource_manager-1.10.4-py2.py3-none-any.whl", hash = "sha256:2ba56ba8e5280cd425bd63620da48b78da2cd299ece58a71f0f2ce3a32d56f99"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-cloud-run" +version = "0.10.0" +description = "Google Cloud Run API client library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-cloud-run-0.10.0.tar.gz", hash = "sha256:e597dff8da3d6e0f43bdaaa38c80933d8e81e8eac8c1b5e119812af99539d734"}, + {file = "google_cloud_run-0.10.0-py2.py3-none-any.whl", hash = "sha256:3f3d317200e890c20e744e692d69b241ca4a25ec161f02babbc77c1df68c7a4d"}, ] [package.dependencies] @@ -2736,13 +3000,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-secret-manager" -version = "2.16.3" +version = "2.16.4" description = "Google Cloud Secret Manager API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-secret-manager-2.16.3.tar.gz", hash = "sha256:6cab5cbf1927a34c586e4af90437eea3d44ff4b41b9a82ec86fcff09a5ac26ea"}, - {file = "google_cloud_secret_manager-2.16.3-py2.py3-none-any.whl", hash = "sha256:266ab8da831b3532ca197b5a30dcde0f0504761390bb26c3397403d6ff0b8e3f"}, + {file = "google-cloud-secret-manager-2.16.4.tar.gz", hash = "sha256:371dc72f9145af323e8a813c8e50380e6ac4bd6a5dbcd42dcf3162d8f37e5080"}, + {file = "google_cloud_secret_manager-2.16.4-py2.py3-none-any.whl", hash = "sha256:5031c45dd84dc584d91ee0baae2bbd5df6710efe0c42719ee370a3ab62aaf618"}, ] [package.dependencies] @@ -2776,13 +3040,13 @@ tracing = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20 [[package]] name = "google-cloud-speech" -version = "2.21.0" +version = "2.21.1" description = "Google Cloud Speech API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-speech-2.21.0.tar.gz", hash = "sha256:661c39bbb6f2b216ba56ace3b087260e9778dd19ade9efa3700adee9258009ad"}, - {file = "google_cloud_speech-2.21.0-py2.py3-none-any.whl", hash = "sha256:88e51aa35d385d7b8325c461327c5f4a19ac8ab38d92ffb0d61c4e91494a0171"}, + {file = "google-cloud-speech-2.21.1.tar.gz", hash = "sha256:4935375eaaf18656e53e2631770b9d579e80cb4ec1b3d46dd23346f789aa016a"}, + {file = "google_cloud_speech-2.21.1-py2.py3-none-any.whl", hash = "sha256:36089039640c5ab79cefd32af7a482043a67144d393ec752c6b57c1fdc02a95d"}, ] [package.dependencies] @@ -2792,20 +3056,21 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-storage" -version = "2.8.0" +version = "2.13.0" description = "Google Cloud Storage API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-storage-2.8.0.tar.gz", hash = "sha256:4388da1ff5bda6d729f26dbcaf1bfa020a2a52a7b91f0a8123edbda51660802c"}, - {file = "google_cloud_storage-2.8.0-py2.py3-none-any.whl", hash = "sha256:248e210c13bc109909160248af546a91cb2dabaf3d7ebbf04def9dd49f02dbb6"}, + {file = "google-cloud-storage-2.13.0.tar.gz", hash = "sha256:f62dc4c7b6cd4360d072e3deb28035fbdad491ac3d9b0b1815a12daea10f37c7"}, + {file = "google_cloud_storage-2.13.0-py2.py3-none-any.whl", hash = "sha256:ab0bf2e1780a1b74cf17fccb13788070b729f50c252f0c94ada2aae0ca95437d"}, ] [package.dependencies] google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev" -google-auth = ">=1.25.0,<3.0dev" +google-auth = ">=2.23.3,<3.0dev" google-cloud-core = ">=2.3.0,<3.0dev" -google-resumable-media = ">=2.3.2" +google-crc32c = ">=1.0,<2.0dev" +google-resumable-media = ">=2.6.0" requests = ">=2.18.0,<3.0.0dev" [package.extras] @@ -2813,13 +3078,13 @@ protobuf = ["protobuf (<5.0.0dev)"] [[package]] name = "google-cloud-storage-transfer" -version = "1.9.1" +version = "1.9.2" description = "Google Cloud Storage Transfer API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-storage-transfer-1.9.1.tar.gz", hash = "sha256:5d008d1b7c82e2d2dff45383da67098d6e50a7c8dcd0983c052890f02fe6ec06"}, - {file = "google_cloud_storage_transfer-1.9.1-py2.py3-none-any.whl", hash = "sha256:18be8f4bb99cf46caa19a0440589ec94810b69df9a9d1c24e6e8b9631dfdc00c"}, + {file = "google-cloud-storage-transfer-1.9.2.tar.gz", hash = "sha256:c36800cf425e23cca5bed51320dce6eec313b68db8dd4677be6e3b49c891207d"}, + {file = "google_cloud_storage_transfer-1.9.2-py2.py3-none-any.whl", hash = "sha256:d30b519b57eee0d337da6d9051442337625128e950e6b487b4fd63f4942f7cb7"}, ] [package.dependencies] @@ -2829,13 +3094,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-tasks" -version = "2.14.1" +version = "2.14.2" description = "Google Cloud Tasks API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-tasks-2.14.1.tar.gz", hash = "sha256:ca1a83df7391a78592dcca751583b22c9074d0a72dc8debdb4a4687ff9958a29"}, - {file = "google_cloud_tasks-2.14.1-py2.py3-none-any.whl", hash = "sha256:b44ff8721f9a36f118892c5d45745393fba0ce0ef27fab3853e07cb5fba91a92"}, + {file = "google-cloud-tasks-2.14.2.tar.gz", hash = "sha256:3efb280e7a635f57860a06a346131c117042e820ad483afd256800fae1b4d701"}, + {file = "google_cloud_tasks-2.14.2-py2.py3-none-any.whl", hash = "sha256:801a671c6dbd2269179037e93490f87e2df59ddfcb59551128bab27e7dd09f94"}, ] [package.dependencies] @@ -2846,13 +3111,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-texttospeech" -version = "2.14.1" +version = "2.14.2" description = "Google Cloud Texttospeech API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-texttospeech-2.14.1.tar.gz", hash = "sha256:dd716f2a768ad67502cfd99b9925c51ffd6e16be93b410abeeffdaac190bfe81"}, - {file = "google_cloud_texttospeech-2.14.1-py2.py3-none-any.whl", hash = "sha256:883fe35e3c823ff77cc633b30ab9a93d3b5eb38ebce7eaeef6f87e8d03210e54"}, + {file = "google-cloud-texttospeech-2.14.2.tar.gz", hash = "sha256:a23738366988faf4d265200f57c5de4312efa3d14bb434b92a6e541713f5d906"}, + {file = "google_cloud_texttospeech-2.14.2-py2.py3-none-any.whl", hash = "sha256:3a4e7ca71a1d3f90de77170a013b37f18775858dac01c80793752b8c160d6555"}, ] [package.dependencies] @@ -2862,30 +3127,30 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-translate" -version = "3.12.0" +version = "3.12.1" description = "Google Cloud Translate API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-translate-3.12.0.tar.gz", hash = "sha256:97423c1c3bf614102f1d4278175a03c523e5b4acd648b00a3407d02302aaccd9"}, - {file = "google_cloud_translate-3.12.0-py2.py3-none-any.whl", hash = "sha256:351405a07a122280d8ae5d52797a48dcfae769e29c5ebdea2a5dedacb48d41ff"}, + {file = "google-cloud-translate-3.12.1.tar.gz", hash = "sha256:661cb8879aa3c63a2f725a3ea68f90199bd354c95ca169cc2e83a5105987d29e"}, + {file = "google_cloud_translate-3.12.1-py2.py3-none-any.whl", hash = "sha256:2a0f6aa398a64d7836d0f2880dfd023be0de05f8b688ac537825391014fc114a"}, ] [package.dependencies] google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-cloud-core = ">=1.3.0,<3.0.0dev" +google-cloud-core = ">=1.4.4,<3.0.0dev" proto-plus = ">=1.22.0,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" [[package]] name = "google-cloud-videointelligence" -version = "2.11.3" +version = "2.11.4" description = "Google Cloud Videointelligence API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-videointelligence-2.11.3.tar.gz", hash = "sha256:a96a63f004c27068f45b227a66275f8a6a8c3ecd06bb581f92fa69897d5b1797"}, - {file = "google_cloud_videointelligence-2.11.3-py2.py3-none-any.whl", hash = "sha256:087867df1ec970abaff412a2c564f3b5b7418d7a9cb8699838a03728434843e1"}, + {file = "google-cloud-videointelligence-2.11.4.tar.gz", hash = "sha256:07ace299a63f5b3d4441375634853b55ce8f90c62c6a24f8a47eb054149f6f99"}, + {file = "google_cloud_videointelligence-2.11.4-py2.py3-none-any.whl", hash = "sha256:4d62f7b074f6f1eae4efd8697b5a93fb59b3b22f9934e383b4f6fbed69f49eb6"}, ] [package.dependencies] @@ -2895,13 +3160,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-vision" -version = "3.4.4" +version = "3.4.5" description = "Google Cloud Vision API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-vision-3.4.4.tar.gz", hash = "sha256:405744ae50852034cc47b32a9b1bae50d3fb09cd1e2160014182891ef5766695"}, - {file = "google_cloud_vision-3.4.4-py2.py3-none-any.whl", hash = "sha256:49617c2b31544095151a051839a32a8864e5e12db3169f5c63b2b23500f91665"}, + {file = "google-cloud-vision-3.4.5.tar.gz", hash = "sha256:0df8241ab277199b919ca3837a7de85059363fea0e3d660060870be7ceffc047"}, + {file = "google_cloud_vision-3.4.5-py2.py3-none-any.whl", hash = "sha256:4e67f5985ecbb8f7252fe47b8e26f1ac083af4c45626bae23869cf097ba9292e"}, ] [package.dependencies] @@ -2911,13 +3176,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-workflows" -version = "1.11.0" +version = "1.12.1" description = "Google Cloud Workflows API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-workflows-1.11.0.tar.gz", hash = "sha256:5107561b7fe174d77cdd7a5c5c4af82378443bf55a10d058df8d94251c613fb1"}, - {file = "google_cloud_workflows-1.11.0-py2.py3-none-any.whl", hash = "sha256:cb4413e47cc7953f065d48a4cebf6e05a4776e46dc3629b5149d300df835657a"}, + {file = "google-cloud-workflows-1.12.1.tar.gz", hash = "sha256:fad66cece6279f7be4fd919c1cc50f2a4a7ebf8bba97feaba75b9addece0b64b"}, + {file = "google_cloud_workflows-1.12.1-py2.py3-none-any.whl", hash = "sha256:1c24dc2b7eb4d953677407a0826e2680fc03fe6dc81b75a15d38d5a452aa467f"}, ] [package.dependencies] @@ -3061,43 +3326,151 @@ files = [ {file = "google_re2-1.1-1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c6c9f64b9724ec38da8e514f404ac64e9a6a5e8b1d7031c2dadd05c1f4c16fd"}, {file = "google_re2-1.1-1-cp39-cp39-win32.whl", hash = "sha256:d1b751b9ab9f8e2ab2a36d72b909281ce65f328c9115a1685acae1a2d1afd7a4"}, {file = "google_re2-1.1-1-cp39-cp39-win_amd64.whl", hash = "sha256:ac775c75cec7069351d201da4e0fb0cae4c1c5ebecd08fa34e1be89740c1d80b"}, + {file = "google_re2-1.1-2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5eaefe4705b75ca5f78178a50104b689e9282f868e12f119b26b4cffc0c7ee6e"}, + {file = "google_re2-1.1-2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:e35f2c8aabfaaa4ce6420b3cae86c0c29042b1b4f9937254347e9b985694a171"}, + {file = "google_re2-1.1-2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:35fd189cbaaaa39c9a6a8a00164c8d9c709bacd0c231c694936879609beff516"}, + {file = "google_re2-1.1-2-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:60475d222cebd066c80414831c8a42aa2449aab252084102ee05440896586e6a"}, + {file = "google_re2-1.1-2-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:871cb85b9b0e1784c983b5c148156b3c5314cb29ca70432dff0d163c5c08d7e5"}, + {file = "google_re2-1.1-2-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:94f4e66e34bdb8de91ec6cdf20ba4fa9fea1dfdcfb77ff1f59700d01a0243664"}, + {file = "google_re2-1.1-2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1563577e2b720d267c4cffacc0f6a2b5c8480ea966ebdb1844fbea6602c7496f"}, + {file = "google_re2-1.1-2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:49b7964532a801b96062d78c0222d155873968f823a546a3dbe63d73f25bb56f"}, + {file = "google_re2-1.1-2-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2362fd70eb639a75fd0187d28b4ba7b20b3088833d8ad7ffd8693d0ba159e1c2"}, + {file = "google_re2-1.1-2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:86b80719636a4e21391e20a9adf18173ee6ae2ec956726fe2ff587417b5e8ba6"}, + {file = "google_re2-1.1-2-cp310-cp310-win32.whl", hash = "sha256:5456fba09df951fe8d1714474ed1ecda102a68ddffab0113e6c117d2e64e6f2b"}, + {file = "google_re2-1.1-2-cp310-cp310-win_amd64.whl", hash = "sha256:2ac6936a3a60d8d9de9563e90227b3aea27068f597274ca192c999a12d8baa8f"}, + {file = "google_re2-1.1-2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5a87b436028ec9b0f02fe19d4cbc19ef30441085cdfcdf1cce8fbe5c4bd5e9a"}, + {file = "google_re2-1.1-2-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:fc0d4163de9ed2155a77e7a2d59d94c348a6bbab3cff88922fab9e0d3d24faec"}, + {file = "google_re2-1.1-2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:48b12d953bc796736e7831d67b36892fb6419a4cc44cb16521fe291e594bfe23"}, + {file = "google_re2-1.1-2-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:62c780c927cff98c1538439f0ff616f48a9b2e8837c676f53170d8ae5b9e83cb"}, + {file = "google_re2-1.1-2-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:04b2aefd768aa4edeef8b273327806c9cb0b82e90ff52eacf5d11003ac7a0db2"}, + {file = "google_re2-1.1-2-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:9c90175992346519ee7546d9af9a64541c05b6b70346b0ddc54a48aa0d3b6554"}, + {file = "google_re2-1.1-2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22ad9ad9d125249d6386a2e80efb9de7af8260b703b6be7fa0ab069c1cf56ced"}, + {file = "google_re2-1.1-2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f70971f6ffe5254e476e71d449089917f50ebf9cf60f9cec80975ab1693777e2"}, + {file = "google_re2-1.1-2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f267499529e64a4abed24c588f355ebe4700189d434d84a7367725f5a186e48d"}, + {file = "google_re2-1.1-2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b632eff5e4cd44545a9c0e52f2e1becd55831e25f4dd4e0d7ec8ee6ca50858c1"}, + {file = "google_re2-1.1-2-cp311-cp311-win32.whl", hash = "sha256:a42c733036e8f242ee4e5f0e27153ad4ca44ced9e4ce82f3972938ddee528db0"}, + {file = "google_re2-1.1-2-cp311-cp311-win_amd64.whl", hash = "sha256:64f8eed4ca96905d99b5286b3d14b5ca4f6a025ff3c1351626a7df2f93ad1ddd"}, + {file = "google_re2-1.1-2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5541efcca5b5faf7e0d882334a04fa479bad4e7433f94870f46272eec0672c4a"}, + {file = "google_re2-1.1-2-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:92309af35b6eb2d3b3dc57045cdd83a76370958ab3e0edd2cc4638f6d23f5b32"}, + {file = "google_re2-1.1-2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:197cd9bcaba96d18c5bf84d0c32fca7a26c234ea83b1d3083366f4392cb99f78"}, + {file = "google_re2-1.1-2-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:1b896f171d29b541256cf26e10dccc9103ac1894683914ed88828ca6facf8dca"}, + {file = "google_re2-1.1-2-cp38-cp38-macosx_13_0_arm64.whl", hash = "sha256:e022d3239b945014e916ca7120fee659b246ec26c301f9e0542f1a19b38a8744"}, + {file = "google_re2-1.1-2-cp38-cp38-macosx_13_0_x86_64.whl", hash = "sha256:2c73f8a9440873b68bee1198094377501065e85aaf6fcc0d2512c7589ffa06ca"}, + {file = "google_re2-1.1-2-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:901d86555bd7725506d651afaba7d71cd4abd13260aed6cfd7c641a45f76d4f6"}, + {file = "google_re2-1.1-2-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ce4710ff636701cfb56eb91c19b775d53b03749a23b7d2a5071bbbf4342a9067"}, + {file = "google_re2-1.1-2-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:76a20e5ebdf5bc5d430530197e42a2eeb562f729d3a3fb51f39168283d676e66"}, + {file = "google_re2-1.1-2-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:77c9f4d4bb1c8de9d2642d3c4b8b615858ba764df025b3b4f1310266f8def269"}, + {file = "google_re2-1.1-2-cp38-cp38-win32.whl", hash = "sha256:94bd60785bf37ef130a1613738e3c39465a67eae3f3be44bb918540d39b68da3"}, + {file = "google_re2-1.1-2-cp38-cp38-win_amd64.whl", hash = "sha256:59efeb77c0dcdbe37794c61f29c5b1f34bc06e8ec309a111ccdd29d380644d70"}, + {file = "google_re2-1.1-2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:221e38c27e1dd9ccb8e911e9c7aed6439f68ce81e7bb74001076830b0d6e931d"}, + {file = "google_re2-1.1-2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:d9145879e6c2e1b814445300b31f88a675e1f06c57564670d95a1442e8370c27"}, + {file = "google_re2-1.1-2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:c8a12f0740e2a52826bdbf95569a4b0abdf413b4012fa71e94ad25dd4715c6e5"}, + {file = "google_re2-1.1-2-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:9c9998f71466f4db7bda752aa7c348b2881ff688e361108fe500caad1d8b9cb2"}, + {file = "google_re2-1.1-2-cp39-cp39-macosx_13_0_arm64.whl", hash = "sha256:0c39f69b702005963a3d3bf78743e1733ad73efd7e6e8465d76e3009e4694ceb"}, + {file = "google_re2-1.1-2-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:6d0ce762dee8d6617d0b1788a9653e805e83a23046c441d0ea65f1e27bf84114"}, + {file = "google_re2-1.1-2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ecf3619d98c9b4a7844ab52552ad32597cdbc9a5bdbc7e3435391c653600d1e2"}, + {file = "google_re2-1.1-2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9a1426a8cbd1fa004974574708d496005bd379310c4b1c7012be4bc75efde7a8"}, + {file = "google_re2-1.1-2-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1a30626ba48b4070f3eab272d860ef1952e710b088792c4d68dddb155be6bfc"}, + {file = "google_re2-1.1-2-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1b9c1ffcfbc3095b6ff601ec2d2bf662988f6ea6763bc1c9d52bec55881f8fde"}, + {file = "google_re2-1.1-2-cp39-cp39-win32.whl", hash = "sha256:32ecf995a252c0548404c1065ba4b36f1e524f1f4a86b6367a1a6c3da3801e30"}, + {file = "google_re2-1.1-2-cp39-cp39-win_amd64.whl", hash = "sha256:e7865410f3b112a3609739283ec3f4f6f25aae827ff59c6bfdf806fd394d753e"}, + {file = "google_re2-1.1-3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3b21f83f0a201009c56f06fcc7294a33555ede97130e8a91b3f4cae01aed1d73"}, + {file = "google_re2-1.1-3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b38194b91354a38db1f86f25d09cdc6ac85d63aee4c67b43da3048ce637adf45"}, + {file = "google_re2-1.1-3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e7da3da8d6b5a18d6c3b61b11cc5b66b8564eaedce99d2312b15b6487730fc76"}, + {file = "google_re2-1.1-3-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:aeca656fb10d8638f245331aabab59c9e7e051ca974b366dd79e6a9efb12e401"}, + {file = "google_re2-1.1-3-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:2069d6dc94f5fa14a159bf99cad2f11e9c0f8ec3b7f44a4dde9e59afe5d1c786"}, + {file = "google_re2-1.1-3-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:2319a39305a4931cb5251451f2582713418a19bef2af7adf9e2a7a0edd939b99"}, + {file = "google_re2-1.1-3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb98fc131699756c6d86246f670a5e1c1cc1ba85413c425ad344cb30479b246c"}, + {file = "google_re2-1.1-3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6e038986d8ffe4e269f8532f03009f229d1f6018d4ac0dabc8aff876338f6e0"}, + {file = "google_re2-1.1-3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8618343ee658310e0f53bf586fab7409de43ce82bf8d9f7eb119536adc9783fd"}, + {file = "google_re2-1.1-3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d8140ca861cfe00602319cefe2c7b8737b379eb07fb328b51dc44584f47a2718"}, + {file = "google_re2-1.1-3-cp310-cp310-win32.whl", hash = "sha256:41f439c5c54e8a3a0a1fa2dbd1e809d3f643f862df7b16dd790f36a1238a272e"}, + {file = "google_re2-1.1-3-cp310-cp310-win_amd64.whl", hash = "sha256:fe20e97a33176d96d3e4b5b401de35182b9505823abea51425ec011f53ef5e56"}, + {file = "google_re2-1.1-3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c39ff52b1765db039f690ee5b7b23919d8535aae94db7996079fbde0098c4d7"}, + {file = "google_re2-1.1-3-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5420be674fd164041639ba4c825450f3d4bd635572acdde16b3dcd697f8aa3ef"}, + {file = "google_re2-1.1-3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:ff53881cf1ce040f102a42d39db93c3f835f522337ae9c79839a842f26d97733"}, + {file = "google_re2-1.1-3-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:8d04600b0b53523118df2e413a71417c408f20dee640bf07dfab601c96a18a77"}, + {file = "google_re2-1.1-3-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:c4835d4849faa34a7fa1074098d81c420ed6c0707a3772482b02ce14f2a7c007"}, + {file = "google_re2-1.1-3-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:3309a9b81251d35fee15974d0ae0581a9a375266deeafdc3a3ac0d172a742357"}, + {file = "google_re2-1.1-3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e2b51cafee7e0bc72d0a4a454547bd8f257cde412ac9f1a2dc46a203b5e42cf4"}, + {file = "google_re2-1.1-3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:83f5f1cb52f832c2297d271ee8c56cf5e9053448162e5d2223d513f729bad908"}, + {file = "google_re2-1.1-3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55865a1ace92be3f7953b2e2b38b901d8074a367aa491daee43260a53a7fc6f0"}, + {file = "google_re2-1.1-3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cec2167dd142e583e98c783bd0d28b8cf5a9cdbe1f7407ba4163fe3ccb613cb9"}, + {file = "google_re2-1.1-3-cp311-cp311-win32.whl", hash = "sha256:a0bc1fe96849e4eb8b726d0bba493f5b989372243b32fe20729cace02e5a214d"}, + {file = "google_re2-1.1-3-cp311-cp311-win_amd64.whl", hash = "sha256:e6310a156db96fc5957cb007dd2feb18476898654530683897469447df73a7cd"}, + {file = "google_re2-1.1-3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8e63cd10ea006088b320e8c5d308da1f6c87aa95138a71c60dd7ca1c8e91927e"}, + {file = "google_re2-1.1-3-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:12b566830a334178733a85e416b1e0507dbc0ceb322827616fe51ef56c5154f1"}, + {file = "google_re2-1.1-3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:442e18c9d46b225c1496919c16eafe8f8d9bb4091b00b4d3440da03c55bbf4ed"}, + {file = "google_re2-1.1-3-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:c54c00263a9c39b2dacd93e9636319af51e3cf885c080b9680a9631708326460"}, + {file = "google_re2-1.1-3-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:15a3caeeb327bc22e0c9f95eb76890fec8874cacccd2b01ff5c080ab4819bbec"}, + {file = "google_re2-1.1-3-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:59ec0d2cced77f715d41f6eafd901f6b15c11e28ba25fe0effdc1de554d78e75"}, + {file = "google_re2-1.1-3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:185bf0e3441aed3840590f8e42f916e2920d235eb14df2cbc2049526803d3e71"}, + {file = "google_re2-1.1-3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:586d3f2014eea5be14d8de53374d9b79fa99689160e00efa64b5fe93af326087"}, + {file = "google_re2-1.1-3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc2575082de4ffd234d9607f3ae67ca22b15a1a88793240e2045f3b3a36a5795"}, + {file = "google_re2-1.1-3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:59c5ad438eddb3630def394456091284d7bbc5b89351987f94f3792d296d1f96"}, + {file = "google_re2-1.1-3-cp312-cp312-win32.whl", hash = "sha256:5b9878c53f2bf16f75bf71d4ddd57f6611351408d5821040e91c53ebdf82c373"}, + {file = "google_re2-1.1-3-cp312-cp312-win_amd64.whl", hash = "sha256:4fdecfeb213110d0a85bad335a8e7cdb59fea7de81a4fe659233f487171980f9"}, + {file = "google_re2-1.1-3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2dd87bacab32b709c28d0145fe75a956b6a39e28f0726d867375dba5721c76c1"}, + {file = "google_re2-1.1-3-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:55d24c61fe35dddc1bb484593a57c9f60f9e66d7f31f091ef9608ed0b6dde79f"}, + {file = "google_re2-1.1-3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a0cf1180d908622df648c26b0cd09281f92129805ccc56a39227fdbfeab95cb4"}, + {file = "google_re2-1.1-3-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:09586f07f3f88d432265c75976da1c619ab7192cd7ebdf53f4ae0776c19e4b56"}, + {file = "google_re2-1.1-3-cp38-cp38-macosx_13_0_arm64.whl", hash = "sha256:539f1b053402203576e919a06749198da4ae415931ee28948a1898131ae932ce"}, + {file = "google_re2-1.1-3-cp38-cp38-macosx_13_0_x86_64.whl", hash = "sha256:abf0bcb5365b0e27a5a23f3da403dffdbbac2c0e3a3f1535a8b10cc121b5d5fb"}, + {file = "google_re2-1.1-3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:19c83e5bbed7958213eeac3aa71c506525ce54faf03e07d0b96cd0a764890511"}, + {file = "google_re2-1.1-3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3348e77330ff672dc44ec01894fa5d93c409a532b6d688feac55e714e9059920"}, + {file = "google_re2-1.1-3-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:06b63edb57c5ce5a13eabfd71155e346b9477dc8906dec7c580d4f70c16a7e0d"}, + {file = "google_re2-1.1-3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:12fe57ba2914092b83338d61d8def9ebd5a2bd0fd8679eceb5d4c2748105d5c0"}, + {file = "google_re2-1.1-3-cp38-cp38-win32.whl", hash = "sha256:80796e08d24e606e675019fe8de4eb5c94bb765be13c384f2695247d54a6df75"}, + {file = "google_re2-1.1-3-cp38-cp38-win_amd64.whl", hash = "sha256:3c2257dedfe7cc5deb6791e563af9e071a9d414dad89e37ac7ad22f91be171a9"}, + {file = "google_re2-1.1-3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:43a0cd77c87c894f28969ac622f94b2e6d1571261dfdd785026848a25cfdc9b9"}, + {file = "google_re2-1.1-3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:1038990b77fd66f279bd66a0832b67435ea925e15bb59eafc7b60fdec812b616"}, + {file = "google_re2-1.1-3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fb5dda6875d18dd45f0f24ebced6d1f7388867c8fb04a235d1deab7ea479ce38"}, + {file = "google_re2-1.1-3-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:bb1d164965c6d57a351b421d2f77c051403766a8b75aaa602324ee2451fff77f"}, + {file = "google_re2-1.1-3-cp39-cp39-macosx_13_0_arm64.whl", hash = "sha256:a072ebfa495051d07ffecbf6ce21eb84793568d5c3c678c00ed8ff6b8066ab31"}, + {file = "google_re2-1.1-3-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:4eb66c8398c8a510adc97978d944b3b29c91181237218841ea1a91dc39ec0e54"}, + {file = "google_re2-1.1-3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f7c8b57b1f559553248d1757b7fa5b2e0cc845666738d155dff1987c2618264e"}, + {file = "google_re2-1.1-3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9162f6aa4f25453c682eb176f21b8e2f40205be9f667e98a54b3e1ff10d6ee75"}, + {file = "google_re2-1.1-3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2d65ddf67fd7bf94705626871d463057d3d9a3538d41022f95b9d8f01df36e1"}, + {file = "google_re2-1.1-3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d140c7b9395b4d1e654127aa1c99bcc603ed01000b7bc7e28c52562f1894ec12"}, + {file = "google_re2-1.1-3-cp39-cp39-win32.whl", hash = "sha256:80c5fc200f64b2d903eeb07b8d6cefc620a872a0240c7caaa9aca05b20f5568f"}, + {file = "google_re2-1.1-3-cp39-cp39-win_amd64.whl", hash = "sha256:9eb6dbcee9b5dc4069bbc0634f2eb039ca524a14bed5868fdf6560aaafcbca06"}, ] [[package]] name = "google-resumable-media" -version = "2.4.1" +version = "2.6.0" description = "Utilities for Google Media Downloads and Resumable Uploads" optional = false python-versions = ">= 3.7" files = [ - {file = "google-resumable-media-2.4.1.tar.gz", hash = "sha256:15b8a2e75df42dc6502d1306db0bce2647ba6013f9cd03b6e17368c0886ee90a"}, - {file = "google_resumable_media-2.4.1-py2.py3-none-any.whl", hash = "sha256:831e86fd78d302c1a034730a0c6e5369dd11d37bad73fa69ca8998460d5bae8d"}, + {file = "google-resumable-media-2.6.0.tar.gz", hash = "sha256:972852f6c65f933e15a4a210c2b96930763b47197cdf4aa5f5bea435efb626e7"}, + {file = "google_resumable_media-2.6.0-py2.py3-none-any.whl", hash = "sha256:fc03d344381970f79eebb632a3c18bb1828593a2dc5572b5f90115ef7d11e81b"}, ] [package.dependencies] google-crc32c = ">=1.0,<2.0dev" [package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)"] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "google-auth (>=1.22.0,<2.0dev)"] requests = ["requests (>=2.18.0,<3.0.0dev)"] [[package]] name = "googleapis-common-protos" -version = "1.59.0" +version = "1.61.0" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.59.0.tar.gz", hash = "sha256:4168fcb568a826a52f23510412da405abd93f4d23ba544bb68d943b14ba3cb44"}, - {file = "googleapis_common_protos-1.59.0-py2.py3-none-any.whl", hash = "sha256:b287dc48449d1d41af0c69f4ea26242b5ae4c3d7249a38b0984c86a4caffff1f"}, + {file = "googleapis-common-protos-1.61.0.tar.gz", hash = "sha256:8a64866a97f6304a7179873a465d6eee97b7a24ec6cfd78e0f575e96b821240b"}, + {file = "googleapis_common_protos-1.61.0-py2.py3-none-any.whl", hash = "sha256:22f1915393bb3245343f6efe87f6fe868532efc12aa26b391b15132e1279f1c0"}, ] [package.dependencies] -grpcio = {version = ">=1.44.0,<2.0.0dev", optional = true, markers = "extra == \"grpc\""} -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +grpcio = {version = ">=1.44.0,<2.0.0.dev0", optional = true, markers = "extra == \"grpc\""} +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" [package.extras] -grpc = ["grpcio (>=1.44.0,<2.0.0dev)"] +grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "graphviz" @@ -3117,94 +3490,88 @@ test = ["coverage", "mock (>=4)", "pytest (>=7)", "pytest-cov", "pytest-mock (>= [[package]] name = "greenlet" -version = "2.0.2" +version = "3.0.1" description = "Lightweight in-process concurrent programming" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -files = [ - {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, - {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, - {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, - {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, - {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, - {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, - {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, - {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, - {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, - {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, - {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, - {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, - {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, - {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, - {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, - {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, - {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, - {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, - {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, - {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, - {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, - {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, - {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, - {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, - {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, - {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, -] - -[package.extras] -docs = ["Sphinx", "docutils (<0.18)"] +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19bbdf1cce0346ef7341705d71e2ecf6f41a35c311137f29b8a2dc2341374565"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:599daf06ea59bfedbec564b1692b0166a0045f32b6f0933b0dd4df59a854caf2"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b641161c302efbb860ae6b081f406839a8b7d5573f20a455539823802c655f63"}, + {file = "greenlet-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d57e20ba591727da0c230ab2c3f200ac9d6d333860d85348816e1dca4cc4792e"}, + {file = "greenlet-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5805e71e5b570d490938d55552f5a9e10f477c19400c38bf1d5190d760691846"}, + {file = "greenlet-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:52e93b28db27ae7d208748f45d2db8a7b6a380e0d703f099c949d0f0d80b70e9"}, + {file = "greenlet-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f7bfb769f7efa0eefcd039dd19d843a4fbfbac52f1878b1da2ed5793ec9b1a65"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91e6c7db42638dc45cf2e13c73be16bf83179f7859b07cfc139518941320be96"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1757936efea16e3f03db20efd0cd50a1c86b06734f9f7338a90c4ba85ec2ad5a"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19075157a10055759066854a973b3d1325d964d498a805bb68a1f9af4aaef8ec"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9d21aaa84557d64209af04ff48e0ad5e28c5cca67ce43444e939579d085da72"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2847e5d7beedb8d614186962c3d774d40d3374d580d2cbdab7f184580a39d234"}, + {file = "greenlet-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:97e7ac860d64e2dcba5c5944cfc8fa9ea185cd84061c623536154d5a89237884"}, + {file = "greenlet-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b2c02d2ad98116e914d4f3155ffc905fd0c025d901ead3f6ed07385e19122c94"}, + {file = "greenlet-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:22f79120a24aeeae2b4471c711dcf4f8c736a2bb2fabad2a67ac9a55ea72523c"}, + {file = "greenlet-3.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:100f78a29707ca1525ea47388cec8a049405147719f47ebf3895e7509c6446aa"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60d5772e8195f4e9ebf74046a9121bbb90090f6550f81d8956a05387ba139353"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:daa7197b43c707462f06d2c693ffdbb5991cbb8b80b5b984007de431493a319c"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea6b8aa9e08eea388c5f7a276fabb1d4b6b9d6e4ceb12cc477c3d352001768a9"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d11ebbd679e927593978aa44c10fc2092bc454b7d13fdc958d3e9d508aba7d0"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dbd4c177afb8a8d9ba348d925b0b67246147af806f0b104af4d24f144d461cd5"}, + {file = "greenlet-3.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20107edf7c2c3644c67c12205dc60b1bb11d26b2610b276f97d666110d1b511d"}, + {file = "greenlet-3.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8bef097455dea90ffe855286926ae02d8faa335ed8e4067326257cb571fc1445"}, + {file = "greenlet-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:b2d3337dcfaa99698aa2377c81c9ca72fcd89c07e7eb62ece3f23a3fe89b2ce4"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80ac992f25d10aaebe1ee15df45ca0d7571d0f70b645c08ec68733fb7a020206"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:337322096d92808f76ad26061a8f5fccb22b0809bea39212cd6c406f6a7060d2"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9934adbd0f6e476f0ecff3c94626529f344f57b38c9a541f87098710b18af0a"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc4d815b794fd8868c4d67602692c21bf5293a75e4b607bb92a11e821e2b859a"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41bdeeb552d814bcd7fb52172b304898a35818107cc8778b5101423c9017b3de"}, + {file = "greenlet-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6e6061bf1e9565c29002e3c601cf68569c450be7fc3f7336671af7ddb4657166"}, + {file = "greenlet-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fa24255ae3c0ab67e613556375a4341af04a084bd58764731972bcbc8baeba36"}, + {file = "greenlet-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:b489c36d1327868d207002391f662a1d163bdc8daf10ab2e5f6e41b9b96de3b1"}, + {file = "greenlet-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f33f3258aae89da191c6ebaa3bc517c6c4cbc9b9f689e5d8452f7aedbb913fa8"}, + {file = "greenlet-3.0.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:d2905ce1df400360463c772b55d8e2518d0e488a87cdea13dd2c71dcb2a1fa16"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a02d259510b3630f330c86557331a3b0e0c79dac3d166e449a39363beaae174"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55d62807f1c5a1682075c62436702aaba941daa316e9161e4b6ccebbbf38bda3"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3fcc780ae8edbb1d050d920ab44790201f027d59fdbd21362340a85c79066a74"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eddd98afc726f8aee1948858aed9e6feeb1758889dfd869072d4465973f6bfd"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eabe7090db68c981fca689299c2d116400b553f4b713266b130cfc9e2aa9c5a9"}, + {file = "greenlet-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f2f6d303f3dee132b322a14cd8765287b8f86cdc10d2cb6a6fae234ea488888e"}, + {file = "greenlet-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d923ff276f1c1f9680d32832f8d6c040fe9306cbfb5d161b0911e9634be9ef0a"}, + {file = "greenlet-3.0.1-cp38-cp38-win32.whl", hash = "sha256:0b6f9f8ca7093fd4433472fd99b5650f8a26dcd8ba410e14094c1e44cd3ceddd"}, + {file = "greenlet-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:990066bff27c4fcf3b69382b86f4c99b3652bab2a7e685d968cd4d0cfc6f67c6"}, + {file = "greenlet-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ce85c43ae54845272f6f9cd8320d034d7a946e9773c693b27d620edec825e376"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ee2e967bd7ff85d84a2de09df10e021c9b38c7d91dead95b406ed6350c6997"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87c8ceb0cf8a5a51b8008b643844b7f4a8264a2c13fcbcd8a8316161725383fe"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6a8c9d4f8692917a3dc7eb25a6fb337bff86909febe2f793ec1928cd97bedfc"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fbc5b8f3dfe24784cee8ce0be3da2d8a79e46a276593db6868382d9c50d97b1"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85d2b77e7c9382f004b41d9c72c85537fac834fb141b0296942d52bf03fe4a3d"}, + {file = "greenlet-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:696d8e7d82398e810f2b3622b24e87906763b6ebfd90e361e88eb85b0e554dc8"}, + {file = "greenlet-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:329c5a2e5a0ee942f2992c5e3ff40be03e75f745f48847f118a3cfece7a28546"}, + {file = "greenlet-3.0.1-cp39-cp39-win32.whl", hash = "sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57"}, + {file = "greenlet-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619"}, + {file = "greenlet-3.0.1.tar.gz", hash = "sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b"}, +] + +[package.extras] +docs = ["Sphinx"] test = ["objgraph", "psutil"] [[package]] name = "griffe" -version = "0.27.1" +version = "0.38.0" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "griffe-0.27.1-py3-none-any.whl", hash = "sha256:867008786a17532ec529cbf58cee7c4f131b85d61f38691c2046b1883f7be253"}, - {file = "griffe-0.27.1.tar.gz", hash = "sha256:f213e87f99bf3b76d2d4da999d5a38c2ec01b9a6ce3660c5ab52b663d785edba"}, + {file = "griffe-0.38.0-py3-none-any.whl", hash = "sha256:6a5bc457320e8e199006aa5fbb03e162f5e21abe31aa6221f7a5c37ea0724c71"}, + {file = "griffe-0.38.0.tar.gz", hash = "sha256:9b97487b583042b543d1e28196caee638ecd766c8c4c98135071806cb5333ac2"}, ] [package.dependencies] colorama = ">=0.4" -[package.extras] -async = ["aiofiles (>=0.7,<1.0)"] - [[package]] name = "grpc-google-iam-v1" version = "0.12.6" @@ -3223,60 +3590,69 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4 [[package]] name = "grpcio" -version = "1.54.0" +version = "1.59.2" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.7" files = [ - {file = "grpcio-1.54.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:a947d5298a0bbdd4d15671024bf33e2b7da79a70de600ed29ba7e0fef0539ebb"}, - {file = "grpcio-1.54.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:e355ee9da9c1c03f174efea59292b17a95e0b7b4d7d2a389265f731a9887d5a9"}, - {file = "grpcio-1.54.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:73c238ef6e4b64272df7eec976bb016c73d3ab5a6c7e9cd906ab700523d312f3"}, - {file = "grpcio-1.54.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c59d899ee7160638613a452f9a4931de22623e7ba17897d8e3e348c2e9d8d0b"}, - {file = "grpcio-1.54.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48cb7af77238ba16c77879009003f6b22c23425e5ee59cb2c4c103ec040638a5"}, - {file = "grpcio-1.54.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2262bd3512ba9e9f0e91d287393df6f33c18999317de45629b7bd46c40f16ba9"}, - {file = "grpcio-1.54.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:224166f06ccdaf884bf35690bf4272997c1405de3035d61384ccb5b25a4c1ca8"}, - {file = "grpcio-1.54.0-cp310-cp310-win32.whl", hash = "sha256:ed36e854449ff6c2f8ee145f94851fe171298e1e793f44d4f672c4a0d78064e7"}, - {file = "grpcio-1.54.0-cp310-cp310-win_amd64.whl", hash = "sha256:27fb030a4589d2536daec5ff5ba2a128f4f155149efab578fe2de2cb21596d3d"}, - {file = "grpcio-1.54.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:f4a7dca8ccd8023d916b900aa3c626f1bd181bd5b70159479b142f957ff420e4"}, - {file = "grpcio-1.54.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:1209d6b002b26e939e4c8ea37a3d5b4028eb9555394ea69fb1adbd4b61a10bb8"}, - {file = "grpcio-1.54.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:860fcd6db7dce80d0a673a1cc898ce6bc3d4783d195bbe0e911bf8a62c93ff3f"}, - {file = "grpcio-1.54.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3930669c9e6f08a2eed824738c3d5699d11cd47a0ecc13b68ed11595710b1133"}, - {file = "grpcio-1.54.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62117486460c83acd3b5d85c12edd5fe20a374630475388cfc89829831d3eb79"}, - {file = "grpcio-1.54.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e3e526062c690517b42bba66ffe38aaf8bc99a180a78212e7b22baa86902f690"}, - {file = "grpcio-1.54.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ebff0738be0499d7db74d20dca9f22a7b27deae31e1bf92ea44924fd69eb6251"}, - {file = "grpcio-1.54.0-cp311-cp311-win32.whl", hash = "sha256:21c4a1aae861748d6393a3ff7867473996c139a77f90326d9f4104bebb22d8b8"}, - {file = "grpcio-1.54.0-cp311-cp311-win_amd64.whl", hash = "sha256:3db71c6f1ab688d8dfc102271cedc9828beac335a3a4372ec54b8bf11b43fd29"}, - {file = "grpcio-1.54.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:960b176e0bb2b4afeaa1cd2002db1e82ae54c9b6e27ea93570a42316524e77cf"}, - {file = "grpcio-1.54.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:d8ae6e0df3a608e99ee1acafaafd7db0830106394d54571c1ece57f650124ce9"}, - {file = "grpcio-1.54.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:c33744d0d1a7322da445c0fe726ea6d4e3ef2dfb0539eadf23dce366f52f546c"}, - {file = "grpcio-1.54.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d109df30641d050e009105f9c9ca5a35d01e34d2ee2a4e9c0984d392fd6d704"}, - {file = "grpcio-1.54.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:775a2f70501370e5ba54e1ee3464413bff9bd85bd9a0b25c989698c44a6fb52f"}, - {file = "grpcio-1.54.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c55a9cf5cba80fb88c850915c865b8ed78d5e46e1f2ec1b27692f3eaaf0dca7e"}, - {file = "grpcio-1.54.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1fa7d6ddd33abbd3c8b3d7d07c56c40ea3d1891ce3cd2aa9fa73105ed5331866"}, - {file = "grpcio-1.54.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ed3d458ded32ff3a58f157b60cc140c88f7ac8c506a1c567b2a9ee8a2fd2ce54"}, - {file = "grpcio-1.54.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:5942a3e05630e1ef5b7b5752e5da6582460a2e4431dae603de89fc45f9ec5aa9"}, - {file = "grpcio-1.54.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:125ed35aa3868efa82eabffece6264bf638cfdc9f0cd58ddb17936684aafd0f8"}, - {file = "grpcio-1.54.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:b7655f809e3420f80ce3bf89737169a9dce73238af594049754a1128132c0da4"}, - {file = "grpcio-1.54.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87f47bf9520bba4083d65ab911f8f4c0ac3efa8241993edd74c8dd08ae87552f"}, - {file = "grpcio-1.54.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16bca8092dd994f2864fdab278ae052fad4913f36f35238b2dd11af2d55a87db"}, - {file = "grpcio-1.54.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d2f62fb1c914a038921677cfa536d645cb80e3dd07dc4859a3c92d75407b90a5"}, - {file = "grpcio-1.54.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a7caf553ccaf715ec05b28c9b2ab2ee3fdb4036626d779aa09cf7cbf54b71445"}, - {file = "grpcio-1.54.0-cp38-cp38-win32.whl", hash = "sha256:2585b3c294631a39b33f9f967a59b0fad23b1a71a212eba6bc1e3ca6e6eec9ee"}, - {file = "grpcio-1.54.0-cp38-cp38-win_amd64.whl", hash = "sha256:3b170e441e91e4f321e46d3cc95a01cb307a4596da54aca59eb78ab0fc03754d"}, - {file = "grpcio-1.54.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:1382bc499af92901c2240c4d540c74eae8a671e4fe9839bfeefdfcc3a106b5e2"}, - {file = "grpcio-1.54.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:031bbd26656e0739e4b2c81c172155fb26e274b8d0312d67aefc730bcba915b6"}, - {file = "grpcio-1.54.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:a97b0d01ae595c997c1d9d8249e2d2da829c2d8a4bdc29bb8f76c11a94915c9a"}, - {file = "grpcio-1.54.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:533eaf5b2a79a3c6f35cbd6a095ae99cac7f4f9c0e08bdcf86c130efd3c32adf"}, - {file = "grpcio-1.54.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49eace8ea55fbc42c733defbda1e4feb6d3844ecd875b01bb8b923709e0f5ec8"}, - {file = "grpcio-1.54.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:30fbbce11ffeb4f9f91c13fe04899aaf3e9a81708bedf267bf447596b95df26b"}, - {file = "grpcio-1.54.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:650f5f2c9ab1275b4006707411bb6d6bc927886874a287661c3c6f332d4c068b"}, - {file = "grpcio-1.54.0-cp39-cp39-win32.whl", hash = "sha256:02000b005bc8b72ff50c477b6431e8886b29961159e8b8d03c00b3dd9139baed"}, - {file = "grpcio-1.54.0-cp39-cp39-win_amd64.whl", hash = "sha256:6dc1e2c9ac292c9a484ef900c568ccb2d6b4dfe26dfa0163d5bc815bb836c78d"}, - {file = "grpcio-1.54.0.tar.gz", hash = "sha256:eb0807323572642ab73fd86fe53d88d843ce617dd1ddf430351ad0759809a0ae"}, -] - -[package.extras] -protobuf = ["grpcio-tools (>=1.54.0)"] + {file = "grpcio-1.59.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:d2fa68a96a30dd240be80bbad838a0ac81a61770611ff7952b889485970c4c71"}, + {file = "grpcio-1.59.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:cf0dead5a2c5a3347af2cfec7131d4f2a2e03c934af28989c9078f8241a491fa"}, + {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:e420ced29b5904cdf9ee5545e23f9406189d8acb6750916c2db4793dada065c6"}, + {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b230028a008ae1d0f430acb227d323ff8a619017415cf334c38b457f814119f"}, + {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a4a3833c0e067f3558538727235cd8a49709bff1003200bbdefa2f09334e4b1"}, + {file = "grpcio-1.59.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6b25ed37c27e652db01be341af93fbcea03d296c024d8a0e680017a268eb85dd"}, + {file = "grpcio-1.59.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73abb8584b0cf74d37f5ef61c10722adc7275502ab71789a8fe3cb7ef04cf6e2"}, + {file = "grpcio-1.59.2-cp310-cp310-win32.whl", hash = "sha256:d6f70406695e3220f09cd7a2f879333279d91aa4a8a1d34303b56d61a8180137"}, + {file = "grpcio-1.59.2-cp310-cp310-win_amd64.whl", hash = "sha256:3c61d641d4f409c5ae46bfdd89ea42ce5ea233dcf69e74ce9ba32b503c727e29"}, + {file = "grpcio-1.59.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:3059668df17627f0e0fa680e9ef8c995c946c792612e9518f5cc1503be14e90b"}, + {file = "grpcio-1.59.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:72ca2399097c0b758198f2ff30f7178d680de8a5cfcf3d9b73a63cf87455532e"}, + {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:c978f864b35f2261e0819f5cd88b9830b04dc51bcf055aac3c601e525a10d2ba"}, + {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9411e24328a2302e279e70cae6e479f1fddde79629fcb14e03e6d94b3956eabf"}, + {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb7e0fe6ad73b7f06d7e2b689c19a71cf5cc48f0c2bf8608469e51ffe0bd2867"}, + {file = "grpcio-1.59.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c2504eed520958a5b77cc99458297cb7906308cb92327f35fb7fbbad4e9b2188"}, + {file = "grpcio-1.59.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2171c39f355ba5b551c5d5928d65aa6c69807fae195b86ef4a7d125bcdb860a9"}, + {file = "grpcio-1.59.2-cp311-cp311-win32.whl", hash = "sha256:d2794f0e68b3085d99b4f6ff9c089f6fdd02b32b9d3efdfbb55beac1bf22d516"}, + {file = "grpcio-1.59.2-cp311-cp311-win_amd64.whl", hash = "sha256:2067274c88bc6de89c278a672a652b4247d088811ece781a4858b09bdf8448e3"}, + {file = "grpcio-1.59.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:535561990e075fa6bd4b16c4c3c1096b9581b7bb35d96fac4650f1181e428268"}, + {file = "grpcio-1.59.2-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:a213acfbf186b9f35803b52e4ca9addb153fc0b67f82a48f961be7000ecf6721"}, + {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:6959fb07e8351e20501ffb8cc4074c39a0b7ef123e1c850a7f8f3afdc3a3da01"}, + {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e82c5cf1495244adf5252f925ac5932e5fd288b3e5ab6b70bec5593074b7236c"}, + {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023088764012411affe7db183d1ada3ad9daf2e23ddc719ff46d7061de661340"}, + {file = "grpcio-1.59.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:da2d94c15f88cd40d7e67f7919d4f60110d2b9d5b1e08cf354c2be773ab13479"}, + {file = "grpcio-1.59.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6009386a2df66159f64ac9f20425ae25229b29b9dd0e1d3dd60043f037e2ad7e"}, + {file = "grpcio-1.59.2-cp312-cp312-win32.whl", hash = "sha256:75c6ecb70e809cf1504465174343113f51f24bc61e22a80ae1c859f3f7034c6d"}, + {file = "grpcio-1.59.2-cp312-cp312-win_amd64.whl", hash = "sha256:cbe946b3e6e60a7b4618f091e62a029cb082b109a9d6b53962dd305087c6e4fd"}, + {file = "grpcio-1.59.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:f8753a6c88d1d0ba64302309eecf20f70d2770f65ca02d83c2452279085bfcd3"}, + {file = "grpcio-1.59.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:f1ef0d39bc1feb420caf549b3c657c871cad4ebbcf0580c4d03816b0590de0cf"}, + {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:4c93f4abbb54321ee6471e04a00139c80c754eda51064187963ddf98f5cf36a4"}, + {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08d77e682f2bf730a4961eea330e56d2f423c6a9b91ca222e5b1eb24a357b19f"}, + {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff16d68bf453275466a9a46739061a63584d92f18a0f5b33d19fc97eb69867c"}, + {file = "grpcio-1.59.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4abb717e320e74959517dc8e84a9f48fbe90e9abe19c248541e9418b1ce60acd"}, + {file = "grpcio-1.59.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:36f53c2b3449c015880e7d55a89c992c357f176327b0d2873cdaaf9628a37c69"}, + {file = "grpcio-1.59.2-cp37-cp37m-win_amd64.whl", hash = "sha256:cc3e4cd087f07758b16bef8f31d88dbb1b5da5671d2f03685ab52dece3d7a16e"}, + {file = "grpcio-1.59.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:27f879ae604a7fcf371e59fba6f3ff4635a4c2a64768bd83ff0cac503142fef4"}, + {file = "grpcio-1.59.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:7cf05053242f61ba94014dd3a986e11a083400a32664058f80bf4cf817c0b3a1"}, + {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:e1727c1c0e394096bb9af185c6923e8ea55a5095b8af44f06903bcc0e06800a2"}, + {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d573e70a6fe77555fb6143c12d3a7d3fa306632a3034b4e7c59ca09721546f8"}, + {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31176aa88f36020055ace9adff2405a33c8bdbfa72a9c4980e25d91b2f196873"}, + {file = "grpcio-1.59.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:11168ef43e4a43ff1b1a65859f3e0ef1a173e277349e7fb16923ff108160a8cd"}, + {file = "grpcio-1.59.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:53c9aa5ddd6857c0a1cd0287225a2a25873a8e09727c2e95c4aebb1be83a766a"}, + {file = "grpcio-1.59.2-cp38-cp38-win32.whl", hash = "sha256:3b4368b33908f683a363f376dfb747d40af3463a6e5044afee07cf9436addf96"}, + {file = "grpcio-1.59.2-cp38-cp38-win_amd64.whl", hash = "sha256:0a754aff9e3af63bdc4c75c234b86b9d14e14a28a30c4e324aed1a9b873d755f"}, + {file = "grpcio-1.59.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:1f9524d1d701e399462d2c90ba7c193e49d1711cf429c0d3d97c966856e03d00"}, + {file = "grpcio-1.59.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:f93dbf58f03146164048be5426ffde298b237a5e059144847e4940f5b80172c3"}, + {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:6da6dea3a1bacf99b3c2187e296db9a83029ed9c38fd4c52b7c9b7326d13c828"}, + {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5f09cffa619adfb44799fa4a81c2a1ad77c887187613fb0a8f201ab38d89ba1"}, + {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c35aa9657f5d5116d23b934568e0956bd50c615127810fffe3ac356a914c176a"}, + {file = "grpcio-1.59.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:74100fecaec8a535e380cf5f2fb556ff84957d481c13e54051c52e5baac70541"}, + {file = "grpcio-1.59.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:128e20f57c5f27cb0157e73756d1586b83c1b513ebecc83ea0ac37e4b0e4e758"}, + {file = "grpcio-1.59.2-cp39-cp39-win32.whl", hash = "sha256:686e975a5d16602dc0982c7c703948d17184bd1397e16c8ee03511ecb8c4cdda"}, + {file = "grpcio-1.59.2-cp39-cp39-win_amd64.whl", hash = "sha256:242adc47725b9a499ee77c6a2e36688fa6c96484611f33b1be4c57ab075a92dd"}, + {file = "grpcio-1.59.2.tar.gz", hash = "sha256:d8f9cd4ad1be90b0cf350a2f04a38a36e44a026cac1e036ac593dc48efe91d52"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.59.2)"] [[package]] name = "grpcio-gcp" @@ -3341,12 +3717,12 @@ files = [ [[package]] name = "hail" -version = "0.2.113" +version = "0.2.126" description = "Scalable library for exploring and analyzing genomic data." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "hail-0.2.113-py3-none-any.whl", hash = "sha256:ff7d2f12fcaa0d9137fc61218677da7474fff312a6264dad39c7bf79757d5097"}, + {file = "hail-0.2.126-py3-none-any.whl", hash = "sha256:97a319bc194d0d0d8e0b5e974b2758802460269a09283275de250963b4f2c7e2"}, ] [package.dependencies] @@ -3355,55 +3731,47 @@ aiohttp = ">=3.8.1,<4" asyncinit = ">=0.2.4,<0.3" avro = ">=1.10,<1.12" azure-identity = ">=1.6.0,<2" +azure-mgmt-storage = "20.1.0" azure-storage-blob = ">=12.11.0,<13" -bokeh = "1.4.0" +bokeh = ">=3,<4" boto3 = ">=1.17,<2.0" botocore = ">=1.20,<2.0" decorator = "<5" Deprecated = ">=1.2.10,<1.3" -dill = ">=0.3.1.1,<0.4" +dill = ">=0.3.6,<0.4" frozenlist = ">=1.3.1,<2" google-auth = ">=2.14.1,<3" -google-cloud-storage = ">=1.25.0" +google-auth-oauthlib = ">=0.5.2,<1" humanize = ">=1.0.0,<2" -"hurry.filesize" = ">=0.9,<1" janus = ">=0.6,<1.1" -Jinja2 = "3.0.3" -nest-asyncio = ">=1.5.4,<2" +jproperties = ">=2.1.1,<3" +nest-asyncio = ">=1.5.8,<2" numpy = "<2" orjson = ">=3.6.4,<4" -pandas = ">=1.3.0,<1.6.0" +pandas = ">=2,<3" parsimonious = "<1" plotly = ">=5.5.0,<6" protobuf = "3.20.2" pyspark = ">=3.3.0,<3.4" python-json-logger = ">=2.0.2,<3" +pyyaml = ">=6.0,<7.0" requests = ">=2.25.1,<3" -rich = "12.6.0" -scipy = ">1.2,<1.10" +rich = ">=12.6.0,<13" +scipy = ">1.2,<1.12" sortedcontainers = ">=2.4.0,<3" tabulate = ">=0.8.9,<1" -uvloop = {version = ">=0.16.0,<1", markers = "sys_platform != \"win32\""} - -[[package]] -name = "htmlmin" -version = "0.1.12" -description = "An HTML Minifier" -optional = false -python-versions = "*" -files = [ - {file = "htmlmin-0.1.12.tar.gz", hash = "sha256:50c1ef4630374a5d723900096a961cff426dff46b48f34d194a81bbe14eca178"}, -] +typer = ">=0.9.0,<1" +uvloop = {version = ">=0.19.0,<1", markers = "sys_platform != \"win32\""} [[package]] name = "httpcore" -version = "0.17.3" +version = "0.18.0" description = "A minimal low-level HTTP client." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "httpcore-0.17.3-py3-none-any.whl", hash = "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87"}, - {file = "httpcore-0.17.3.tar.gz", hash = "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888"}, + {file = "httpcore-0.18.0-py3-none-any.whl", hash = "sha256:adc5398ee0a476567bf87467063ee63584a8bce86078bf748e48754f60202ced"}, + {file = "httpcore-0.18.0.tar.gz", hash = "sha256:13b5e5cd1dca1a6636a6aaea212b19f4f85cd88c366a2b82304181b769aab3c9"}, ] [package.dependencies] @@ -3432,18 +3800,18 @@ pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0 [[package]] name = "httpx" -version = "0.24.1" +version = "0.25.0" description = "The next generation HTTP client." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "httpx-0.24.1-py3-none-any.whl", hash = "sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd"}, - {file = "httpx-0.24.1.tar.gz", hash = "sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd"}, + {file = "httpx-0.25.0-py3-none-any.whl", hash = "sha256:181ea7f8ba3a82578be86ef4171554dd45fec26a02556a744db029a0a27b7100"}, + {file = "httpx-0.25.0.tar.gz", hash = "sha256:47ecda285389cb32bb2691cc6e069e3ab0205956f681c5b2ad2325719751d875"}, ] [package.dependencies] certifi = "*" -httpcore = ">=0.15.0,<0.18.0" +httpcore = ">=0.18.0,<0.19.0" idna = "*" sniffio = "*" @@ -3467,19 +3835,6 @@ files = [ [package.extras] tests = ["freezegun", "pytest", "pytest-cov"] -[[package]] -name = "hurry.filesize" -version = "0.9" -description = "A simple Python library for human readable file sizes (or anything sized in bytes)." -optional = false -python-versions = "*" -files = [ - {file = "hurry.filesize-0.9.tar.gz", hash = "sha256:f5368329adbef86accd3bc9490522340bb79260455ae89b1a42c10f63801b9a6"}, -] - -[package.dependencies] -setuptools = "*" - [[package]] name = "hydra-core" version = "1.3.2" @@ -3498,13 +3853,13 @@ packaging = "*" [[package]] name = "identify" -version = "2.5.22" +version = "2.5.31" description = "File identification library for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "identify-2.5.22-py2.py3-none-any.whl", hash = "sha256:f0faad595a4687053669c112004178149f6c326db71ee999ae4636685753ad2f"}, - {file = "identify-2.5.22.tar.gz", hash = "sha256:f7a93d6cf98e29bd07663c60728e7a4057615068d7a639d132dc883b2d54d31e"}, + {file = "identify-2.5.31-py2.py3-none-any.whl", hash = "sha256:90199cb9e7bd3c5407a9b7e81b4abec4bb9d249991c79439ec8af740afc6293d"}, + {file = "identify-2.5.31.tar.gz", hash = "sha256:7736b3c7a28233637e3c36550646fc6389bedd74ae84cb788200cc8e2dd60b75"}, ] [package.extras] @@ -3521,20 +3876,39 @@ files = [ {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] +[[package]] +name = "importlib-metadata" +version = "6.8.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, + {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] + [[package]] name = "importlib-resources" -version = "6.0.1" +version = "6.1.0" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.0.1-py3-none-any.whl", hash = "sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf"}, - {file = "importlib_resources-6.0.1.tar.gz", hash = "sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4"}, + {file = "importlib_resources-6.1.0-py3-none-any.whl", hash = "sha256:aa50258bbfa56d4e33fbd8aa3ef48ded10d1735f11532b8df95388cc6bdb7e83"}, + {file = "importlib_resources-6.1.0.tar.gz", hash = "sha256:9d48dcccc213325e810fd723e7fbb45ccb39f6cf5c31f00cf2b965f5f10f3cb9"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] [[package]] name = "inflection" @@ -3585,13 +3959,13 @@ tests = ["pytest", "pytest-cov", "pytest-mock"] [[package]] name = "ipykernel" -version = "6.22.0" +version = "6.27.1" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.22.0-py3-none-any.whl", hash = "sha256:1ae6047c1277508933078163721bbb479c3e7292778a04b4bacf0874550977d6"}, - {file = "ipykernel-6.22.0.tar.gz", hash = "sha256:302558b81f1bc22dc259fb2a0c5c7cf2f4c0bdb21b50484348f7bafe7fb71421"}, + {file = "ipykernel-6.27.1-py3-none-any.whl", hash = "sha256:dab88b47f112f9f7df62236511023c9bdeef67abc73af7c652e4ce4441601686"}, + {file = "ipykernel-6.27.1.tar.gz", hash = "sha256:7d5d594b6690654b4d299edba5e872dc17bb7396a8d0609c97cb7b8a1c605de6"}, ] [package.dependencies] @@ -3618,41 +3992,39 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio" [[package]] name = "ipython" -version = "8.12.0" +version = "8.19.0" description = "IPython: Productive Interactive Computing" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" files = [ - {file = "ipython-8.12.0-py3-none-any.whl", hash = "sha256:1c183bf61b148b00bcebfa5d9b39312733ae97f6dad90d7e9b4d86c8647f498c"}, - {file = "ipython-8.12.0.tar.gz", hash = "sha256:a950236df04ad75b5bc7f816f9af3d74dc118fd42f2ff7e80e8e60ca1f182e2d"}, + {file = "ipython-8.19.0-py3-none-any.whl", hash = "sha256:2f55d59370f59d0d2b2212109fe0e6035cfea436b1c0e6150ad2244746272ec5"}, + {file = "ipython-8.19.0.tar.gz", hash = "sha256:ac4da4ecf0042fb4e0ce57c60430c2db3c719fa8bdf92f8631d6bd8a5785d1f0"}, ] [package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} -backcall = "*" colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -pickleshare = "*" -prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +prompt-toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack-data = "*" traitlets = ">=5" [package.extras] -all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.23)", "pandas", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] black = ["black"] -doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] kernel = ["ipykernel"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] +test = ["pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath", "trio"] [[package]] name = "isodate" @@ -3670,20 +4042,17 @@ six = "*" [[package]] name = "isort" -version = "5.12.0" +version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" files = [ - {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, - {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, ] [package.extras] -colors = ["colorama (>=0.4.3)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] +colors = ["colorama (>=0.4.6)"] [[package]] name = "itsdangerous" @@ -3712,32 +4081,32 @@ typing-extensions = ">=3.7.4.3" [[package]] name = "jedi" -version = "0.18.2" +version = "0.19.1" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, - {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, ] [package.dependencies] -parso = ">=0.8.0,<0.9.0" +parso = ">=0.8.3,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] -name = "Jinja2" -version = "3.0.3" +name = "jinja2" +version = "3.1.2" description = "A very fast and expressive template engine." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, - {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] [package.dependencies] @@ -3758,15 +4127,30 @@ files = [ ] [[package]] -name = "jsmin" -version = "3.0.1" -description = "JavaScript minifier." +name = "joblib" +version = "1.3.2" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "joblib-1.3.2-py3-none-any.whl", hash = "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9"}, + {file = "joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1"}, +] + +[[package]] +name = "jproperties" +version = "2.1.1" +description = "Java Property file parser and writer for Python" optional = false python-versions = "*" files = [ - {file = "jsmin-3.0.1.tar.gz", hash = "sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc"}, + {file = "jproperties-2.1.1-py2.py3-none-any.whl", hash = "sha256:4dfcd7cab56d9c79bce4453f7ca9ffbe0ff0574ddcf1c2a99a8646df60634664"}, + {file = "jproperties-2.1.1.tar.gz", hash = "sha256:40b71124e8d257e8954899a91cd2d5c0f72e0f67f1b72048a5ba264567604f29"}, ] +[package.dependencies] +six = ">=1.13,<2.0" + [[package]] name = "json-merge-patch" version = "0.2" @@ -3779,13 +4163,13 @@ files = [ [[package]] name = "jsonschema" -version = "4.19.0" +version = "4.19.2" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.19.0-py3-none-any.whl", hash = "sha256:043dc26a3845ff09d20e4420d6012a9c91c9aa8999fa184e7efcfeccb41e32cb"}, - {file = "jsonschema-4.19.0.tar.gz", hash = "sha256:6e1e7569ac13be8139b2dd2c21a55d350066ee3f80df06c608b398cdc6f30e8f"}, + {file = "jsonschema-4.19.2-py3-none-any.whl", hash = "sha256:eee9e502c788e89cb166d4d37f43084e3b64ab405c795c03d343a4dbc2c810fc"}, + {file = "jsonschema-4.19.2.tar.gz", hash = "sha256:c9ff4d7447eed9592c23a12ccee508baf0dd0d59650615e847feb6cdca74f392"}, ] [package.dependencies] @@ -3814,13 +4198,13 @@ referencing = ">=0.28.0" [[package]] name = "jupyter-client" -version = "8.2.0" +version = "8.5.0" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.2.0-py3-none-any.whl", hash = "sha256:b18219aa695d39e2ad570533e0d71fb7881d35a873051054a84ee2a17c4b7389"}, - {file = "jupyter_client-8.2.0.tar.gz", hash = "sha256:9fe233834edd0e6c0aa5f05ca2ab4bdea1842bfd2d8a932878212fc5301ddaf0"}, + {file = "jupyter_client-8.5.0-py3-none-any.whl", hash = "sha256:c3877aac7257ec68d79b5c622ce986bd2a992ca42f6ddc9b4dd1da50e89f7028"}, + {file = "jupyter_client-8.5.0.tar.gz", hash = "sha256:e8754066510ce456358df363f97eae64b50860f30dc1fe8c6771440db3be9a63"}, ] [package.dependencies] @@ -3836,13 +4220,13 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt [[package]] name = "jupyter-core" -version = "5.3.0" +version = "5.5.0" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.3.0-py3-none-any.whl", hash = "sha256:d4201af84559bc8c70cead287e1ab94aeef3c512848dde077b7684b54d67730d"}, - {file = "jupyter_core-5.3.0.tar.gz", hash = "sha256:6db75be0c83edbf1b7c9f91ec266a9a24ef945da630f3120e1a0046dc13713fc"}, + {file = "jupyter_core-5.5.0-py3-none-any.whl", hash = "sha256:e11e02cd8ae0a9de5c6c44abf5727df9f2581055afe00b22183f621ba3585805"}, + {file = "jupyter_core-5.5.0.tar.gz", hash = "sha256:880b86053bf298a8724994f95e99b99130659022a4f7f45f563084b6223861d3"}, ] [package.dependencies] @@ -3851,7 +4235,7 @@ pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_ traitlets = ">=5.3" [package.extras] -docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] [[package]] @@ -3901,24 +4285,23 @@ files = [ [[package]] name = "limits" -version = "3.5.0" +version = "3.6.0" description = "Rate limiting utilities" optional = false python-versions = ">=3.7" files = [ - {file = "limits-3.5.0-py3-none-any.whl", hash = "sha256:3ad525faeb7e1c63859ca1cae34c9ed22a8f22c9ea9d96e2f412869f6b36beb9"}, - {file = "limits-3.5.0.tar.gz", hash = "sha256:b728c9ab3c6163997b1d11a51d252d951efd13f0d248ea2403383952498f8a22"}, + {file = "limits-3.6.0-py3-none-any.whl", hash = "sha256:32fe29a398352c71bc43d53773117d47e22c5ea4200aef28d3f5fdee10334cd7"}, + {file = "limits-3.6.0.tar.gz", hash = "sha256:57a9c69fd37ad1e4fa3886dff8d035227e1f6af87f47e9118627e72cf1ced3bf"}, ] [package.dependencies] deprecated = ">=1.2" importlib-resources = ">=1.3" packaging = ">=21,<24" -setuptools = "*" typing-extensions = "*" [package.extras] -all = ["aetcd", "coredis (>=3.4.0,<5)", "emcache (>=0.6.1)", "emcache (>=1)", "etcd3", "motor (>=3,<4)", "pymemcache (>3,<5.0.0)", "pymongo (>4.1,<5)", "redis (>3,!=4.5.2,!=4.5.3,<5.0.0)", "redis (>=4.2.0,!=4.5.2,!=4.5.3)"] +all = ["aetcd", "coredis (>=3.4.0,<5)", "emcache (>=0.6.1)", "emcache (>=1)", "etcd3", "motor (>=3,<4)", "pymemcache (>3,<5.0.0)", "pymongo (>4.1,<5)", "redis (>3,!=4.5.2,!=4.5.3,<6.0.0)", "redis (>=4.2.0,!=4.5.2,!=4.5.3)"] async-etcd = ["aetcd"] async-memcached = ["emcache (>=0.6.1)", "emcache (>=1)"] async-mongodb = ["motor (>=3,<4)"] @@ -3926,7 +4309,7 @@ async-redis = ["coredis (>=3.4.0,<5)"] etcd = ["etcd3"] memcached = ["pymemcache (>3,<5.0.0)"] mongodb = ["pymongo (>4.1,<5)"] -redis = ["redis (>3,!=4.5.2,!=4.5.3,<5.0.0)"] +redis = ["redis (>3,!=4.5.2,!=4.5.3,<6.0.0)"] rediscluster = ["redis (>=4.2.0,!=4.5.2,!=4.5.3)"] [[package]] @@ -3962,13 +4345,13 @@ files = [ [[package]] name = "looker-sdk" -version = "23.14.1" +version = "23.16.0" description = "Looker REST API" optional = false python-versions = ">=3.6" files = [ - {file = "looker_sdk-23.14.1-py3-none-any.whl", hash = "sha256:678a8007c18ccc79e52be7b8bc9f27c5de6697cc6d90fc24d2fab5efff0e5587"}, - {file = "looker_sdk-23.14.1.tar.gz", hash = "sha256:9510aabec41aae75d41cb0c81a53fe18c00c3fbe774ac610cc62c9410c5ea0a4"}, + {file = "looker_sdk-23.16.0-py3-none-any.whl", hash = "sha256:c5a680d4641a7725be6920630aa7ece0430e2a92abe1f396e8c63ed74dcd43d5"}, + {file = "looker_sdk-23.16.0.tar.gz", hash = "sha256:4daa7a9812a92fdd1e0094cb0afb0db2e7bb54e10492b1345b67705dbe5089d5"}, ] [package.dependencies] @@ -3979,95 +4362,110 @@ typing-extensions = ">=4.1.1" [[package]] name = "lxml" -version = "4.9.2" +version = "4.9.3" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" files = [ - {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, - {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, - {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, - {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, - {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, - {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, - {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, - {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, - {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, - {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, - {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, - {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, - {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, - {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, - {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, - {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, - {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, - {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, - {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, - {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, - {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, - {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, - {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, - {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, - {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, - {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, - {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, - {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, - {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, - {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, - {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, - {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, - {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, - {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, - {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, - {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, - {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, - {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, - {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, - {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, - {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, - {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, - {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, + {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, + {file = "lxml-4.9.3-cp27-cp27m-win32.whl", hash = "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7"}, + {file = "lxml-4.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, + {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f"}, + {file = "lxml-4.9.3-cp310-cp310-win32.whl", hash = "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85"}, + {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"}, + {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6"}, + {file = "lxml-4.9.3-cp311-cp311-win32.whl", hash = "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305"}, + {file = "lxml-4.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc"}, + {file = "lxml-4.9.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5"}, + {file = "lxml-4.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2"}, + {file = "lxml-4.9.3-cp35-cp35m-win32.whl", hash = "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d"}, + {file = "lxml-4.9.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833"}, + {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458"}, + {file = "lxml-4.9.3-cp36-cp36m-win32.whl", hash = "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477"}, + {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02"}, + {file = "lxml-4.9.3-cp37-cp37m-win32.whl", hash = "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f"}, + {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7"}, + {file = "lxml-4.9.3-cp38-cp38-win32.whl", hash = "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574"}, + {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"}, + {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50"}, + {file = "lxml-4.9.3-cp39-cp39-win32.whl", hash = "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2"}, + {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"}, + {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"}, + {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"}, ] [package.extras] cssselect = ["cssselect (>=0.7)"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=0.29.7)"] +source = ["Cython (>=0.29.35)"] [[package]] name = "mako" @@ -4089,17 +4487,18 @@ lingua = ["lingua"] testing = ["pytest"] [[package]] -name = "Markdown" -version = "3.3.7" -description = "Python implementation of Markdown." +name = "markdown" +version = "3.5.1" +description = "Python implementation of John Gruber's Markdown." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "Markdown-3.3.7-py3-none-any.whl", hash = "sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"}, - {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"}, + {file = "Markdown-3.5.1-py3-none-any.whl", hash = "sha256:5874b47d4ee3f0b14d764324d2c94c03ea66bee56f2d929da9f2508d65e722dc"}, + {file = "Markdown-3.5.1.tar.gz", hash = "sha256:b65d7beb248dc22f2e8a31fb706d93798093c308dc1aba295aedeb9d41a813bd"}, ] [package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] testing = ["coverage", "pyyaml"] [[package]] @@ -4127,62 +4526,72 @@ rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", " testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] -name = "MarkupSafe" -version = "2.1.2" +name = "markupsafe" +version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, - {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, ] [[package]] @@ -4313,13 +4722,13 @@ files = [ [[package]] name = "mkdocs" -version = "1.4.2" +version = "1.5.3" description = "Project documentation with Markdown." optional = false python-versions = ">=3.7" files = [ - {file = "mkdocs-1.4.2-py3-none-any.whl", hash = "sha256:c8856a832c1e56702577023cd64cc5f84948280c1c0fcc6af4cd39006ea6aa8c"}, - {file = "mkdocs-1.4.2.tar.gz", hash = "sha256:8947af423a6d0facf41ea1195b8e1e8c85ad94ac95ae307fe11232e0424b11c5"}, + {file = "mkdocs-1.5.3-py3-none-any.whl", hash = "sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1"}, + {file = "mkdocs-1.5.3.tar.gz", hash = "sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2"}, ] [package.dependencies] @@ -4327,26 +4736,29 @@ click = ">=7.0" colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} ghp-import = ">=1.0" jinja2 = ">=2.11.1" -markdown = ">=3.2.1,<3.4" +markdown = ">=3.2.1" +markupsafe = ">=2.0.1" mergedeep = ">=1.3.4" packaging = ">=20.5" +pathspec = ">=0.11.1" +platformdirs = ">=2.2.0" pyyaml = ">=5.1" pyyaml-env-tag = ">=0.1" watchdog = ">=2.0" [package.extras] i18n = ["babel (>=2.9.0)"] -min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pathspec (==0.11.1)", "platformdirs (==2.2.0)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] [[package]] name = "mkdocs-autolinks-plugin" -version = "0.6.0" +version = "0.7.1" description = "An MkDocs plugin" optional = false -python-versions = ">=2.7" +python-versions = ">=3.4" files = [ - {file = "mkdocs-autolinks-plugin-0.6.0.tar.gz", hash = "sha256:7bddb5bfb06f003fa7f139a4373ffc433e9ad761a297c7fe6ee205a4d7d913b6"}, - {file = "mkdocs_autolinks_plugin-0.6.0-py3-none-any.whl", hash = "sha256:db967582a5d3bd282d197730cd9035a74b559b0febb44645e95df27d5c67cad9"}, + {file = "mkdocs-autolinks-plugin-0.7.1.tar.gz", hash = "sha256:445ddb9b417b7795856c30801bb430773186c1daf210bdeecf8305f55a47d151"}, + {file = "mkdocs_autolinks_plugin-0.7.1-py3-none-any.whl", hash = "sha256:5c6c17f6649b68e79a9ef0b2648d59f3072e18002b90ee1586a64c505f11ab12"}, ] [package.dependencies] @@ -4354,13 +4766,13 @@ mkdocs = ">=1.2.3" [[package]] name = "mkdocs-autorefs" -version = "0.4.1" +version = "0.5.0" description = "Automatically link across pages in MkDocs." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mkdocs-autorefs-0.4.1.tar.gz", hash = "sha256:70748a7bd025f9ecd6d6feeba8ba63f8e891a1af55f48e366d6d6e78493aba84"}, - {file = "mkdocs_autorefs-0.4.1-py3-none-any.whl", hash = "sha256:a2248a9501b29dc0cc8ba4c09f4f47ff121945f6ce33d760f145d6f89d313f5b"}, + {file = "mkdocs_autorefs-0.5.0-py3-none-any.whl", hash = "sha256:7930fcb8ac1249f10e683967aeaddc0af49d90702af111a5e390e8b20b3d97ff"}, + {file = "mkdocs_autorefs-0.5.0.tar.gz", hash = "sha256:9a5054a94c08d28855cfab967ada10ed5be76e2bfad642302a610b252c3274c0"}, ] [package.dependencies] @@ -4369,13 +4781,13 @@ mkdocs = ">=1.1" [[package]] name = "mkdocs-awesome-pages-plugin" -version = "2.9.0" +version = "2.9.2" description = "An MkDocs plugin that simplifies configuring page titles and their order" optional = false python-versions = ">=3.7" files = [ - {file = "mkdocs_awesome_pages_plugin-2.9.0-py3-none-any.whl", hash = "sha256:783dddf7d42aba632324a2e5267ff13ca5a42ba9f4f37996d963f1b518f9009f"}, - {file = "mkdocs_awesome_pages_plugin-2.9.0.tar.gz", hash = "sha256:845a90b6ee0b00e641ff21a1599ad92805cfd12982c855686a79ef1c63454cc9"}, + {file = "mkdocs_awesome_pages_plugin-2.9.2-py3-none-any.whl", hash = "sha256:9c795587695bd1ee85a8b7e43293005418df5a8b9ef296a3e628be427b693b4d"}, + {file = "mkdocs_awesome_pages_plugin-2.9.2.tar.gz", hash = "sha256:c3f7d366ecfe99b64524c49a84d8e13c576c19a918ea2e6f59bb486a259313af"}, ] [package.dependencies] @@ -4398,30 +4810,29 @@ mkdocs = "*" [[package]] name = "mkdocs-git-committers-plugin-2" -version = "1.1.2" -description = "An MkDocs plugin to create a list of contributors on the page" +version = "2.2.2" +description = "An MkDocs plugin to create a list of contributors on the page. The git-committers plugin will seed the template context with a list of GitHub or GitLab committers and other useful GIT info such as last modified date" optional = false -python-versions = ">=2.7" +python-versions = ">=3.8,<4" files = [ - {file = "mkdocs-git-committers-plugin-2-1.1.2.tar.gz", hash = "sha256:745993c4b486de0023ea4c2758daa7a8790a60ac6e369b55203db165d203be80"}, - {file = "mkdocs_git_committers_plugin_2-1.1.2-py3-none-any.whl", hash = "sha256:7ffa7c6eaae3ade9eaac625bd7dc155e8a543261c81a0354d12909b49eb48588"}, + {file = "mkdocs-git-committers-plugin-2-2.2.2.tar.gz", hash = "sha256:87a241624116e1c6245034ca2ee3f247e4500589e75f19f71d352b052a8630d8"}, + {file = "mkdocs_git_committers_plugin_2-2.2.2-py3-none-any.whl", hash = "sha256:73545bdc813ecad609681f876e4f9305f8878c1aeb01a5e92d0e21d7d02ad87e"}, ] [package.dependencies] -beautifulsoup4 = "*" gitpython = "*" mkdocs = ">=1.0.3" requests = "*" [[package]] name = "mkdocs-git-revision-date-localized-plugin" -version = "1.2.0" +version = "1.2.2" description = "Mkdocs plugin that enables displaying the localized date of the last git modification of a markdown file." optional = false python-versions = ">=3.6" files = [ - {file = "mkdocs-git-revision-date-localized-plugin-1.2.0.tar.gz", hash = "sha256:7752edd7c4dcaa9383e9a5b6a4f729831a62d604b0c43b319331127720c6a2bf"}, - {file = "mkdocs_git_revision_date_localized_plugin-1.2.0-py3-none-any.whl", hash = "sha256:540b9c930d8d48630c090b72ac2c3900ac2ed0799b23738a33b88e31f5198fe7"}, + {file = "mkdocs-git-revision-date-localized-plugin-1.2.2.tar.gz", hash = "sha256:0c43a9aac1fa69df99a823f833cc223bac9967b60d5261a857761c7c6e3b30de"}, + {file = "mkdocs_git_revision_date_localized_plugin-1.2.2-py3-none-any.whl", hash = "sha256:85c7fe9ab06e7a63c4e522c26fee8b51d357cb8cbe605064501ad80f4f31cb94"}, ] [package.dependencies] @@ -4432,77 +4843,67 @@ pytz = "*" [[package]] name = "mkdocs-material" -version = "9.1.6" +version = "9.5.2" description = "Documentation that simply works" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.1.6-py3-none-any.whl", hash = "sha256:f2eb1d40db89da9922944833c1387207408f8937e1c2b46ab86e0c8f170b71e0"}, - {file = "mkdocs_material-9.1.6.tar.gz", hash = "sha256:2e555152f9771646bfa62dc78a86052876183eff69ce30db03a33e85702b21fc"}, + {file = "mkdocs_material-9.5.2-py3-none-any.whl", hash = "sha256:6ed0fbf4682491766f0ec1acc955db6901c2fd424c7ab343964ef51b819741f5"}, + {file = "mkdocs_material-9.5.2.tar.gz", hash = "sha256:ca8b9cd2b3be53e858e5a1a45ac9668bd78d95d77a30288bb5ebc1a31db6184c"}, ] [package.dependencies] -colorama = ">=0.4" -jinja2 = ">=3.0" -markdown = ">=3.2" -mkdocs = ">=1.4.2" -mkdocs-material-extensions = ">=1.1" -pygments = ">=2.14" -pymdown-extensions = ">=9.9.1" -regex = ">=2022.4.24" -requests = ">=2.26" +babel = ">=2.10,<3.0" +colorama = ">=0.4,<1.0" +jinja2 = ">=3.0,<4.0" +markdown = ">=3.2,<4.0" +mkdocs = ">=1.5.3,<2.0" +mkdocs-material-extensions = ">=1.3,<2.0" +paginate = ">=0.5,<1.0" +pygments = ">=2.16,<3.0" +pymdown-extensions = ">=10.2,<11.0" +regex = ">=2022.4" +requests = ">=2.26,<3.0" + +[package.extras] +git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2,<2.0)"] +imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=9.4,<10.0)"] +recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"] [[package]] name = "mkdocs-material-extensions" -version = "1.1.1" +version = "1.3" description = "Extension pack for Python Markdown and MkDocs Material." optional = false -python-versions = ">=3.7" -files = [ - {file = "mkdocs_material_extensions-1.1.1-py3-none-any.whl", hash = "sha256:e41d9f38e4798b6617ad98ca8f7f1157b1e4385ac1459ca1e4ea219b556df945"}, - {file = "mkdocs_material_extensions-1.1.1.tar.gz", hash = "sha256:9c003da71e2cc2493d910237448c672e00cefc800d3d6ae93d2fc69979e3bd93"}, -] - -[[package]] -name = "mkdocs-minify-plugin" -version = "0.5.0" -description = "An MkDocs plugin to minify HTML, JS or CSS files prior to being written to disk" -optional = false -python-versions = ">=3.0" +python-versions = ">=3.8" files = [ - {file = "mkdocs-minify-plugin-0.5.0.tar.gz", hash = "sha256:32d9e8fbd89327a0f4f648f517297aad344c1bad64cfde110d059bd2f2780a6d"}, - {file = "mkdocs_minify_plugin-0.5.0-py2-none-any.whl", hash = "sha256:487c31ae6b8b3230f56910ce6bcf5c7e6ad9a8c4f51c720a4b989f30c2b0233f"}, + {file = "mkdocs_material_extensions-1.3-py3-none-any.whl", hash = "sha256:0297cc48ba68a9fdd1ef3780a3b41b534b0d0df1d1181a44676fda5f464eeadc"}, + {file = "mkdocs_material_extensions-1.3.tar.gz", hash = "sha256:f0446091503acb110a7cab9349cbc90eeac51b58d1caa92a704a81ca1e24ddbd"}, ] -[package.dependencies] -csscompressor = ">=0.9.5" -htmlmin = ">=0.1.4" -jsmin = ">=3.0.0" -mkdocs = ">=1.0.4" - [[package]] name = "mkdocs-section-index" -version = "0.3.5" +version = "0.3.8" description = "MkDocs plugin to allow clickable sections that lead to an index page" optional = false python-versions = ">=3.7" files = [ - {file = "mkdocs_section_index-0.3.5-py3-none-any.whl", hash = "sha256:1f6359287b0a823d6297cf1cb6c0a49ed75851d0d1cea8b425b207a45ce10141"}, - {file = "mkdocs_section_index-0.3.5.tar.gz", hash = "sha256:fa8b1ce0649326b1873c6460c1df2bb0c4825fd21e3dd416f13ec212d31edf12"}, + {file = "mkdocs_section_index-0.3.8-py3-none-any.whl", hash = "sha256:823d298d78bc1e73e23678ff60889f3c369c2167b03dba73fea88bd0e268a60d"}, + {file = "mkdocs_section_index-0.3.8.tar.gz", hash = "sha256:bbd209f0da79441baf136ef3a9c40665bb9681d1fb62c73ca2f116fd1388a404"}, ] [package.dependencies] -mkdocs = ">=1.0.3" +mkdocs = ">=1.2" [[package]] name = "mkdocstrings" -version = "0.21.2" +version = "0.23.0" description = "Automatic documentation from sources, for MkDocs." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mkdocstrings-0.21.2-py3-none-any.whl", hash = "sha256:949ef8da92df9d692ca07be50616459a6b536083a25520fd54b00e8814ce019b"}, - {file = "mkdocstrings-0.21.2.tar.gz", hash = "sha256:304e56a2e90595708a38a13a278e538a67ad82052dd5c8b71f77a604a4f3d911"}, + {file = "mkdocstrings-0.23.0-py3-none-any.whl", hash = "sha256:051fa4014dfcd9ed90254ae91de2dbb4f24e166347dae7be9a997fe16316c65e"}, + {file = "mkdocstrings-0.23.0.tar.gz", hash = "sha256:d9c6a37ffbe7c14a7a54ef1258c70b8d394e6a33a1c80832bce40b9567138d1c"}, ] [package.dependencies] @@ -4520,32 +4921,32 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] [[package]] name = "mkdocstrings-python" -version = "0.7.1" +version = "1.7.5" description = "A Python handler for mkdocstrings." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mkdocstrings-python-0.7.1.tar.gz", hash = "sha256:c334b382dca202dfa37071c182418a6df5818356a95d54362a2b24822ca3af71"}, - {file = "mkdocstrings_python-0.7.1-py3-none-any.whl", hash = "sha256:a22060bfa374697678e9af4e62b020d990dad2711c98f7a9fac5c0345bef93c7"}, + {file = "mkdocstrings_python-1.7.5-py3-none-any.whl", hash = "sha256:5f6246026353f0c0785135db70c3fe9a5d9318990fc7ceb11d62097b8ffdd704"}, + {file = "mkdocstrings_python-1.7.5.tar.gz", hash = "sha256:c7d143728257dbf1aa550446555a554b760dcd40a763f077189d298502b800be"}, ] [package.dependencies] -griffe = ">=0.11.1" -mkdocstrings = ">=0.19" +griffe = ">=0.37" +mkdocstrings = ">=0.20" [[package]] name = "msal" -version = "1.22.0" -description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect." +version = "1.24.1" +description = "The Microsoft Authentication Library (MSAL) for Python library" optional = false -python-versions = "*" +python-versions = ">=2.7" files = [ - {file = "msal-1.22.0-py2.py3-none-any.whl", hash = "sha256:9120b7eafdf061c92f7b3d744e5f325fca35873445fa8ffebb40b1086a13dd58"}, - {file = "msal-1.22.0.tar.gz", hash = "sha256:8a82f5375642c1625c89058018430294c109440dce42ea667d466c2cab520acd"}, + {file = "msal-1.24.1-py2.py3-none-any.whl", hash = "sha256:ce4320688f95c301ee74a4d0e9dbcfe029a63663a8cc61756f40d0d0d36574ad"}, + {file = "msal-1.24.1.tar.gz", hash = "sha256:aa0972884b3c6fdec53d9a0bd15c12e5bd7b71ac1b66d746f54d128709f3f8f8"}, ] [package.dependencies] -cryptography = ">=0.6,<43" +cryptography = ">=0.6,<44" PyJWT = {version = ">=1.0.0,<3", extras = ["crypto"]} requests = ">=2.0.0,<3" @@ -4570,6 +4971,27 @@ portalocker = [ {version = ">=1.6,<3", markers = "python_version >= \"3.5\" and platform_system == \"Windows\""}, ] +[[package]] +name = "msrest" +version = "0.7.1" +description = "AutoRest swagger generator Python client runtime." +optional = false +python-versions = ">=3.6" +files = [ + {file = "msrest-0.7.1-py3-none-any.whl", hash = "sha256:21120a810e1233e5e6cc7fe40b474eeb4ec6f757a15d7cf86702c369f9567c32"}, + {file = "msrest-0.7.1.zip", hash = "sha256:6e7661f46f3afd88b75667b7187a92829924446c7ea1d169be8c4bb7eeb788b9"}, +] + +[package.dependencies] +azure-core = ">=1.24.0" +certifi = ">=2017.4.17" +isodate = ">=0.6.0" +requests = ">=2.16,<3.0" +requests-oauthlib = ">=0.5.0" + +[package.extras] +async = ["aiodns", "aiohttp (>=3.0)"] + [[package]] name = "multidict" version = "6.0.4" @@ -4655,44 +5077,49 @@ files = [ [[package]] name = "mypy" -version = "0.971" +version = "1.8.0" description = "Optional static typing for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "mypy-0.971-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f2899a3cbd394da157194f913a931edfd4be5f274a88041c9dc2d9cdcb1c315c"}, - {file = "mypy-0.971-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:98e02d56ebe93981c41211c05adb630d1d26c14195d04d95e49cd97dbc046dc5"}, - {file = "mypy-0.971-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:19830b7dba7d5356d3e26e2427a2ec91c994cd92d983142cbd025ebe81d69cf3"}, - {file = "mypy-0.971-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:02ef476f6dcb86e6f502ae39a16b93285fef97e7f1ff22932b657d1ef1f28655"}, - {file = "mypy-0.971-cp310-cp310-win_amd64.whl", hash = "sha256:25c5750ba5609a0c7550b73a33deb314ecfb559c350bb050b655505e8aed4103"}, - {file = "mypy-0.971-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d3348e7eb2eea2472db611486846742d5d52d1290576de99d59edeb7cd4a42ca"}, - {file = "mypy-0.971-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3fa7a477b9900be9b7dd4bab30a12759e5abe9586574ceb944bc29cddf8f0417"}, - {file = "mypy-0.971-cp36-cp36m-win_amd64.whl", hash = "sha256:2ad53cf9c3adc43cf3bea0a7d01a2f2e86db9fe7596dfecb4496a5dda63cbb09"}, - {file = "mypy-0.971-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:855048b6feb6dfe09d3353466004490b1872887150c5bb5caad7838b57328cc8"}, - {file = "mypy-0.971-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:23488a14a83bca6e54402c2e6435467a4138785df93ec85aeff64c6170077fb0"}, - {file = "mypy-0.971-cp37-cp37m-win_amd64.whl", hash = "sha256:4b21e5b1a70dfb972490035128f305c39bc4bc253f34e96a4adf9127cf943eb2"}, - {file = "mypy-0.971-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9796a2ba7b4b538649caa5cecd398d873f4022ed2333ffde58eaf604c4d2cb27"}, - {file = "mypy-0.971-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a361d92635ad4ada1b1b2d3630fc2f53f2127d51cf2def9db83cba32e47c856"}, - {file = "mypy-0.971-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b793b899f7cf563b1e7044a5c97361196b938e92f0a4343a5d27966a53d2ec71"}, - {file = "mypy-0.971-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d1ea5d12c8e2d266b5fb8c7a5d2e9c0219fedfeb493b7ed60cd350322384ac27"}, - {file = "mypy-0.971-cp38-cp38-win_amd64.whl", hash = "sha256:23c7ff43fff4b0df93a186581885c8512bc50fc4d4910e0f838e35d6bb6b5e58"}, - {file = "mypy-0.971-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1f7656b69974a6933e987ee8ffb951d836272d6c0f81d727f1d0e2696074d9e6"}, - {file = "mypy-0.971-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d2022bfadb7a5c2ef410d6a7c9763188afdb7f3533f22a0a32be10d571ee4bbe"}, - {file = "mypy-0.971-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef943c72a786b0f8d90fd76e9b39ce81fb7171172daf84bf43eaf937e9f220a9"}, - {file = "mypy-0.971-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d744f72eb39f69312bc6c2abf8ff6656973120e2eb3f3ec4f758ed47e414a4bf"}, - {file = "mypy-0.971-cp39-cp39-win_amd64.whl", hash = "sha256:77a514ea15d3007d33a9e2157b0ba9c267496acf12a7f2b9b9f8446337aac5b0"}, - {file = "mypy-0.971-py3-none-any.whl", hash = "sha256:0d054ef16b071149917085f51f89555a576e2618d5d9dd70bd6eea6410af3ac9"}, - {file = "mypy-0.971.tar.gz", hash = "sha256:40b0f21484238269ae6a57200c807d80debc6459d444c0489a102d7c6a75fa56"}, -] - -[package.dependencies] -mypy-extensions = ">=0.4.3" + {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"}, + {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"}, + {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"}, + {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"}, + {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"}, + {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"}, + {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"}, + {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"}, + {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"}, + {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"}, + {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"}, + {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"}, + {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"}, + {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"}, + {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"}, + {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"}, + {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"}, + {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"}, + {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=3.10" +typing-extensions = ">=4.1.0" [package.extras] dmypy = ["psutil (>=4.0)"] -python2 = ["typed-ast (>=1.4.0,<2)"] +install-types = ["pip"] +mypyc = ["setuptools (>=50)"] reports = ["lxml"] [[package]] @@ -4708,13 +5135,13 @@ files = [ [[package]] name = "natsort" -version = "8.3.1" +version = "8.4.0" description = "Simple yet flexible natural sorting in Python." optional = false python-versions = ">=3.7" files = [ - {file = "natsort-8.3.1-py3-none-any.whl", hash = "sha256:d583bc9050dd10538de36297c960b93f873f0cd01671a3c50df5bd86dd391dcb"}, - {file = "natsort-8.3.1.tar.gz", hash = "sha256:517595492dde570a4fd6b6a76f644440c1ba51e2338c8a671d7f0475fda8f9fd"}, + {file = "natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c"}, + {file = "natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581"}, ] [package.extras] @@ -4723,24 +5150,24 @@ icu = ["PyICU (>=1.0.0)"] [[package]] name = "nest-asyncio" -version = "1.5.6" +version = "1.5.8" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" files = [ - {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, - {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, + {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"}, + {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"}, ] [[package]] name = "nodeenv" -version = "1.7.0" +version = "1.8.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"}, + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, ] [package.dependencies] @@ -4748,39 +5175,47 @@ setuptools = "*" [[package]] name = "numpy" -version = "1.24.2" +version = "1.26.2" description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.8" -files = [ - {file = "numpy-1.24.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eef70b4fc1e872ebddc38cddacc87c19a3709c0e3e5d20bf3954c147b1dd941d"}, - {file = "numpy-1.24.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8d2859428712785e8a8b7d2b3ef0a1d1565892367b32f915c4a4df44d0e64f5"}, - {file = "numpy-1.24.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6524630f71631be2dabe0c541e7675db82651eb998496bbe16bc4f77f0772253"}, - {file = "numpy-1.24.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a51725a815a6188c662fb66fb32077709a9ca38053f0274640293a14fdd22978"}, - {file = "numpy-1.24.2-cp310-cp310-win32.whl", hash = "sha256:2620e8592136e073bd12ee4536149380695fbe9ebeae845b81237f986479ffc9"}, - {file = "numpy-1.24.2-cp310-cp310-win_amd64.whl", hash = "sha256:97cf27e51fa078078c649a51d7ade3c92d9e709ba2bfb97493007103c741f1d0"}, - {file = "numpy-1.24.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7de8fdde0003f4294655aa5d5f0a89c26b9f22c0a58790c38fae1ed392d44a5a"}, - {file = "numpy-1.24.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4173bde9fa2a005c2c6e2ea8ac1618e2ed2c1c6ec8a7657237854d42094123a0"}, - {file = "numpy-1.24.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cecaed30dc14123020f77b03601559fff3e6cd0c048f8b5289f4eeabb0eb281"}, - {file = "numpy-1.24.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a23f8440561a633204a67fb44617ce2a299beecf3295f0d13c495518908e910"}, - {file = "numpy-1.24.2-cp311-cp311-win32.whl", hash = "sha256:e428c4fbfa085f947b536706a2fc349245d7baa8334f0c5723c56a10595f9b95"}, - {file = "numpy-1.24.2-cp311-cp311-win_amd64.whl", hash = "sha256:557d42778a6869c2162deb40ad82612645e21d79e11c1dc62c6e82a2220ffb04"}, - {file = "numpy-1.24.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d0a2db9d20117bf523dde15858398e7c0858aadca7c0f088ac0d6edd360e9ad2"}, - {file = "numpy-1.24.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c72a6b2f4af1adfe193f7beb91ddf708ff867a3f977ef2ec53c0ffb8283ab9f5"}, - {file = "numpy-1.24.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c29e6bd0ec49a44d7690ecb623a8eac5ab8a923bce0bea6293953992edf3a76a"}, - {file = "numpy-1.24.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2eabd64ddb96a1239791da78fa5f4e1693ae2dadc82a76bc76a14cbb2b966e96"}, - {file = "numpy-1.24.2-cp38-cp38-win32.whl", hash = "sha256:e3ab5d32784e843fc0dd3ab6dcafc67ef806e6b6828dc6af2f689be0eb4d781d"}, - {file = "numpy-1.24.2-cp38-cp38-win_amd64.whl", hash = "sha256:76807b4063f0002c8532cfeac47a3068a69561e9c8715efdad3c642eb27c0756"}, - {file = "numpy-1.24.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4199e7cfc307a778f72d293372736223e39ec9ac096ff0a2e64853b866a8e18a"}, - {file = "numpy-1.24.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:adbdce121896fd3a17a77ab0b0b5eedf05a9834a18699db6829a64e1dfccca7f"}, - {file = "numpy-1.24.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:889b2cc88b837d86eda1b17008ebeb679d82875022200c6e8e4ce6cf549b7acb"}, - {file = "numpy-1.24.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f64bb98ac59b3ea3bf74b02f13836eb2e24e48e0ab0145bbda646295769bd780"}, - {file = "numpy-1.24.2-cp39-cp39-win32.whl", hash = "sha256:63e45511ee4d9d976637d11e6c9864eae50e12dc9598f531c035265991910468"}, - {file = "numpy-1.24.2-cp39-cp39-win_amd64.whl", hash = "sha256:a77d3e1163a7770164404607b7ba3967fb49b24782a6ef85d9b5f54126cc39e5"}, - {file = "numpy-1.24.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:92011118955724465fb6853def593cf397b4a1367495e0b59a7e69d40c4eb71d"}, - {file = "numpy-1.24.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9006288bcf4895917d02583cf3411f98631275bc67cce355a7f39f8c14338fa"}, - {file = "numpy-1.24.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:150947adbdfeceec4e5926d956a06865c1c690f2fd902efede4ca6fe2e657c3f"}, - {file = "numpy-1.24.2.tar.gz", hash = "sha256:003a9f530e880cb2cd177cba1af7220b9aa42def9c4afc2a2fc3ee6be7eb2b22"}, +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f"}, + {file = "numpy-1.26.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440"}, + {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75"}, + {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00"}, + {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe"}, + {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523"}, + {file = "numpy-1.26.2-cp310-cp310-win32.whl", hash = "sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9"}, + {file = "numpy-1.26.2-cp310-cp310-win_amd64.whl", hash = "sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919"}, + {file = "numpy-1.26.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841"}, + {file = "numpy-1.26.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1"}, + {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a"}, + {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b"}, + {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7"}, + {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8"}, + {file = "numpy-1.26.2-cp311-cp311-win32.whl", hash = "sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186"}, + {file = "numpy-1.26.2-cp311-cp311-win_amd64.whl", hash = "sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d"}, + {file = "numpy-1.26.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0"}, + {file = "numpy-1.26.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75"}, + {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7"}, + {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6"}, + {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6"}, + {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec"}, + {file = "numpy-1.26.2-cp312-cp312-win32.whl", hash = "sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167"}, + {file = "numpy-1.26.2-cp312-cp312-win_amd64.whl", hash = "sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e"}, + {file = "numpy-1.26.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef"}, + {file = "numpy-1.26.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2"}, + {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3"}, + {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818"}, + {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210"}, + {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36"}, + {file = "numpy-1.26.2-cp39-cp39-win32.whl", hash = "sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80"}, + {file = "numpy-1.26.2-cp39-cp39-win_amd64.whl", hash = "sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841"}, + {file = "numpy-1.26.2.tar.gz", hash = "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea"}, ] [[package]] @@ -4816,73 +5251,92 @@ PyYAML = ">=5.1.0" [[package]] name = "opentelemetry-api" -version = "1.15.0" +version = "1.20.0" description = "OpenTelemetry Python API" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_api-1.15.0-py3-none-any.whl", hash = "sha256:e6c2d2e42140fd396e96edf75a7ceb11073f4efb4db87565a431cc9d0f93f2e0"}, - {file = "opentelemetry_api-1.15.0.tar.gz", hash = "sha256:79ab791b4aaad27acc3dc3ba01596db5b5aac2ef75c70622c6038051d6c2cded"}, + {file = "opentelemetry_api-1.20.0-py3-none-any.whl", hash = "sha256:982b76036fec0fdaf490ae3dfd9f28c81442a33414f737abc687a32758cdcba5"}, + {file = "opentelemetry_api-1.20.0.tar.gz", hash = "sha256:06abe351db7572f8afdd0fb889ce53f3c992dbf6f6262507b385cc1963e06983"}, ] [package.dependencies] deprecated = ">=1.2.6" -setuptools = ">=16.0" +importlib-metadata = ">=6.0,<7.0" [[package]] name = "opentelemetry-exporter-otlp" -version = "1.15.0" +version = "1.20.0" description = "OpenTelemetry Collector Exporters" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_exporter_otlp-1.15.0-py3-none-any.whl", hash = "sha256:79f22748b6a54808a0448093dfa189c8490e729f67c134d4c992533d9393b33e"}, - {file = "opentelemetry_exporter_otlp-1.15.0.tar.gz", hash = "sha256:4f7c49751d9720e2e726e13b0bb958ccade4e29122c305d92c033da432c8d2c5"}, + {file = "opentelemetry_exporter_otlp-1.20.0-py3-none-any.whl", hash = "sha256:3b4d47726da83fef84467bdf96da4f8f3d1a61b35db3c16354c391ce8e9decf6"}, + {file = "opentelemetry_exporter_otlp-1.20.0.tar.gz", hash = "sha256:f8cb69f80c333166e5cfaa030f9e28f7faaf343aff24caaa2cb4202ea4849b6b"}, +] + +[package.dependencies] +opentelemetry-exporter-otlp-proto-grpc = "1.20.0" +opentelemetry-exporter-otlp-proto-http = "1.20.0" + +[[package]] +name = "opentelemetry-exporter-otlp-proto-common" +version = "1.20.0" +description = "OpenTelemetry Protobuf encoding" +optional = false +python-versions = ">=3.7" +files = [ + {file = "opentelemetry_exporter_otlp_proto_common-1.20.0-py3-none-any.whl", hash = "sha256:dd63209b40702636ab6ae76a06b401b646ad7b008a906ecb41222d4af24fbdef"}, + {file = "opentelemetry_exporter_otlp_proto_common-1.20.0.tar.gz", hash = "sha256:df60c681bd61812e50b3a39a7a1afeeb6d4066117583249fcc262269374e7a49"}, ] [package.dependencies] -opentelemetry-exporter-otlp-proto-grpc = "1.15.0" -opentelemetry-exporter-otlp-proto-http = "1.15.0" +backoff = {version = ">=1.10.0,<3.0.0", markers = "python_version >= \"3.7\""} +opentelemetry-proto = "1.20.0" [[package]] name = "opentelemetry-exporter-otlp-proto-grpc" -version = "1.15.0" +version = "1.20.0" description = "OpenTelemetry Collector Protobuf over gRPC Exporter" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_exporter_otlp_proto_grpc-1.15.0-py3-none-any.whl", hash = "sha256:c2a5492ba7d140109968135d641d06ce3c5bd73c50665f787526065d57d7fd1d"}, - {file = "opentelemetry_exporter_otlp_proto_grpc-1.15.0.tar.gz", hash = "sha256:844f2a4bb9bcda34e4eb6fe36765e5031aacb36dc60ed88c90fc246942ea26e7"}, + {file = "opentelemetry_exporter_otlp_proto_grpc-1.20.0-py3-none-any.whl", hash = "sha256:7c3f066065891b56348ba2c7f9df6ec635a712841cae0a36f2f6a81642ae7dec"}, + {file = "opentelemetry_exporter_otlp_proto_grpc-1.20.0.tar.gz", hash = "sha256:6c06d43c3771bda1795226e327722b4b980fa1ca1ec9e985f2ef3e29795bdd52"}, ] [package.dependencies] backoff = {version = ">=1.10.0,<3.0.0", markers = "python_version >= \"3.7\""} +deprecated = ">=1.2.6" googleapis-common-protos = ">=1.52,<2.0" grpcio = ">=1.0.0,<2.0.0" -opentelemetry-api = ">=1.12,<2.0" -opentelemetry-proto = "1.15.0" -opentelemetry-sdk = ">=1.12,<2.0" +opentelemetry-api = ">=1.15,<2.0" +opentelemetry-exporter-otlp-proto-common = "1.20.0" +opentelemetry-proto = "1.20.0" +opentelemetry-sdk = ">=1.20.0,<1.21.0" [package.extras] test = ["pytest-grpc"] [[package]] name = "opentelemetry-exporter-otlp-proto-http" -version = "1.15.0" +version = "1.20.0" description = "OpenTelemetry Collector Protobuf over HTTP Exporter" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_exporter_otlp_proto_http-1.15.0-py3-none-any.whl", hash = "sha256:3ec2a02196c8a54bf5cbf7fe623a5238625638e83b6047a983bdf96e2bbb74c0"}, - {file = "opentelemetry_exporter_otlp_proto_http-1.15.0.tar.gz", hash = "sha256:11b2c814249a49b22f6cca7a06b05701f561d577b747f3660dfd67b6eb9daf9c"}, + {file = "opentelemetry_exporter_otlp_proto_http-1.20.0-py3-none-any.whl", hash = "sha256:03f6e768ad25f1c3a9586e8c695db4a4adf978f8546a1285fa962e16bfbb0bd6"}, + {file = "opentelemetry_exporter_otlp_proto_http-1.20.0.tar.gz", hash = "sha256:500f42821420fdf0759193d6438edc0f4e984a83e14c08a23023c06a188861b4"}, ] [package.dependencies] backoff = {version = ">=1.10.0,<3.0.0", markers = "python_version >= \"3.7\""} +deprecated = ">=1.2.6" googleapis-common-protos = ">=1.52,<2.0" -opentelemetry-api = ">=1.12,<2.0" -opentelemetry-proto = "1.15.0" -opentelemetry-sdk = ">=1.12,<2.0" +opentelemetry-api = ">=1.15,<2.0" +opentelemetry-exporter-otlp-proto-common = "1.20.0" +opentelemetry-proto = "1.20.0" +opentelemetry-sdk = ">=1.20.0,<1.21.0" requests = ">=2.7,<3.0" [package.extras] @@ -4890,13 +5344,13 @@ test = ["responses (==0.22.0)"] [[package]] name = "opentelemetry-proto" -version = "1.15.0" +version = "1.20.0" description = "OpenTelemetry Python Proto" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_proto-1.15.0-py3-none-any.whl", hash = "sha256:044b6d044b4d10530f250856f933442b8753a17f94ae37c207607f733fb9a844"}, - {file = "opentelemetry_proto-1.15.0.tar.gz", hash = "sha256:9c4008e40ac8cab359daac283fbe7002c5c29c77ea2674ad5626a249e64e0101"}, + {file = "opentelemetry_proto-1.20.0-py3-none-any.whl", hash = "sha256:512c3d2c6864fb7547a69577c3907348e6c985b7a204533563cb4c4c5046203b"}, + {file = "opentelemetry_proto-1.20.0.tar.gz", hash = "sha256:cf01f49b3072ee57468bccb1a4f93bdb55411f4512d0ac3f97c5c04c0040b5a2"}, ] [package.dependencies] @@ -4904,30 +5358,29 @@ protobuf = ">=3.19,<5.0" [[package]] name = "opentelemetry-sdk" -version = "1.15.0" +version = "1.20.0" description = "OpenTelemetry Python SDK" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_sdk-1.15.0-py3-none-any.whl", hash = "sha256:555c533e9837766119bbccc7a80458c9971d853a6f1da683a2246cd5e53b4645"}, - {file = "opentelemetry_sdk-1.15.0.tar.gz", hash = "sha256:98dbffcfeebcbff12c0c974292d6ea603180a145904cf838b1fe4d5c99078425"}, + {file = "opentelemetry_sdk-1.20.0-py3-none-any.whl", hash = "sha256:f2230c276ff4c63ea09b3cb2e2ac6b1265f90af64e8d16bbf275c81a9ce8e804"}, + {file = "opentelemetry_sdk-1.20.0.tar.gz", hash = "sha256:702e432a457fa717fd2ddfd30640180e69938f85bb7fec3e479f85f61c1843f8"}, ] [package.dependencies] -opentelemetry-api = "1.15.0" -opentelemetry-semantic-conventions = "0.36b0" -setuptools = ">=16.0" +opentelemetry-api = "1.20.0" +opentelemetry-semantic-conventions = "0.41b0" typing-extensions = ">=3.7.4" [[package]] name = "opentelemetry-semantic-conventions" -version = "0.36b0" +version = "0.41b0" description = "OpenTelemetry Semantic Conventions" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_semantic_conventions-0.36b0-py3-none-any.whl", hash = "sha256:adc05635e87b9d3e007c9f530eed487fc3ef2177d02f82f674f28ebf9aff8243"}, - {file = "opentelemetry_semantic_conventions-0.36b0.tar.gz", hash = "sha256:829dc221795467d98b773c04096e29be038d77526dc8d6ac76f546fb6279bf01"}, + {file = "opentelemetry_semantic_conventions-0.41b0-py3-none-any.whl", hash = "sha256:45404391ed9e50998183a4925ad1b497c01c143f06500c3b9c3d0013492bb0f2"}, + {file = "opentelemetry_semantic_conventions-0.41b0.tar.gz", hash = "sha256:0ce5b040b8a3fc816ea5879a743b3d6fe5db61f6485e4def94c6ee4d402e1eb7"}, ] [[package]] @@ -4946,126 +5399,147 @@ dev = ["black", "mypy", "pytest"] [[package]] name = "orjson" -version = "3.8.10" +version = "3.9.10" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false -python-versions = ">= 3.7" +python-versions = ">=3.8" files = [ - {file = "orjson-3.8.10-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:4dfe0651e26492d5d929bbf4322de9afbd1c51ac2e3947a7f78492b20359711d"}, - {file = "orjson-3.8.10-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:bc30de5c7b3a402eb59cc0656b8ee53ca36322fc52ab67739c92635174f88336"}, - {file = "orjson-3.8.10-cp310-cp310-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:2a7879767dac03ab56849716bddb1a931be9051a4232cf9c73279fb8d187fa57"}, - {file = "orjson-3.8.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c08b426fae7b9577b528f99af0f7e0ff3ce46858dd9a7d1bf86d30f18df89a4c"}, - {file = "orjson-3.8.10-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bce970f293825e008dbf739268dfa41dfe583aa2a1b5ef4efe53a0e92e9671ea"}, - {file = "orjson-3.8.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9b23fb0264bbdd7218aa685cb6fc71f0dcecf34182f0a8596a3a0dff010c06f9"}, - {file = "orjson-3.8.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0826ad2dc1cea1547edff14ce580374f0061d853cbac088c71162dbfe2e52205"}, - {file = "orjson-3.8.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7bce6e61cea6426309259b04c6ee2295b3f823ea51a033749459fe2dd0423b2"}, - {file = "orjson-3.8.10-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0b470d31244a6f647e5402aac7d2abaf7bb4f52379acf67722a09d35a45c9417"}, - {file = "orjson-3.8.10-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:48824649019a25d3e52f6454435cf19fe1eb3d05ee697e65d257f58ae3aa94d9"}, - {file = "orjson-3.8.10-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:faee89e885796a9cc493c930013fa5cfcec9bfaee431ddf00f0fbfb57166a8b3"}, - {file = "orjson-3.8.10-cp310-none-win_amd64.whl", hash = "sha256:3cfe32b1227fe029a5ad989fbec0b453a34e5e6d9a977723f7c3046d062d3537"}, - {file = "orjson-3.8.10-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:2073b62822738d6740bd2492f6035af5c2fd34aa198322b803dc0e70559a17b7"}, - {file = "orjson-3.8.10-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:b2c4faf20b6bb5a2d7ac0c16f58eb1a3800abcef188c011296d1dc2bb2224d48"}, - {file = "orjson-3.8.10-cp311-cp311-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:887788c0d96d3dd402c0c8911277a5d81000d234942b63737dffe7b6ae02d3a4"}, - {file = "orjson-3.8.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c1825997232a324911d11c75d91e1e0338c7b723c149cf53a5fc24496c048a4"}, - {file = "orjson-3.8.10-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f7e85d4682f3ed7321d36846cad0503e944ea9579ef435d4c162e1b73ead8ac9"}, - {file = "orjson-3.8.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b8cdaacecb92997916603ab232bb096d0fa9e56b418ca956b9754187d65ca06"}, - {file = "orjson-3.8.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ddabc5e44702d13137949adee3c60b7091e73a664f6e07c7b428eebb2dea7bbf"}, - {file = "orjson-3.8.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27bb26e171e9cfdbec39c7ca4739b6bef8bd06c293d56d92d5e3a3fc017df17d"}, - {file = "orjson-3.8.10-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1810e5446fe68d61732e9743592da0ec807e63972eef076d09e02878c2f5958e"}, - {file = "orjson-3.8.10-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:61e2e51cefe7ef90c4fbbc9fd38ecc091575a3ea7751d56fad95cbebeae2a054"}, - {file = "orjson-3.8.10-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f3e9ac9483c2b4cd794e760316966b7bd1e6afb52b0218f068a4e80c9b2db4f6"}, - {file = "orjson-3.8.10-cp311-none-win_amd64.whl", hash = "sha256:26aee557cf8c93b2a971b5a4a8e3cca19780573531493ce6573aa1002f5c4378"}, - {file = "orjson-3.8.10-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:11ae68f995a50724032af297c92f20bcde31005e0bf3653b12bff9356394615b"}, - {file = "orjson-3.8.10-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:35d879b46b8029e1e01e9f6067928b470a4efa1ca749b6d053232b873c2dcf66"}, - {file = "orjson-3.8.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:345e41abd1d9e3ecfb554e1e75ff818cf42e268bd06ad25a96c34e00f73a327e"}, - {file = "orjson-3.8.10-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:45a5afc9cda6b8aac066dd50d8194432fbc33e71f7164f95402999b725232d78"}, - {file = "orjson-3.8.10-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad632dc330a7b39da42530c8d146f76f727d476c01b719dc6743c2b5701aaf6b"}, - {file = "orjson-3.8.10-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4bf2556ba99292c4dc550560384dd22e88b5cdbe6d98fb4e202e902b5775cf9f"}, - {file = "orjson-3.8.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b88afd662190f19c3bb5036a903589f88b1d2c2608fbb97281ce000db6b08897"}, - {file = "orjson-3.8.10-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:abce8d319aae800fd2d774db1106f926dee0e8a5ca85998fd76391fcb58ef94f"}, - {file = "orjson-3.8.10-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e999abca892accada083f7079612307d94dd14cc105a699588a324f843216509"}, - {file = "orjson-3.8.10-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a3fdee68c4bb3c5d6f89ed4560f1384b5d6260e48fbf868bae1a245a3c693d4d"}, - {file = "orjson-3.8.10-cp37-none-win_amd64.whl", hash = "sha256:e5d7f82506212e047b184c06e4bcd48c1483e101969013623cebcf51cf12cad9"}, - {file = "orjson-3.8.10-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:d953e6c2087dcd990e794f8405011369ee11cf13e9aaae3172ee762ee63947f2"}, - {file = "orjson-3.8.10-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:81aa3f321d201bff0bd0f4014ea44e51d58a9a02d8f2b0eeab2cee22611be8e1"}, - {file = "orjson-3.8.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d27b6182f75896dd8c10ea0f78b9265a3454be72d00632b97f84d7031900dd4"}, - {file = "orjson-3.8.10-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1486600bc1dd1db26c588dd482689edba3d72d301accbe4301db4b2b28bd7aa4"}, - {file = "orjson-3.8.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:344ea91c556a2ce6423dc13401b83ab0392aa697a97fa4142c2c63a6fd0bbfef"}, - {file = "orjson-3.8.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:979f231e3bad1c835627eef1a30db12a8af58bfb475a6758868ea7e81897211f"}, - {file = "orjson-3.8.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fa3a26dcf0f5f2912a8ce8e87273e68b2a9526854d19fd09ea671b154418e88"}, - {file = "orjson-3.8.10-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:b6e79d8864794635974b18821b49a7f27859d17b93413d4603efadf2e92da7a5"}, - {file = "orjson-3.8.10-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ce49999bcbbc14791c61844bc8a69af44f5205d219be540e074660038adae6bf"}, - {file = "orjson-3.8.10-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c2ef690335b24f9272dbf6639353c1ffc3f196623a92b851063e28e9515cf7dd"}, - {file = "orjson-3.8.10-cp38-none-win_amd64.whl", hash = "sha256:5a0b1f4e4fa75e26f814161196e365fc0e1a16e3c07428154505b680a17df02f"}, - {file = "orjson-3.8.10-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:af7601a78b99f0515af2f8ab12c955c0072ffcc1e437fb2556f4465783a4d813"}, - {file = "orjson-3.8.10-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:6bbd7b3a3e2030b03c68c4d4b19a2ef5b89081cbb43c05fe2010767ef5e408db"}, - {file = "orjson-3.8.10-cp39-cp39-macosx_11_0_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:3775b01c1a04d07fd9201eac68e83d55542282c6fcb6bbe88b90450254373950"}, - {file = "orjson-3.8.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4355c9aedfefe60904e8bd7901315ebbc8bb828f665e4c9bc94b1432e67cb6f7"}, - {file = "orjson-3.8.10-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b7b0ba074375e25c1594e770e2215941e2017c3cd121889150737fa1123e8bfe"}, - {file = "orjson-3.8.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34b6901c110c06ab9e8d7d0496db4bc9a0c162ca8d77f67539d22cb39e0a1ef4"}, - {file = "orjson-3.8.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cb62ec16a1c26ad9487727b529103cb6a94a1d4969d5b32dd0eab5c3f4f5a6f2"}, - {file = "orjson-3.8.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:595e1e7d04aaaa3d41113e4eb9f765ab642173c4001182684ae9ddc621bb11c8"}, - {file = "orjson-3.8.10-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:64ffd92328473a2f9af059410bd10c703206a4bbc7b70abb1bedcd8761e39eb8"}, - {file = "orjson-3.8.10-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b1f648ec89c6a426098868460c0ef8c86b457ce1378d7569ff4acb6c0c454048"}, - {file = "orjson-3.8.10-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6a286ad379972e4f46579e772f0477e6b505f1823aabcd64ef097dbb4549e1a4"}, - {file = "orjson-3.8.10-cp39-none-win_amd64.whl", hash = "sha256:d2874cee6856d7c386b596e50bc517d1973d73dc40b2bd6abec057b5e7c76b2f"}, - {file = "orjson-3.8.10.tar.gz", hash = "sha256:dcf6adb4471b69875034afab51a14b64f1026bc968175a2bb02c5f6b358bd413"}, + {file = "orjson-3.9.10-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c18a4da2f50050a03d1da5317388ef84a16013302a5281d6f64e4a3f406aabc4"}, + {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5148bab4d71f58948c7c39d12b14a9005b6ab35a0bdf317a8ade9a9e4d9d0bd5"}, + {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4cf7837c3b11a2dfb589f8530b3cff2bd0307ace4c301e8997e95c7468c1378e"}, + {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c62b6fa2961a1dcc51ebe88771be5319a93fd89bd247c9ddf732bc250507bc2b"}, + {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deeb3922a7a804755bbe6b5be9b312e746137a03600f488290318936c1a2d4dc"}, + {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1234dc92d011d3554d929b6cf058ac4a24d188d97be5e04355f1b9223e98bbe9"}, + {file = "orjson-3.9.10-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:06ad5543217e0e46fd7ab7ea45d506c76f878b87b1b4e369006bdb01acc05a83"}, + {file = "orjson-3.9.10-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4fd72fab7bddce46c6826994ce1e7de145ae1e9e106ebb8eb9ce1393ca01444d"}, + {file = "orjson-3.9.10-cp310-none-win32.whl", hash = "sha256:b5b7d4a44cc0e6ff98da5d56cde794385bdd212a86563ac321ca64d7f80c80d1"}, + {file = "orjson-3.9.10-cp310-none-win_amd64.whl", hash = "sha256:61804231099214e2f84998316f3238c4c2c4aaec302df12b21a64d72e2a135c7"}, + {file = "orjson-3.9.10-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cff7570d492bcf4b64cc862a6e2fb77edd5e5748ad715f487628f102815165e9"}, + {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8bc367f725dfc5cabeed1ae079d00369900231fbb5a5280cf0736c30e2adf7"}, + {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c812312847867b6335cfb264772f2a7e85b3b502d3a6b0586aa35e1858528ab1"}, + {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9edd2856611e5050004f4722922b7b1cd6268da34102667bd49d2a2b18bafb81"}, + {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:674eb520f02422546c40401f4efaf8207b5e29e420c17051cddf6c02783ff5ca"}, + {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0dc4310da8b5f6415949bd5ef937e60aeb0eb6b16f95041b5e43e6200821fb"}, + {file = "orjson-3.9.10-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e99c625b8c95d7741fe057585176b1b8783d46ed4b8932cf98ee145c4facf499"}, + {file = "orjson-3.9.10-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ec6f18f96b47299c11203edfbdc34e1b69085070d9a3d1f302810cc23ad36bf3"}, + {file = "orjson-3.9.10-cp311-none-win32.whl", hash = "sha256:ce0a29c28dfb8eccd0f16219360530bc3cfdf6bf70ca384dacd36e6c650ef8e8"}, + {file = "orjson-3.9.10-cp311-none-win_amd64.whl", hash = "sha256:cf80b550092cc480a0cbd0750e8189247ff45457e5a023305f7ef1bcec811616"}, + {file = "orjson-3.9.10-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:602a8001bdf60e1a7d544be29c82560a7b49319a0b31d62586548835bbe2c862"}, + {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f295efcd47b6124b01255d1491f9e46f17ef40d3d7eabf7364099e463fb45f0f"}, + {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92af0d00091e744587221e79f68d617b432425a7e59328ca4c496f774a356071"}, + {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5a02360e73e7208a872bf65a7554c9f15df5fe063dc047f79738998b0506a14"}, + {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:858379cbb08d84fe7583231077d9a36a1a20eb72f8c9076a45df8b083724ad1d"}, + {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666c6fdcaac1f13eb982b649e1c311c08d7097cbda24f32612dae43648d8db8d"}, + {file = "orjson-3.9.10-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3fb205ab52a2e30354640780ce4587157a9563a68c9beaf52153e1cea9aa0921"}, + {file = "orjson-3.9.10-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7ec960b1b942ee3c69323b8721df2a3ce28ff40e7ca47873ae35bfafeb4555ca"}, + {file = "orjson-3.9.10-cp312-none-win_amd64.whl", hash = "sha256:3e892621434392199efb54e69edfff9f699f6cc36dd9553c5bf796058b14b20d"}, + {file = "orjson-3.9.10-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:8b9ba0ccd5a7f4219e67fbbe25e6b4a46ceef783c42af7dbc1da548eb28b6531"}, + {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e2ecd1d349e62e3960695214f40939bbfdcaeaaa62ccc638f8e651cf0970e5f"}, + {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f433be3b3f4c66016d5a20e5b4444ef833a1f802ced13a2d852c637f69729c1"}, + {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4689270c35d4bb3102e103ac43c3f0b76b169760aff8bcf2d401a3e0e58cdb7f"}, + {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4bd176f528a8151a6efc5359b853ba3cc0e82d4cd1fab9c1300c5d957dc8f48c"}, + {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a2ce5ea4f71681623f04e2b7dadede3c7435dfb5e5e2d1d0ec25b35530e277b"}, + {file = "orjson-3.9.10-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:49f8ad582da6e8d2cf663c4ba5bf9f83cc052570a3a767487fec6af839b0e777"}, + {file = "orjson-3.9.10-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2a11b4b1a8415f105d989876a19b173f6cdc89ca13855ccc67c18efbd7cbd1f8"}, + {file = "orjson-3.9.10-cp38-none-win32.whl", hash = "sha256:a353bf1f565ed27ba71a419b2cd3db9d6151da426b61b289b6ba1422a702e643"}, + {file = "orjson-3.9.10-cp38-none-win_amd64.whl", hash = "sha256:e28a50b5be854e18d54f75ef1bb13e1abf4bc650ab9d635e4258c58e71eb6ad5"}, + {file = "orjson-3.9.10-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ee5926746232f627a3be1cc175b2cfad24d0170d520361f4ce3fa2fd83f09e1d"}, + {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a73160e823151f33cdc05fe2cea557c5ef12fdf276ce29bb4f1c571c8368a60"}, + {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c338ed69ad0b8f8f8920c13f529889fe0771abbb46550013e3c3d01e5174deef"}, + {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5869e8e130e99687d9e4be835116c4ebd83ca92e52e55810962446d841aba8de"}, + {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2c1e559d96a7f94a4f581e2a32d6d610df5840881a8cba8f25e446f4d792df3"}, + {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a3a3a72c9811b56adf8bcc829b010163bb2fc308877e50e9910c9357e78521"}, + {file = "orjson-3.9.10-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7f8fb7f5ecf4f6355683ac6881fd64b5bb2b8a60e3ccde6ff799e48791d8f864"}, + {file = "orjson-3.9.10-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c943b35ecdf7123b2d81d225397efddf0bce2e81db2f3ae633ead38e85cd5ade"}, + {file = "orjson-3.9.10-cp39-none-win32.whl", hash = "sha256:fb0b361d73f6b8eeceba47cd37070b5e6c9de5beaeaa63a1cb35c7e1a73ef088"}, + {file = "orjson-3.9.10-cp39-none-win_amd64.whl", hash = "sha256:b90f340cb6397ec7a854157fac03f0c82b744abdd1c0941a024c3c29d1340aff"}, + {file = "orjson-3.9.10.tar.gz", hash = "sha256:9ebbdbd6a046c304b1845e96fbcc5559cd296b4dfd3ad2509e33c4d9ce07d6a1"}, ] [[package]] name = "packaging" -version = "23.1" +version = "23.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "paginate" +version = "0.5.6" +description = "Divides large result sets into pages for easier browsing" +optional = false +python-versions = "*" +files = [ + {file = "paginate-0.5.6.tar.gz", hash = "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d"}, ] [[package]] name = "pandas" -version = "1.5.3" +version = "2.1.2" description = "Powerful data structures for data analysis, time series, and statistics" optional = false -python-versions = ">=3.8" -files = [ - {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, - {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, - {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, - {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"}, - {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"}, - {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"}, - {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"}, - {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"}, - {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"}, - {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"}, - {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"}, - {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"}, - {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"}, - {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"}, - {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"}, - {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"}, - {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"}, - {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"}, - {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"}, - {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"}, - {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"}, - {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"}, - {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"}, - {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"}, - {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"}, - {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, - {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, -] - -[package.dependencies] -numpy = {version = ">=1.21.0", markers = "python_version >= \"3.10\""} -python-dateutil = ">=2.8.1" +python-versions = ">=3.9" +files = [ + {file = "pandas-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:24057459f19db9ebb02984c6fdd164a970b31a95f38e4a49cf7615b36a1b532c"}, + {file = "pandas-2.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a6cf8fcc8a63d333970b950a7331a30544cf59b1a97baf0a7409e09eafc1ac38"}, + {file = "pandas-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ae6ffbd9d614c20d028c7117ee911fc4e266b4dca2065d5c5909e401f8ff683"}, + {file = "pandas-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eff794eeb7883c5aefb1ed572e7ff533ae779f6c6277849eab9e77986e352688"}, + {file = "pandas-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:02954e285e8e2f4006b6f22be6f0df1f1c3c97adbb7ed211c6b483426f20d5c8"}, + {file = "pandas-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:5b40c9f494e1f27588c369b9e4a6ca19cd924b3a0e1ef9ef1a8e30a07a438f43"}, + {file = "pandas-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:08d287b68fd28906a94564f15118a7ca8c242e50ae7f8bd91130c362b2108a81"}, + {file = "pandas-2.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bbd98dcdcd32f408947afdb3f7434fade6edd408c3077bbce7bd840d654d92c6"}, + {file = "pandas-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e90c95abb3285d06f6e4feedafc134306a8eced93cb78e08cf50e224d5ce22e2"}, + {file = "pandas-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52867d69a54e71666cd184b04e839cff7dfc8ed0cd6b936995117fdae8790b69"}, + {file = "pandas-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d0382645ede2fde352da2a885aac28ec37d38587864c0689b4b2361d17b1d4c"}, + {file = "pandas-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:65177d1c519b55e5b7f094c660ed357bb7d86e799686bb71653b8a4803d8ff0d"}, + {file = "pandas-2.1.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5aa6b86802e8cf7716bf4b4b5a3c99b12d34e9c6a9d06dad254447a620437931"}, + {file = "pandas-2.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d594e2ce51b8e0b4074e6644758865dc2bb13fd654450c1eae51201260a539f1"}, + {file = "pandas-2.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3223f997b6d2ebf9c010260cf3d889848a93f5d22bb4d14cd32638b3d8bba7ad"}, + {file = "pandas-2.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4944dc004ca6cc701dfa19afb8bdb26ad36b9bed5bcec617d2a11e9cae6902"}, + {file = "pandas-2.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3f76280ce8ec216dde336e55b2b82e883401cf466da0fe3be317c03fb8ee7c7d"}, + {file = "pandas-2.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:7ad20d24acf3a0042512b7e8d8fdc2e827126ed519d6bd1ed8e6c14ec8a2c813"}, + {file = "pandas-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:021f09c15e1381e202d95d4a21ece8e7f2bf1388b6d7e9cae09dfe27bd2043d1"}, + {file = "pandas-2.1.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7f12b2de0060b0b858cfec0016e7d980ae5bae455a1746bfcc70929100ee633"}, + {file = "pandas-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c166b9bb27c1715bed94495d9598a7f02950b4749dba9349c1dd2cbf10729d"}, + {file = "pandas-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25c9976c17311388fcd953cb3d0697999b2205333f4e11e669d90ff8d830d429"}, + {file = "pandas-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:851b5afbb0d62f6129ae891b533aa508cc357d5892c240c91933d945fff15731"}, + {file = "pandas-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:e78507adcc730533619de07bfdd1c62b2918a68cd4419ea386e28abf7f6a1e5c"}, + {file = "pandas-2.1.2.tar.gz", hash = "sha256:52897edc2774d2779fbeb6880d2cfb305daa0b1a29c16b91f531a18918a6e0f3"}, +] + +[package.dependencies] +numpy = {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""} +python-dateutil = ">=2.8.2" pytz = ">=2020.1" - -[package.extras] -test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] +tzdata = ">=2022.1" + +[package.extras] +all = ["PyQt5 (>=5.15.6)", "SQLAlchemy (>=1.4.36)", "beautifulsoup4 (>=4.11.1)", "bottleneck (>=1.3.4)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=0.8.1)", "fsspec (>=2022.05.0)", "gcsfs (>=2022.05.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.8.0)", "matplotlib (>=3.6.1)", "numba (>=0.55.2)", "numexpr (>=2.8.0)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pandas-gbq (>=0.17.5)", "psycopg2 (>=2.9.3)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.5)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "pyxlsb (>=1.0.9)", "qtpy (>=2.2.0)", "s3fs (>=2022.05.0)", "scipy (>=1.8.1)", "tables (>=3.7.0)", "tabulate (>=0.8.10)", "xarray (>=2022.03.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)", "zstandard (>=0.17.0)"] +aws = ["s3fs (>=2022.05.0)"] +clipboard = ["PyQt5 (>=5.15.6)", "qtpy (>=2.2.0)"] +compression = ["zstandard (>=0.17.0)"] +computation = ["scipy (>=1.8.1)", "xarray (>=2022.03.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pyxlsb (>=1.0.9)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2022.05.0)"] +gcp = ["gcsfs (>=2022.05.0)", "pandas-gbq (>=0.17.5)"] +hdf5 = ["tables (>=3.7.0)"] +html = ["beautifulsoup4 (>=4.11.1)", "html5lib (>=1.1)", "lxml (>=4.8.0)"] +mysql = ["SQLAlchemy (>=1.4.36)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.8.10)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.4)", "numba (>=0.55.2)", "numexpr (>=2.8.0)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.36)", "psycopg2 (>=2.9.3)"] +spss = ["pyreadstat (>=1.1.5)"] +sql-other = ["SQLAlchemy (>=1.4.36)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.8.0)"] [[package]] name = "pandas-gbq" @@ -5125,13 +5599,13 @@ testing = ["docopt", "pytest (<6.0.0)"] [[package]] name = "pathspec" -version = "0.11.1" +version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.7" files = [ - {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, - {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, ] [[package]] @@ -5197,89 +5671,66 @@ files = [ ptyprocess = ">=0.5" [[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -optional = false -python-versions = "*" -files = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] - -[[package]] -name = "Pillow" -version = "9.5.0" +name = "pillow" +version = "10.1.0" description = "Python Imaging Library (Fork)" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, - {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, - {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, - {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, - {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, - {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, - {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, - {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, - {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, - {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, - {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, - {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, - {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, - {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, - {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, - {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, - {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, + {file = "Pillow-10.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106"}, + {file = "Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818"}, + {file = "Pillow-10.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992"}, + {file = "Pillow-10.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f"}, + {file = "Pillow-10.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212"}, + {file = "Pillow-10.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2"}, + {file = "Pillow-10.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f"}, + {file = "Pillow-10.1.0.tar.gz", hash = "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38"}, ] [package.extras] @@ -5288,28 +5739,28 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa [[package]] name = "platformdirs" -version = "3.2.0" +version = "3.11.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.2.0-py3-none-any.whl", hash = "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e"}, - {file = "platformdirs-3.2.0.tar.gz", hash = "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08"}, + {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, + {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, ] [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.3)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "plotly" -version = "5.14.1" +version = "5.18.0" description = "An open-source, interactive data visualization library for Python" optional = false python-versions = ">=3.6" files = [ - {file = "plotly-5.14.1-py2.py3-none-any.whl", hash = "sha256:a63f3ad9e4cc2e02902a738e5e3e7f3d1307f2732ac71a6c28f1238ed3052826"}, - {file = "plotly-5.14.1.tar.gz", hash = "sha256:bcac86d7fcba3eff7260c1eddc36ca34dae2aded10a0709808446565e0e53b93"}, + {file = "plotly-5.18.0-py3-none-any.whl", hash = "sha256:23aa8ea2f4fb364a20d34ad38235524bd9d691bf5299e800bca608c31e8db8de"}, + {file = "plotly-5.18.0.tar.gz", hash = "sha256:360a31e6fbb49d12b007036eb6929521343d6bee2236f8459915821baefa2cbb"}, ] [package.dependencies] @@ -5318,13 +5769,13 @@ tenacity = ">=6.2.0" [[package]] name = "pluggy" -version = "1.0.0" +version = "1.3.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, ] [package.extras] @@ -5333,13 +5784,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "portalocker" -version = "2.7.0" +version = "2.8.2" description = "Wraps the portalocker recipe for easy usage" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "portalocker-2.7.0-py2.py3-none-any.whl", hash = "sha256:a07c5b4f3985c3cf4798369631fb7011adb498e2a46d8440efc75a8f29a0f983"}, - {file = "portalocker-2.7.0.tar.gz", hash = "sha256:032e81d534a88ec1736d03f780ba073f047a06c478b06e2937486f334e955c51"}, + {file = "portalocker-2.8.2-py3-none-any.whl", hash = "sha256:cfb86acc09b9aa7c3b43594e19be1345b9d16af3feb08bf92f23d4dce513a28e"}, + {file = "portalocker-2.8.2.tar.gz", hash = "sha256:2b035aa7828e46c58e9b31390ee1f169b98e1066ab10b9a6a861fe7e25ee4f33"}, ] [package.dependencies] @@ -5348,17 +5799,17 @@ pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""} [package.extras] docs = ["sphinx (>=1.7.1)"] redis = ["redis"] -tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)"] +tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)", "types-redis"] [[package]] name = "pre-commit" -version = "2.21.0" +version = "3.6.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"}, - {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"}, + {file = "pre_commit-3.6.0-py2.py3-none-any.whl", hash = "sha256:c255039ef399049a5544b6ce13d135caba8f2c28c3b4033277a788f434308376"}, + {file = "pre_commit-3.6.0.tar.gz", hash = "sha256:d30bad9abf165f7785c15a21a1f46da7d0677cb00ee7ff4c579fd38922efe15d"}, ] [package.dependencies] @@ -5368,6 +5819,17 @@ nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" +[[package]] +name = "prettier" +version = "0.0.7" +description = "Properly pprint of nested objects" +optional = false +python-versions = "*" +files = [ + {file = "prettier-0.0.7-py3-none-any.whl", hash = "sha256:20e76791de41cafe481328dd49552303f29ca192151cee1b120c26f66cae9bfc"}, + {file = "prettier-0.0.7.tar.gz", hash = "sha256:6c34b8cd09fd9c8956c05d6395ea3f575e0122dce494ba57685c07065abed427"}, +] + [[package]] name = "prison" version = "0.2.1" @@ -5387,13 +5849,13 @@ dev = ["nose", "pipreqs", "twine"] [[package]] name = "prompt-toolkit" -version = "3.0.38" +version = "3.0.41" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.38-py3-none-any.whl", hash = "sha256:45ea77a2f7c60418850331366c81cf6b5b9cf4c7fd34616f733c5427e6abbb1f"}, - {file = "prompt_toolkit-3.0.38.tar.gz", hash = "sha256:23ac5d50538a9a38c8bde05fecb47d0b403ecd0662857a86f886f798563d5b9b"}, + {file = "prompt_toolkit-3.0.41-py3-none-any.whl", hash = "sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2"}, + {file = "prompt_toolkit-3.0.41.tar.gz", hash = "sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0"}, ] [package.dependencies] @@ -5401,13 +5863,13 @@ wcwidth = "*" [[package]] name = "proto-plus" -version = "1.22.2" +version = "1.22.3" description = "Beautiful, Pythonic protocol buffers." optional = false python-versions = ">=3.6" files = [ - {file = "proto-plus-1.22.2.tar.gz", hash = "sha256:0e8cda3d5a634d9895b75c573c9352c16486cb75deb0e078b5fda34db4243165"}, - {file = "proto_plus-1.22.2-py3-none-any.whl", hash = "sha256:de34e52d6c9c6fcd704192f09767cb561bb4ee64e70eede20b0834d841f0be4d"}, + {file = "proto-plus-1.22.3.tar.gz", hash = "sha256:fdcd09713cbd42480740d2fe29c990f7fbd885a67efc328aa8be6ee3e9f76a6b"}, + {file = "proto_plus-1.22.3-py3-none-any.whl", hash = "sha256:a49cd903bc0b6ab41f76bf65510439d56ca76f868adf0274e738bfdd096894df"}, ] [package.dependencies] @@ -5449,25 +5911,27 @@ files = [ [[package]] name = "psutil" -version = "5.9.5" +version = "5.9.6" description = "Cross-platform lib for process and system monitoring in Python." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, - {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, - {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, - {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"}, - {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4"}, - {file = "psutil-5.9.5-cp27-none-win32.whl", hash = "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f"}, - {file = "psutil-5.9.5-cp27-none-win_amd64.whl", hash = "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42"}, - {file = "psutil-5.9.5-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217"}, - {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da"}, - {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4"}, - {file = "psutil-5.9.5-cp36-abi3-win32.whl", hash = "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d"}, - {file = "psutil-5.9.5-cp36-abi3-win_amd64.whl", hash = "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9"}, - {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, - {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, + {file = "psutil-5.9.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d"}, + {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c"}, + {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28"}, + {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017"}, + {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c"}, + {file = "psutil-5.9.6-cp27-none-win32.whl", hash = "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9"}, + {file = "psutil-5.9.6-cp27-none-win_amd64.whl", hash = "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac"}, + {file = "psutil-5.9.6-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a"}, + {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c"}, + {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4"}, + {file = "psutil-5.9.6-cp36-cp36m-win32.whl", hash = "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602"}, + {file = "psutil-5.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa"}, + {file = "psutil-5.9.6-cp37-abi3-win32.whl", hash = "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c"}, + {file = "psutil-5.9.6-cp37-abi3-win_amd64.whl", hash = "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a"}, + {file = "psutil-5.9.6-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57"}, + {file = "psutil-5.9.6.tar.gz", hash = "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a"}, ] [package.extras] @@ -5522,36 +5986,47 @@ files = [ [[package]] name = "pyarrow" -version = "12.0.1" +version = "14.0.1" description = "Python library for Apache Arrow" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pyarrow-12.0.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:6d288029a94a9bb5407ceebdd7110ba398a00412c5b0155ee9813a40d246c5df"}, - {file = "pyarrow-12.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:345e1828efdbd9aa4d4de7d5676778aba384a2c3add896d995b23d368e60e5af"}, - {file = "pyarrow-12.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d6009fdf8986332b2169314da482baed47ac053311c8934ac6651e614deacd6"}, - {file = "pyarrow-12.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d3c4cbbf81e6dd23fe921bc91dc4619ea3b79bc58ef10bce0f49bdafb103daf"}, - {file = "pyarrow-12.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdacf515ec276709ac8042c7d9bd5be83b4f5f39c6c037a17a60d7ebfd92c890"}, - {file = "pyarrow-12.0.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:749be7fd2ff260683f9cc739cb862fb11be376de965a2a8ccbf2693b098db6c7"}, - {file = "pyarrow-12.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6895b5fb74289d055c43db3af0de6e16b07586c45763cb5e558d38b86a91e3a7"}, - {file = "pyarrow-12.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1887bdae17ec3b4c046fcf19951e71b6a619f39fa674f9881216173566c8f718"}, - {file = "pyarrow-12.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c9cb8eeabbadf5fcfc3d1ddea616c7ce893db2ce4dcef0ac13b099ad7ca082"}, - {file = "pyarrow-12.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:ce4aebdf412bd0eeb800d8e47db854f9f9f7e2f5a0220440acf219ddfddd4f63"}, - {file = "pyarrow-12.0.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:e0d8730c7f6e893f6db5d5b86eda42c0a130842d101992b581e2138e4d5663d3"}, - {file = "pyarrow-12.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43364daec02f69fec89d2315f7fbfbeec956e0d991cbbef471681bd77875c40f"}, - {file = "pyarrow-12.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051f9f5ccf585f12d7de836e50965b3c235542cc896959320d9776ab93f3b33d"}, - {file = "pyarrow-12.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:be2757e9275875d2a9c6e6052ac7957fbbfc7bc7370e4a036a9b893e96fedaba"}, - {file = "pyarrow-12.0.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:cf812306d66f40f69e684300f7af5111c11f6e0d89d6b733e05a3de44961529d"}, - {file = "pyarrow-12.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:459a1c0ed2d68671188b2118c63bac91eaef6fc150c77ddd8a583e3c795737bf"}, - {file = "pyarrow-12.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85e705e33eaf666bbe508a16fd5ba27ca061e177916b7a317ba5a51bee43384c"}, - {file = "pyarrow-12.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9120c3eb2b1f6f516a3b7a9714ed860882d9ef98c4b17edcdc91d95b7528db60"}, - {file = "pyarrow-12.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:c780f4dc40460015d80fcd6a6140de80b615349ed68ef9adb653fe351778c9b3"}, - {file = "pyarrow-12.0.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:a3c63124fc26bf5f95f508f5d04e1ece8cc23a8b0af2a1e6ab2b1ec3fdc91b24"}, - {file = "pyarrow-12.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b13329f79fa4472324f8d32dc1b1216616d09bd1e77cfb13104dec5463632c36"}, - {file = "pyarrow-12.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb656150d3d12ec1396f6dde542db1675a95c0cc8366d507347b0beed96e87ca"}, - {file = "pyarrow-12.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6251e38470da97a5b2e00de5c6a049149f7b2bd62f12fa5dbb9ac674119ba71a"}, - {file = "pyarrow-12.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:3de26da901216149ce086920547dfff5cd22818c9eab67ebc41e863a5883bac7"}, - {file = "pyarrow-12.0.1.tar.gz", hash = "sha256:cce317fc96e5b71107bf1f9f184d5e54e2bd14bbf3f9a3d62819961f0af86fec"}, + {file = "pyarrow-14.0.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:96d64e5ba7dceb519a955e5eeb5c9adcfd63f73a56aea4722e2cc81364fc567a"}, + {file = "pyarrow-14.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a8ae88c0038d1bc362a682320112ee6774f006134cd5afc291591ee4bc06505"}, + {file = "pyarrow-14.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f6f053cb66dc24091f5511e5920e45c83107f954a21032feadc7b9e3a8e7851"}, + {file = "pyarrow-14.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:906b0dc25f2be12e95975722f1e60e162437023f490dbd80d0deb7375baf3171"}, + {file = "pyarrow-14.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:78d4a77a46a7de9388b653af1c4ce539350726cd9af62e0831e4f2bd0c95a2f4"}, + {file = "pyarrow-14.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:06ca79080ef89d6529bb8e5074d4b4f6086143b2520494fcb7cf8a99079cde93"}, + {file = "pyarrow-14.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:32542164d905002c42dff896efdac79b3bdd7291b1b74aa292fac8450d0e4dcd"}, + {file = "pyarrow-14.0.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:c7331b4ed3401b7ee56f22c980608cf273f0380f77d0f73dd3c185f78f5a6220"}, + {file = "pyarrow-14.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:922e8b49b88da8633d6cac0e1b5a690311b6758d6f5d7c2be71acb0f1e14cd61"}, + {file = "pyarrow-14.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58c889851ca33f992ea916b48b8540735055201b177cb0dcf0596a495a667b00"}, + {file = "pyarrow-14.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30d8494870d9916bb53b2a4384948491444741cb9a38253c590e21f836b01222"}, + {file = "pyarrow-14.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:be28e1a07f20391bb0b15ea03dcac3aade29fc773c5eb4bee2838e9b2cdde0cb"}, + {file = "pyarrow-14.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:981670b4ce0110d8dcb3246410a4aabf5714db5d8ea63b15686bce1c914b1f83"}, + {file = "pyarrow-14.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:4756a2b373a28f6166c42711240643fb8bd6322467e9aacabd26b488fa41ec23"}, + {file = "pyarrow-14.0.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:cf87e2cec65dd5cf1aa4aba918d523ef56ef95597b545bbaad01e6433851aa10"}, + {file = "pyarrow-14.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:470ae0194fbfdfbf4a6b65b4f9e0f6e1fa0ea5b90c1ee6b65b38aecee53508c8"}, + {file = "pyarrow-14.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6263cffd0c3721c1e348062997babdf0151301f7353010c9c9a8ed47448f82ab"}, + {file = "pyarrow-14.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8089d7e77d1455d529dbd7cff08898bbb2666ee48bc4085203af1d826a33cc"}, + {file = "pyarrow-14.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fada8396bc739d958d0b81d291cfd201126ed5e7913cb73de6bc606befc30226"}, + {file = "pyarrow-14.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:2a145dab9ed7849fc1101bf03bcdc69913547f10513fdf70fc3ab6c0a50c7eee"}, + {file = "pyarrow-14.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:05fe7994745b634c5fb16ce5717e39a1ac1fac3e2b0795232841660aa76647cd"}, + {file = "pyarrow-14.0.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:a8eeef015ae69d104c4c3117a6011e7e3ecd1abec79dc87fd2fac6e442f666ee"}, + {file = "pyarrow-14.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3c76807540989fe8fcd02285dd15e4f2a3da0b09d27781abec3adc265ddbeba1"}, + {file = "pyarrow-14.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:450e4605e3c20e558485f9161a79280a61c55efe585d51513c014de9ae8d393f"}, + {file = "pyarrow-14.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:323cbe60210173ffd7db78bfd50b80bdd792c4c9daca8843ef3cd70b186649db"}, + {file = "pyarrow-14.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0140c7e2b740e08c5a459439d87acd26b747fc408bde0a8806096ee0baaa0c15"}, + {file = "pyarrow-14.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:e592e482edd9f1ab32f18cd6a716c45b2c0f2403dc2af782f4e9674952e6dd27"}, + {file = "pyarrow-14.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:d264ad13605b61959f2ae7c1d25b1a5b8505b112715c961418c8396433f213ad"}, + {file = "pyarrow-14.0.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:01e44de9749cddc486169cb632f3c99962318e9dacac7778315a110f4bf8a450"}, + {file = "pyarrow-14.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d0351fecf0e26e152542bc164c22ea2a8e8c682726fce160ce4d459ea802d69c"}, + {file = "pyarrow-14.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33c1f6110c386464fd2e5e4ea3624466055bbe681ff185fd6c9daa98f30a3f9a"}, + {file = "pyarrow-14.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11e045dfa09855b6d3e7705a37c42e2dc2c71d608fab34d3c23df2e02df9aec3"}, + {file = "pyarrow-14.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:097828b55321897db0e1dbfc606e3ff8101ae5725673498cbfa7754ee0da80e4"}, + {file = "pyarrow-14.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1daab52050a1c48506c029e6fa0944a7b2436334d7e44221c16f6f1b2cc9c510"}, + {file = "pyarrow-14.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:3f6d5faf4f1b0d5a7f97be987cf9e9f8cd39902611e818fe134588ee99bf0283"}, + {file = "pyarrow-14.0.1.tar.gz", hash = "sha256:b8b3f4fe8d4ec15e1ef9b599b94683c5216adaed78d5cb4c606180546d1e2ee1"}, ] [package.dependencies] @@ -5559,88 +6034,87 @@ numpy = ">=1.16.6" [[package]] name = "pyasn1" -version = "0.4.8" -description = "ASN.1 types and codecs" +version = "0.5.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = false -python-versions = "*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, - {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, + {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, + {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, ] [[package]] name = "pyasn1-modules" -version = "0.2.8" -description = "A collection of ASN.1-based protocols modules." +version = "0.3.0" +description = "A collection of ASN.1-based protocols modules" optional = false -python-versions = "*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, - {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, + {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, + {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, ] [package.dependencies] -pyasn1 = ">=0.4.6,<0.5.0" +pyasn1 = ">=0.4.6,<0.6.0" [[package]] name = "pycares" -version = "4.3.0" +version = "4.4.0" description = "Python interface for c-ares" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "pycares-4.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:19c9cdd3322d422931982939773e453e491dfc5c0b2e23d7266959315c7a0824"}, - {file = "pycares-4.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9e56e9cdf46a092970dc4b75bbabddea9f480be5eeadc3fcae3eb5c6807c4136"}, - {file = "pycares-4.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c75a6241c79b935048272cb77df498da64b8defc8c4b29fdf9870e43ba4cbb4"}, - {file = "pycares-4.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24d8654fac3742791b8bef59d1fbb3e19ae6a5c48876a6d98659f7c66ee546c4"}, - {file = "pycares-4.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebf50b049a245880f1aa16a6f72c4408e0a65b49ea1d3bf13383a44a2cabd2bf"}, - {file = "pycares-4.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:84daf560962763c0359fd79c750ef480f0fda40c08b57765088dbe362e8dc452"}, - {file = "pycares-4.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:978d10da7ee74b9979c494afa8b646411119ad0186a29c7f13c72bb4295630c6"}, - {file = "pycares-4.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c5b9d7fe52eb3d243f5ead58d5c0011884226d961df8360a34618c38c7515"}, - {file = "pycares-4.3.0-cp310-cp310-win32.whl", hash = "sha256:da7c7089ae617317d2cbe38baefd3821387b3bfef7b3ee5b797b871cb1257974"}, - {file = "pycares-4.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:7106dc683db30e1d851283b7b9df7a5ea4964d6bdd000d918d91d4b1f9bed329"}, - {file = "pycares-4.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4e7a24ecef0b1933f2a3fdbf328d1b529a76cda113f8364fa0742e5b3bd76566"}, - {file = "pycares-4.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7abccc2aa4771c06994e4d9ed596453061e2b8846f887d9c98a64ccdaf4790a"}, - {file = "pycares-4.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531fed46c5ed798a914c3207be4ae7b297c4d09e4183d3cf8fd9ee59a55d5080"}, - {file = "pycares-4.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c9335175af0c64a1e0ba67bdd349eb62d4eea0ad02c235ccdf0d535fd20f323"}, - {file = "pycares-4.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5f0e95535027d2dcd51e780410632b0d3ed7e9e5ceb25dc0fe937f2c2960079"}, - {file = "pycares-4.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3692179ce5fb96908ba342e1e5303608d0c976f0d5d4619fa9d3d6d9d5a9a1b4"}, - {file = "pycares-4.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c4cb6cc7fe8e0606d30b60367f59fe26d1472e88555d61e202db70dea5c8edb"}, - {file = "pycares-4.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3215445396c74103e2054e6b349d9e85883ceda2006d0039fc2d58c9b11818a2"}, - {file = "pycares-4.3.0-cp311-cp311-win32.whl", hash = "sha256:6a0c0c3a0adf490bba9dbb37dbd07ec81e4a6584f095036ac34f06a633710ffe"}, - {file = "pycares-4.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:995cb37cc39bd40ca87bb16555a0f7724f3be30d9f9059a4caab2fde45b1b903"}, - {file = "pycares-4.3.0-cp36-cp36m-win32.whl", hash = "sha256:4c9187be72449c975c11daa1d94d7ddcc494f8a4c37a6c18f977cd7024a531d9"}, - {file = "pycares-4.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d7405ba10a2903a58b8b0faedcb54994c9ee002ad01963587fabf93e7e479783"}, - {file = "pycares-4.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:40aaa12081495f879f11f4cfc95edfec1ea14711188563102f9e33fe98728fac"}, - {file = "pycares-4.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4972cac24b66c5997f3a3e2cb608e408066d80103d443e36d626a88a287b9ae7"}, - {file = "pycares-4.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35886dba7aa5b73affca8729aeb5a1f5e94d3d9a764adb1b7e75bafca44eeca5"}, - {file = "pycares-4.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5cea6e1f3be016f155d60f27f16c1074d58b4d6e123228fdbc3326d076016af8"}, - {file = "pycares-4.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3a9fd2665b053afb39226ac6f8137a60910ca7729358456df2fb94866f4297de"}, - {file = "pycares-4.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e8e9195f869120e44e0aa0a6098bb5c19947f4753054365891f592e6f9eab3ef"}, - {file = "pycares-4.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:674486ecf2afb25ee219171b07cdaba481a1aaa2dabb155779c7be9ded03eaa9"}, - {file = "pycares-4.3.0-cp37-cp37m-win32.whl", hash = "sha256:1b6cd3161851499b6894d1e23bfd633e7b775472f5af35ae35409c4a47a2d45e"}, - {file = "pycares-4.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:710120c97b9afdba443564350c3f5f72fd9aae74d95b73dc062ca8ac3d7f36d7"}, - {file = "pycares-4.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9103649bd29d84bc6bcfaf09def9c0592bbc766018fad19d76d09989608b915d"}, - {file = "pycares-4.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c072dbaf73cb5434279578dc35322867d8d5df053e14fdcdcc589994ba4804ae"}, - {file = "pycares-4.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008531733f9c7a976b59c7760a3672b191159fd69ae76c01ca051f20b5e44164"}, - {file = "pycares-4.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2aae02d97d77dcff840ab55f86cb8b99bf644acbca17e1edb7048408b9782088"}, - {file = "pycares-4.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:257953ae6d400a934fd9193aeb20990ac84a78648bdf5978e998bd007a4045cd"}, - {file = "pycares-4.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c28d481efae26936ec08cb6beea305f4b145503b152cf2c4dc68cc4ad9644f0e"}, - {file = "pycares-4.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:976249b39037dbfb709ccf7e1c40d2785905a0065536385d501b94570cfed96d"}, - {file = "pycares-4.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:98568c30cfab6b327d94ae1acdf85bbba4cffd415980804985d34ca07e6f4791"}, - {file = "pycares-4.3.0-cp38-cp38-win32.whl", hash = "sha256:a2f3c4f49f43162f7e684419d9834c2c8ec165e54cb8dc47aa9dc0c2132701c0"}, - {file = "pycares-4.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:1730ef93e33e4682fbbf0e7fb19df2ed9822779d17de8ea6e20d5b0d71c1d2be"}, - {file = "pycares-4.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a26b3f1684557025da26ce65d076619890c82b95e38cc7284ce51c3539a1ce8"}, - {file = "pycares-4.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:86112cce01655b9f63c5e53b74722084e88e784a7a8ad138d373440337c591c9"}, - {file = "pycares-4.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c01465a191dc78e923884bb45cd63c7e012623e520cf7ed67e542413ee334804"}, - {file = "pycares-4.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9fd5d6012f3ee8c8038cbfe16e988bbd17b2f21eea86650874bf63757ee6161"}, - {file = "pycares-4.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa36b8ea91eae20b5c7205f3e6654423f066af24a1df02b274770a96cbcafaa7"}, - {file = "pycares-4.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:61019151130557c1788cae52e4f2f388a7520c9d92574f3a0d61c974c6740db0"}, - {file = "pycares-4.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:231962bb46274c52632469a1e686fab065dbd106dbef586de4f7fb101e297587"}, - {file = "pycares-4.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6c979512fa51c7ccef5204fe10ed4e5c44c2bce5f335fe98a3e423f1672bd7d4"}, - {file = "pycares-4.3.0-cp39-cp39-win32.whl", hash = "sha256:655cf0df862ce3847a60e1a106dafa2ba2c14e6636bac49e874347acdc7312dc"}, - {file = "pycares-4.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:36f2251ad0f99a5ce13df45c94c3161d9734c9e9fa2b9b4cc163b853ca170dc5"}, - {file = "pycares-4.3.0.tar.gz", hash = "sha256:c542696f6dac978e9d99192384745a65f80a7d9450501151e4a7563e06010d45"}, + {file = "pycares-4.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:24da119850841d16996713d9c3374ca28a21deee056d609fbbed29065d17e1f6"}, + {file = "pycares-4.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8f64cb58729689d4d0e78f0bfb4c25ce2f851d0274c0273ac751795c04b8798a"}, + {file = "pycares-4.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33e2a1120887e89075f7f814ec144f66a6ce06a54f5722ccefc62fbeda83cff"}, + {file = "pycares-4.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c680fef1b502ee680f8f0b95a41af4ec2c234e50e16c0af5bbda31999d3584bd"}, + {file = "pycares-4.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fff16b09042ba077f7b8aa5868d1d22456f0002574d0ba43462b10a009331677"}, + {file = "pycares-4.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:229a1675eb33bc9afb1fc463e73ee334950ccc485bc83a43f6ae5839fb4d5fa3"}, + {file = "pycares-4.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3aebc73e5ad70464f998f77f2da2063aa617cbd8d3e8174dd7c5b4518f967153"}, + {file = "pycares-4.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6ef64649eba56448f65e26546d85c860709844d2fc22ef14d324fe0b27f761a9"}, + {file = "pycares-4.4.0-cp310-cp310-win32.whl", hash = "sha256:4afc2644423f4eef97857a9fd61be9758ce5e336b4b0bd3d591238bb4b8b03e0"}, + {file = "pycares-4.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:5ed4e04af4012f875b78219d34434a6d08a67175150ac1b79eb70ab585d4ba8c"}, + {file = "pycares-4.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bce8db2fc6f3174bd39b81405210b9b88d7b607d33e56a970c34a0c190da0490"}, + {file = "pycares-4.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a0303428d013ccf5c51de59c83f9127aba6200adb7fd4be57eddb432a1edd2a"}, + {file = "pycares-4.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afb91792f1556f97be7f7acb57dc7756d89c5a87bd8b90363a77dbf9ea653817"}, + {file = "pycares-4.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b61579cecf1f4d616e5ea31a6e423a16680ab0d3a24a2ffe7bb1d4ee162477ff"}, + {file = "pycares-4.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7af06968cbf6851566e806bf3e72825b0e6671832a2cbe840be1d2d65350710"}, + {file = "pycares-4.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ceb12974367b0a68a05d52f4162b29f575d241bd53de155efe632bf2c943c7f6"}, + {file = "pycares-4.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2eeec144bcf6a7b6f2d74d6e70cbba7886a84dd373c886f06cb137a07de4954c"}, + {file = "pycares-4.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e3a6f7cfdfd11eb5493d6d632e582408c8f3b429f295f8799c584c108b28db6f"}, + {file = "pycares-4.4.0-cp311-cp311-win32.whl", hash = "sha256:34736a2ffaa9c08ca9c707011a2d7b69074bbf82d645d8138bba771479b2362f"}, + {file = "pycares-4.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:eb66c30eb11e877976b7ead13632082a8621df648c408b8e15cdb91a452dd502"}, + {file = "pycares-4.4.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fd644505a8cfd7f6584d33a9066d4e3d47700f050ef1490230c962de5dfb28c6"}, + {file = "pycares-4.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52084961262232ec04bd75f5043aed7e5d8d9695e542ff691dfef0110209f2d4"}, + {file = "pycares-4.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0c5368206057884cde18602580083aeaad9b860e2eac14fd253543158ce1e93"}, + {file = "pycares-4.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:112a4979c695b1c86f6782163d7dec58d57a3b9510536dcf4826550f9053dd9a"}, + {file = "pycares-4.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d186dafccdaa3409194c0f94db93c1a5d191145a275f19da6591f9499b8e7b8"}, + {file = "pycares-4.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:64965dc19c578a683ea73487a215a8897276224e004d50eeb21f0bc7a0b63c88"}, + {file = "pycares-4.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ed2a38e34bec6f2586435f6ff0bc5fe11d14bebd7ed492cf739a424e81681540"}, + {file = "pycares-4.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:94d6962db81541eb0396d2f0dfcbb18cdb8c8b251d165efc2d974ae652c547d4"}, + {file = "pycares-4.4.0-cp312-cp312-win32.whl", hash = "sha256:1168a48a834813aa80f412be2df4abaf630528a58d15c704857448b20b1675c0"}, + {file = "pycares-4.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:db24c4e7fea4a052c6e869cbf387dd85d53b9736cfe1ef5d8d568d1ca925e977"}, + {file = "pycares-4.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:21a5a0468861ec7df7befa69050f952da13db5427ae41ffe4713bc96291d1d95"}, + {file = "pycares-4.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:22c00bf659a9fa44d7b405cf1cd69b68b9d37537899898d8cbe5dffa4016b273"}, + {file = "pycares-4.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23aa3993a352491a47fcf17867f61472f32f874df4adcbb486294bd9fbe8abee"}, + {file = "pycares-4.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:813d661cbe2e37d87da2d16b7110a6860e93ddb11735c6919c8a3545c7b9c8d8"}, + {file = "pycares-4.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:77cf5a2fd5583c670de41a7f4a7b46e5cbabe7180d8029f728571f4d2e864084"}, + {file = "pycares-4.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3eaa6681c0a3e3f3868c77aca14b7760fed35fdfda2fe587e15c701950e7bc69"}, + {file = "pycares-4.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ad58e284a658a8a6a84af2e0b62f2f961f303cedfe551854d7bd40c3cbb61912"}, + {file = "pycares-4.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bfb89ca9e3d0a9b5332deeb666b2ede9d3469107742158f4aeda5ce032d003f4"}, + {file = "pycares-4.4.0-cp38-cp38-win32.whl", hash = "sha256:f36bdc1562142e3695555d2f4ac0cb69af165eddcefa98efc1c79495b533481f"}, + {file = "pycares-4.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:902461a92b6a80fd5041a2ec5235680c7cc35e43615639ec2a40e63fca2dfb51"}, + {file = "pycares-4.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7bddc6adba8f699728f7fc1c9ce8cef359817ad78e2ed52b9502cb5f8dc7f741"}, + {file = "pycares-4.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cb49d5805cd347c404f928c5ae7c35e86ba0c58ffa701dbe905365e77ce7d641"}, + {file = "pycares-4.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56cf3349fa3a2e67ed387a7974c11d233734636fe19facfcda261b411af14d80"}, + {file = "pycares-4.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bf2eaa83a5987e48fa63302f0fe7ce3275cfda87b34d40fef9ce703fb3ac002"}, + {file = "pycares-4.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82bba2ab77eb5addbf9758d514d9bdef3c1bfe7d1649a47bd9a0d55a23ef478b"}, + {file = "pycares-4.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c6a8bde63106f162fca736e842a916853cad3c8d9d137e11c9ffa37efa818b02"}, + {file = "pycares-4.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5f646eec041db6ffdbcaf3e0756fb92018f7af3266138c756bb09d2b5baadec"}, + {file = "pycares-4.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9dc04c54c6ea615210c1b9e803d0e2d2255f87a3d5d119b6482c8f0dfa15b26b"}, + {file = "pycares-4.4.0-cp39-cp39-win32.whl", hash = "sha256:97892cced5794d721fb4ff8765764aa4ea48fe8b2c3820677505b96b83d4ef47"}, + {file = "pycares-4.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:917f08f0b5d9324e9a34211e68d27447c552b50ab967044776bbab7e42a553a2"}, + {file = "pycares-4.4.0.tar.gz", hash = "sha256:f47579d508f2f56eddd16ce72045782ad3b1b3b678098699e2b6a1b30733e1c2"}, ] [package.dependencies] @@ -5651,13 +6125,13 @@ idna = ["idna (>=2.1)"] [[package]] name = "pycodestyle" -version = "2.9.1" +version = "2.11.1" description = "Python style guide checker" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, - {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, + {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, + {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, ] [[package]] @@ -5673,55 +6147,140 @@ files = [ [[package]] name = "pydantic" -version = "1.10.12" -description = "Data validation and settings management using python type hints" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pydantic-1.10.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a1fcb59f2f355ec350073af41d927bf83a63b50e640f4dbaa01053a28b7a7718"}, - {file = "pydantic-1.10.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b7ccf02d7eb340b216ec33e53a3a629856afe1c6e0ef91d84a4e6f2fb2ca70fe"}, - {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fb2aa3ab3728d950bcc885a2e9eff6c8fc40bc0b7bb434e555c215491bcf48b"}, - {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:771735dc43cf8383959dc9b90aa281f0b6092321ca98677c5fb6125a6f56d58d"}, - {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca48477862372ac3770969b9d75f1bf66131d386dba79506c46d75e6b48c1e09"}, - {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a5e7add47a5b5a40c49b3036d464e3c7802f8ae0d1e66035ea16aa5b7a3923ed"}, - {file = "pydantic-1.10.12-cp310-cp310-win_amd64.whl", hash = "sha256:e4129b528c6baa99a429f97ce733fff478ec955513630e61b49804b6cf9b224a"}, - {file = "pydantic-1.10.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0d191db0f92dfcb1dec210ca244fdae5cbe918c6050b342d619c09d31eea0cc"}, - {file = "pydantic-1.10.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:795e34e6cc065f8f498c89b894a3c6da294a936ee71e644e4bd44de048af1405"}, - {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69328e15cfda2c392da4e713443c7dbffa1505bc9d566e71e55abe14c97ddc62"}, - {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2031de0967c279df0d8a1c72b4ffc411ecd06bac607a212892757db7462fc494"}, - {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ba5b2e6fe6ca2b7e013398bc7d7b170e21cce322d266ffcd57cca313e54fb246"}, - {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a7bac939fa326db1ab741c9d7f44c565a1d1e80908b3797f7f81a4f86bc8d33"}, - {file = "pydantic-1.10.12-cp311-cp311-win_amd64.whl", hash = "sha256:87afda5539d5140cb8ba9e8b8c8865cb5b1463924d38490d73d3ccfd80896b3f"}, - {file = "pydantic-1.10.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:549a8e3d81df0a85226963611950b12d2d334f214436a19537b2efed61b7639a"}, - {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:598da88dfa127b666852bef6d0d796573a8cf5009ffd62104094a4fe39599565"}, - {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba5c4a8552bff16c61882db58544116d021d0b31ee7c66958d14cf386a5b5350"}, - {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c79e6a11a07da7374f46970410b41d5e266f7f38f6a17a9c4823db80dadf4303"}, - {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab26038b8375581dc832a63c948f261ae0aa21f1d34c1293469f135fa92972a5"}, - {file = "pydantic-1.10.12-cp37-cp37m-win_amd64.whl", hash = "sha256:e0a16d274b588767602b7646fa05af2782576a6cf1022f4ba74cbb4db66f6ca8"}, - {file = "pydantic-1.10.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a9dfa722316f4acf4460afdf5d41d5246a80e249c7ff475c43a3a1e9d75cf62"}, - {file = "pydantic-1.10.12-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a73f489aebd0c2121ed974054cb2759af8a9f747de120acd2c3394cf84176ccb"}, - {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bcb8cbfccfcf02acb8f1a261143fab622831d9c0989707e0e659f77a18e0"}, - {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fcfb5296d7877af406ba1547dfde9943b1256d8928732267e2653c26938cd9c"}, - {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2f9a6fab5f82ada41d56b0602606a5506aab165ca54e52bc4545028382ef1c5d"}, - {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dea7adcc33d5d105896401a1f37d56b47d443a2b2605ff8a969a0ed5543f7e33"}, - {file = "pydantic-1.10.12-cp38-cp38-win_amd64.whl", hash = "sha256:1eb2085c13bce1612da8537b2d90f549c8cbb05c67e8f22854e201bde5d98a47"}, - {file = "pydantic-1.10.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ef6c96b2baa2100ec91a4b428f80d8f28a3c9e53568219b6c298c1125572ebc6"}, - {file = "pydantic-1.10.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c076be61cd0177a8433c0adcb03475baf4ee91edf5a4e550161ad57fc90f523"}, - {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5a58feb9a39f481eda4d5ca220aa8b9d4f21a41274760b9bc66bfd72595b86"}, - {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5f805d2d5d0a41633651a73fa4ecdd0b3d7a49de4ec3fadf062fe16501ddbf1"}, - {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1289c180abd4bd4555bb927c42ee42abc3aee02b0fb2d1223fb7c6e5bef87dbe"}, - {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5d1197e462e0364906cbc19681605cb7c036f2475c899b6f296104ad42b9f5fb"}, - {file = "pydantic-1.10.12-cp39-cp39-win_amd64.whl", hash = "sha256:fdbdd1d630195689f325c9ef1a12900524dceb503b00a987663ff4f58669b93d"}, - {file = "pydantic-1.10.12-py3-none-any.whl", hash = "sha256:b749a43aa51e32839c9d71dc67eb1e4221bb04af1033a32e3923d46f9effa942"}, - {file = "pydantic-1.10.12.tar.gz", hash = "sha256:0fe8a415cea8f340e7a9af9c54fc71a649b43e8ca3cc732986116b3cb135d303"}, -] - -[package.dependencies] -typing-extensions = ">=4.2.0" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] +version = "2.4.2" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-2.4.2-py3-none-any.whl", hash = "sha256:bc3ddf669d234f4220e6e1c4d96b061abe0998185a8d7855c0126782b7abc8c1"}, + {file = "pydantic-2.4.2.tar.gz", hash = "sha256:94f336138093a5d7f426aac732dcfe7ab4eb4da243c88f891d65deb4a2556ee7"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.10.1" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.10.1" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic_core-2.10.1-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:d64728ee14e667ba27c66314b7d880b8eeb050e58ffc5fec3b7a109f8cddbd63"}, + {file = "pydantic_core-2.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:48525933fea744a3e7464c19bfede85df4aba79ce90c60b94d8b6e1eddd67096"}, + {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef337945bbd76cce390d1b2496ccf9f90b1c1242a3a7bc242ca4a9fc5993427a"}, + {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1392e0638af203cee360495fd2cfdd6054711f2db5175b6e9c3c461b76f5175"}, + {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0675ba5d22de54d07bccde38997e780044dcfa9a71aac9fd7d4d7a1d2e3e65f7"}, + {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:128552af70a64660f21cb0eb4876cbdadf1a1f9d5de820fed6421fa8de07c893"}, + {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f6e6aed5818c264412ac0598b581a002a9f050cb2637a84979859e70197aa9e"}, + {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ecaac27da855b8d73f92123e5f03612b04c5632fd0a476e469dfc47cd37d6b2e"}, + {file = "pydantic_core-2.10.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b3c01c2fb081fced3bbb3da78510693dc7121bb893a1f0f5f4b48013201f362e"}, + {file = "pydantic_core-2.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:92f675fefa977625105708492850bcbc1182bfc3e997f8eecb866d1927c98ae6"}, + {file = "pydantic_core-2.10.1-cp310-none-win32.whl", hash = "sha256:420a692b547736a8d8703c39ea935ab5d8f0d2573f8f123b0a294e49a73f214b"}, + {file = "pydantic_core-2.10.1-cp310-none-win_amd64.whl", hash = "sha256:0880e239827b4b5b3e2ce05e6b766a7414e5f5aedc4523be6b68cfbc7f61c5d0"}, + {file = "pydantic_core-2.10.1-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:073d4a470b195d2b2245d0343569aac7e979d3a0dcce6c7d2af6d8a920ad0bea"}, + {file = "pydantic_core-2.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:600d04a7b342363058b9190d4e929a8e2e715c5682a70cc37d5ded1e0dd370b4"}, + {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39215d809470f4c8d1881758575b2abfb80174a9e8daf8f33b1d4379357e417c"}, + {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eeb3d3d6b399ffe55f9a04e09e635554012f1980696d6b0aca3e6cf42a17a03b"}, + {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a7902bf75779bc12ccfc508bfb7a4c47063f748ea3de87135d433a4cca7a2f"}, + {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3625578b6010c65964d177626fde80cf60d7f2e297d56b925cb5cdeda6e9925a"}, + {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:caa48fc31fc7243e50188197b5f0c4228956f97b954f76da157aae7f67269ae8"}, + {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:07ec6d7d929ae9c68f716195ce15e745b3e8fa122fc67698ac6498d802ed0fa4"}, + {file = "pydantic_core-2.10.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e6f31a17acede6a8cd1ae2d123ce04d8cca74056c9d456075f4f6f85de055607"}, + {file = "pydantic_core-2.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d8f1ebca515a03e5654f88411420fea6380fc841d1bea08effb28184e3d4899f"}, + {file = "pydantic_core-2.10.1-cp311-none-win32.whl", hash = "sha256:6db2eb9654a85ada248afa5a6db5ff1cf0f7b16043a6b070adc4a5be68c716d6"}, + {file = "pydantic_core-2.10.1-cp311-none-win_amd64.whl", hash = "sha256:4a5be350f922430997f240d25f8219f93b0c81e15f7b30b868b2fddfc2d05f27"}, + {file = "pydantic_core-2.10.1-cp311-none-win_arm64.whl", hash = "sha256:5fdb39f67c779b183b0c853cd6b45f7db84b84e0571b3ef1c89cdb1dfc367325"}, + {file = "pydantic_core-2.10.1-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:b1f22a9ab44de5f082216270552aa54259db20189e68fc12484873d926426921"}, + {file = "pydantic_core-2.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8572cadbf4cfa95fb4187775b5ade2eaa93511f07947b38f4cd67cf10783b118"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db9a28c063c7c00844ae42a80203eb6d2d6bbb97070cfa00194dff40e6f545ab"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e2a35baa428181cb2270a15864ec6286822d3576f2ed0f4cd7f0c1708472aff"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05560ab976012bf40f25d5225a58bfa649bb897b87192a36c6fef1ab132540d7"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6495008733c7521a89422d7a68efa0a0122c99a5861f06020ef5b1f51f9ba7c"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ac492c686defc8e6133e3a2d9eaf5261b3df26b8ae97450c1647286750b901"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8282bab177a9a3081fd3d0a0175a07a1e2bfb7fcbbd949519ea0980f8a07144d"}, + {file = "pydantic_core-2.10.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:aafdb89fdeb5fe165043896817eccd6434aee124d5ee9b354f92cd574ba5e78f"}, + {file = "pydantic_core-2.10.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f6defd966ca3b187ec6c366604e9296f585021d922e666b99c47e78738b5666c"}, + {file = "pydantic_core-2.10.1-cp312-none-win32.whl", hash = "sha256:7c4d1894fe112b0864c1fa75dffa045720a194b227bed12f4be7f6045b25209f"}, + {file = "pydantic_core-2.10.1-cp312-none-win_amd64.whl", hash = "sha256:5994985da903d0b8a08e4935c46ed8daf5be1cf217489e673910951dc533d430"}, + {file = "pydantic_core-2.10.1-cp312-none-win_arm64.whl", hash = "sha256:0d8a8adef23d86d8eceed3e32e9cca8879c7481c183f84ed1a8edc7df073af94"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:9badf8d45171d92387410b04639d73811b785b5161ecadabf056ea14d62d4ede"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:ebedb45b9feb7258fac0a268a3f6bec0a2ea4d9558f3d6f813f02ff3a6dc6698"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfe1090245c078720d250d19cb05d67e21a9cd7c257698ef139bc41cf6c27b4f"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e357571bb0efd65fd55f18db0a2fb0ed89d0bb1d41d906b138f088933ae618bb"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b3dcd587b69bbf54fc04ca157c2323b8911033e827fffaecf0cafa5a892a0904"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c120c9ce3b163b985a3b966bb701114beb1da4b0468b9b236fc754783d85aa3"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15d6bca84ffc966cc9976b09a18cf9543ed4d4ecbd97e7086f9ce9327ea48891"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5cabb9710f09d5d2e9e2748c3e3e20d991a4c5f96ed8f1132518f54ab2967221"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:82f55187a5bebae7d81d35b1e9aaea5e169d44819789837cdd4720d768c55d15"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1d40f55222b233e98e3921df7811c27567f0e1a4411b93d4c5c0f4ce131bc42f"}, + {file = "pydantic_core-2.10.1-cp37-none-win32.whl", hash = "sha256:14e09ff0b8fe6e46b93d36a878f6e4a3a98ba5303c76bb8e716f4878a3bee92c"}, + {file = "pydantic_core-2.10.1-cp37-none-win_amd64.whl", hash = "sha256:1396e81b83516b9d5c9e26a924fa69164156c148c717131f54f586485ac3c15e"}, + {file = "pydantic_core-2.10.1-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:6835451b57c1b467b95ffb03a38bb75b52fb4dc2762bb1d9dbed8de31ea7d0fc"}, + {file = "pydantic_core-2.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b00bc4619f60c853556b35f83731bd817f989cba3e97dc792bb8c97941b8053a"}, + {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fa467fd300a6f046bdb248d40cd015b21b7576c168a6bb20aa22e595c8ffcdd"}, + {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d99277877daf2efe074eae6338453a4ed54a2d93fb4678ddfe1209a0c93a2468"}, + {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa7db7558607afeccb33c0e4bf1c9a9a835e26599e76af6fe2fcea45904083a6"}, + {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aad7bd686363d1ce4ee930ad39f14e1673248373f4a9d74d2b9554f06199fb58"}, + {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:443fed67d33aa85357464f297e3d26e570267d1af6fef1c21ca50921d2976302"}, + {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:042462d8d6ba707fd3ce9649e7bf268633a41018d6a998fb5fbacb7e928a183e"}, + {file = "pydantic_core-2.10.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ecdbde46235f3d560b18be0cb706c8e8ad1b965e5c13bbba7450c86064e96561"}, + {file = "pydantic_core-2.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ed550ed05540c03f0e69e6d74ad58d026de61b9eaebebbaaf8873e585cbb18de"}, + {file = "pydantic_core-2.10.1-cp38-none-win32.whl", hash = "sha256:8cdbbd92154db2fec4ec973d45c565e767ddc20aa6dbaf50142676484cbff8ee"}, + {file = "pydantic_core-2.10.1-cp38-none-win_amd64.whl", hash = "sha256:9f6f3e2598604956480f6c8aa24a3384dbf6509fe995d97f6ca6103bb8c2534e"}, + {file = "pydantic_core-2.10.1-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:655f8f4c8d6a5963c9a0687793da37b9b681d9ad06f29438a3b2326d4e6b7970"}, + {file = "pydantic_core-2.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e570ffeb2170e116a5b17e83f19911020ac79d19c96f320cbfa1fa96b470185b"}, + {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64322bfa13e44c6c30c518729ef08fda6026b96d5c0be724b3c4ae4da939f875"}, + {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:485a91abe3a07c3a8d1e082ba29254eea3e2bb13cbbd4351ea4e5a21912cc9b0"}, + {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7c2b8eb9fc872e68b46eeaf835e86bccc3a58ba57d0eedc109cbb14177be531"}, + {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a5cb87bdc2e5f620693148b5f8f842d293cae46c5f15a1b1bf7ceeed324a740c"}, + {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25bd966103890ccfa028841a8f30cebcf5875eeac8c4bde4fe221364c92f0c9a"}, + {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f323306d0556351735b54acbf82904fe30a27b6a7147153cbe6e19aaaa2aa429"}, + {file = "pydantic_core-2.10.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0c27f38dc4fbf07b358b2bc90edf35e82d1703e22ff2efa4af4ad5de1b3833e7"}, + {file = "pydantic_core-2.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f1365e032a477c1430cfe0cf2856679529a2331426f8081172c4a74186f1d595"}, + {file = "pydantic_core-2.10.1-cp39-none-win32.whl", hash = "sha256:a1c311fd06ab3b10805abb72109f01a134019739bd3286b8ae1bc2fc4e50c07a"}, + {file = "pydantic_core-2.10.1-cp39-none-win_amd64.whl", hash = "sha256:ae8a8843b11dc0b03b57b52793e391f0122e740de3df1474814c700d2622950a"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d43002441932f9a9ea5d6f9efaa2e21458221a3a4b417a14027a1d530201ef1b"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fcb83175cc4936a5425dde3356f079ae03c0802bbdf8ff82c035f8a54b333521"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:962ed72424bf1f72334e2f1e61b68f16c0e596f024ca7ac5daf229f7c26e4208"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cf5bb4dd67f20f3bbc1209ef572a259027c49e5ff694fa56bed62959b41e1f9"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e544246b859f17373bed915182ab841b80849ed9cf23f1f07b73b7c58baee5fb"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c0877239307b7e69d025b73774e88e86ce82f6ba6adf98f41069d5b0b78bd1bf"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:53df009d1e1ba40f696f8995683e067e3967101d4bb4ea6f667931b7d4a01357"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a1254357f7e4c82e77c348dabf2d55f1d14d19d91ff025004775e70a6ef40ada"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:524ff0ca3baea164d6d93a32c58ac79eca9f6cf713586fdc0adb66a8cdeab96a"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f0ac9fb8608dbc6eaf17956bf623c9119b4db7dbb511650910a82e261e6600f"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:320f14bd4542a04ab23747ff2c8a778bde727158b606e2661349557f0770711e"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:63974d168b6233b4ed6a0046296803cb13c56637a7b8106564ab575926572a55"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:417243bf599ba1f1fef2bb8c543ceb918676954734e2dcb82bf162ae9d7bd514"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:dda81e5ec82485155a19d9624cfcca9be88a405e2857354e5b089c2a982144b2"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:14cfbb00959259e15d684505263d5a21732b31248a5dd4941f73a3be233865b9"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:631cb7415225954fdcc2a024119101946793e5923f6c4d73a5914d27eb3d3a05"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:bec7dd208a4182e99c5b6c501ce0b1f49de2802448d4056091f8e630b28e9a52"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:149b8a07712f45b332faee1a2258d8ef1fb4a36f88c0c17cb687f205c5dc6e7d"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d966c47f9dd73c2d32a809d2be529112d509321c5310ebf54076812e6ecd884"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7eb037106f5c6b3b0b864ad226b0b7ab58157124161d48e4b30c4a43fef8bc4b"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:154ea7c52e32dce13065dbb20a4a6f0cc012b4f667ac90d648d36b12007fa9f7"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e562617a45b5a9da5be4abe72b971d4f00bf8555eb29bb91ec2ef2be348cd132"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f23b55eb5464468f9e0e9a9935ce3ed2a870608d5f534025cd5536bca25b1402"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:e9121b4009339b0f751955baf4543a0bfd6bc3f8188f8056b1a25a2d45099934"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:0523aeb76e03f753b58be33b26540880bac5aa54422e4462404c432230543f33"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e0e2959ef5d5b8dc9ef21e1a305a21a36e254e6a34432d00c72a92fdc5ecda5"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da01bec0a26befab4898ed83b362993c844b9a607a86add78604186297eb047e"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f2e9072d71c1f6cfc79a36d4484c82823c560e6f5599c43c1ca6b5cdbd54f881"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f36a3489d9e28fe4b67be9992a23029c3cec0babc3bd9afb39f49844a8c721c5"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f64f82cc3443149292b32387086d02a6c7fb39b8781563e0ca7b8d7d9cf72bd7"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b4a6db486ac8e99ae696e09efc8b2b9fea67b63c8f88ba7a1a16c24a057a0776"}, + {file = "pydantic_core-2.10.1.tar.gz", hash = "sha256:0f8682dbdd2f67f8e1edddcbffcc29f60a6182b4901c367fc8c1c40d30bb0a82"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pydata-google-auth" @@ -5739,40 +6298,59 @@ google-auth = {version = ">=1.25.0,<3.0dev", markers = "python_version >= \"3.6\ google-auth-oauthlib = {version = ">=0.4.0", markers = "python_version >= \"3.6\""} setuptools = "*" +[[package]] +name = "pydoclint" +version = "0.3.8" +description = "A Python docstring linter that checks arguments, returns, yields, and raises sections" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydoclint-0.3.8-py2.py3-none-any.whl", hash = "sha256:8e5e020071bb64056fd3f1d68f3b1162ffeb8a3fd6424f73fef7272dac62c166"}, + {file = "pydoclint-0.3.8.tar.gz", hash = "sha256:5a9686a5fb410343e998402686b87cc07df647ea3ab92528c0b0cf8505584e44"}, +] + +[package.dependencies] +click = ">=8.0.0" +docstring-parser-fork = ">=0.0.5" +tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +flake8 = ["flake8 (>=4)"] + [[package]] name = "pyflakes" -version = "2.5.0" +version = "3.1.0" description = "passive checker of Python programs" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, - {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, + {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, + {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, ] [[package]] -name = "Pygments" -version = "2.15.1" +name = "pygments" +version = "2.16.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ - {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, - {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, ] [package.extras] plugins = ["importlib-metadata"] [[package]] -name = "PyJWT" -version = "2.6.0" +name = "pyjwt" +version = "2.8.0" description = "JSON Web Token implementation in Python" optional = false python-versions = ">=3.7" files = [ - {file = "PyJWT-2.6.0-py3-none-any.whl", hash = "sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14"}, - {file = "PyJWT-2.6.0.tar.gz", hash = "sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd"}, + {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, + {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, ] [package.dependencies] @@ -5796,19 +6374,22 @@ files = [ [[package]] name = "pymdown-extensions" -version = "9.11" +version = "10.5" description = "Extension pack for Python Markdown." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-9.11-py3-none-any.whl", hash = "sha256:a499191d8d869f30339de86fcf072a787e86c42b6f16f280f5c2cf174182b7f3"}, - {file = "pymdown_extensions-9.11.tar.gz", hash = "sha256:f7e86c1d3981f23d9dc43294488ecb54abadd05b0be4bf8f0e15efc90f7853ff"}, + {file = "pymdown_extensions-10.5-py3-none-any.whl", hash = "sha256:1f0ca8bb5beff091315f793ee17683bc1390731f6ac4c5eb01e27464b80fe879"}, + {file = "pymdown_extensions-10.5.tar.gz", hash = "sha256:1b60f1e462adbec5a1ed79dac91f666c9c0d241fa294de1989f29d20096cfd0b"}, ] [package.dependencies] -markdown = ">=3.2" +markdown = ">=3.5" pyyaml = "*" +[package.extras] +extra = ["pygments (>=2.12)"] + [[package]] name = "pyopenssl" version = "23.2.0" @@ -5829,13 +6410,13 @@ test = ["flaky", "pretend", "pytest (>=3.0.1)"] [[package]] name = "pyparsing" -version = "3.0.9" +version = "3.1.1" 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"}, + {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, + {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, ] [package.extras] @@ -5843,12 +6424,12 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyspark" -version = "3.3.0" +version = "3.3.4" description = "Apache Spark Python API" optional = false python-versions = ">=3.7" files = [ - {file = "pyspark-3.3.0.tar.gz", hash = "sha256:7ebe8e9505647b4d124d5a82fca60dfd3891021cf8ad6c5ec88777eeece92cf7"}, + {file = "pyspark-3.3.4.tar.gz", hash = "sha256:1f866be47130a522355240949ed50d9812a8f327bd7619f043ffe07fbcf7f7b6"}, ] [package.dependencies] @@ -5862,13 +6443,13 @@ sql = ["pandas (>=1.0.5)", "pyarrow (>=1.0.0)"] [[package]] name = "pytest" -version = "7.3.1" +version = "7.4.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, - {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, + {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"}, + {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"}, ] [package.dependencies] @@ -5880,17 +6461,17 @@ 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", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-cov" -version = "4.0.0" +version = "4.1.0" description = "Pytest plugin for measuring coverage." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pytest-cov-4.0.0.tar.gz", hash = "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470"}, - {file = "pytest_cov-4.0.0-py3-none-any.whl", hash = "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b"}, + {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] @@ -5921,13 +6502,13 @@ dev = ["black", "flake8", "pre-commit"] [[package]] name = "pytest-xdist" -version = "3.3.1" +version = "3.5.0" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-xdist-3.3.1.tar.gz", hash = "sha256:d5ee0520eb1b7bcca50a60a518ab7a7707992812c578198f8b44fdfac78e8c93"}, - {file = "pytest_xdist-3.3.1-py3-none-any.whl", hash = "sha256:ff9daa7793569e6a68544850fd3927cd257cc03a7ef76c95e86915355e82b5f2"}, + {file = "pytest-xdist-3.5.0.tar.gz", hash = "sha256:cbb36f3d67e0c478baa57fa4edc8843887e0f6cfc42d677530a36d7472b32d8a"}, + {file = "pytest_xdist-3.5.0-py3-none-any.whl", hash = "sha256:d075629c7e00b611df89f490a5063944bee7a4362a5ff11c7cc7824a03dfce24"}, ] [package.dependencies] @@ -5973,6 +6554,25 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "python-gitlab" +version = "3.15.0" +description = "Interact with GitLab API" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "python-gitlab-3.15.0.tar.gz", hash = "sha256:c9e65eb7612a9fbb8abf0339972eca7fd7a73d4da66c9b446ffe528930aff534"}, + {file = "python_gitlab-3.15.0-py3-none-any.whl", hash = "sha256:8f8d1c0d387f642eb1ac7bf5e8e0cd8b3dd49c6f34170cee3c7deb7d384611f3"}, +] + +[package.dependencies] +requests = ">=2.25.0" +requests-toolbelt = ">=0.10.1" + +[package.extras] +autocompletion = ["argcomplete (>=1.10.0,<3)"] +yaml = ["PyYaml (>=5.2)"] + [[package]] name = "python-json-logger" version = "2.0.7" @@ -5998,6 +6598,36 @@ files = [ Jinja2 = ">=2.8" python-slugify = ">=1.2.5" +[[package]] +name = "python-semantic-release" +version = "8.7.0" +description = "Automatic Semantic Versioning for Python projects" +optional = false +python-versions = ">=3.7" +files = [ + {file = "python-semantic-release-8.7.0.tar.gz", hash = "sha256:6bbd11b1e8ac70e0946ed6d257094c851b2507edfbc393eef6093d0ed1dbe0b4"}, + {file = "python_semantic_release-8.7.0-py3-none-any.whl", hash = "sha256:a016b1cf43a5f3667ce2cfddd8e30b6210a2d52b0e2f6b487aae1164f2540eaa"}, +] + +[package.dependencies] +click = ">=8,<9" +dotty-dict = ">=1.3.0,<2" +gitpython = ">=3.0.8,<4" +importlib-resources = ">=5.7,<7" +jinja2 = ">=3.1.2,<4" +pydantic = ">=2,<3" +python-gitlab = ">=2,<5" +requests = ">=2.25,<3" +rich = ">=12.5.1" +shellingham = ">=1.5.0.post1" +tomlkit = ">=0.10,<1.0" + +[package.extras] +dev = ["pre-commit", "ruff (==0.1.8)", "tox"] +docs = ["Sphinx (<=6.0.0)", "furo (>=2023.3.27)", "sphinx-autobuild (==2021.03.14)", "sphinxcontrib-apidoc (==0.3.0)"] +mypy = ["mypy", "types-requests"] +test = ["coverage[toml] (>=6,<8)", "pytest (>=7,<8)", "pytest-clarity (>=1.0.1)", "pytest-cov (>=4,<5)", "pytest-lazy-fixture (>=0.6.3,<0.7.0)", "pytest-mock (>=3,<4)", "pytest-pretty (>=1.2.0,<2)", "pytest-xdist (>=2,<4)", "requests-mock (>=1.10.0,<2)", "responses (==0.23.3)", "types-pytest-lazy-fixture (>=0.6.3.3)"] + [[package]] name = "python-slugify" version = "8.0.1" @@ -6017,13 +6647,13 @@ unidecode = ["Unidecode (>=1.1.1)"] [[package]] name = "pytz" -version = "2023.3" +version = "2023.3.post1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, - {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, ] [[package]] @@ -6061,56 +6691,66 @@ files = [ ] [[package]] -name = "PyYAML" -version = "6.0" +name = "pyyaml" +version = "6.0.1" 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 = "pyyaml_env_tag" + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "pyyaml-env-tag" version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " optional = false @@ -6125,88 +6765,104 @@ pyyaml = "*" [[package]] name = "pyzmq" -version = "25.0.2" +version = "25.1.1" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.6" files = [ - {file = "pyzmq-25.0.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ac178e666c097c8d3deb5097b58cd1316092fc43e8ef5b5fdb259b51da7e7315"}, - {file = "pyzmq-25.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:659e62e1cbb063151c52f5b01a38e1df6b54feccfa3e2509d44c35ca6d7962ee"}, - {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8280ada89010735a12b968ec3ea9a468ac2e04fddcc1cede59cb7f5178783b9c"}, - {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9b5eeb5278a8a636bb0abdd9ff5076bcbb836cd2302565df53ff1fa7d106d54"}, - {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a2e5fe42dfe6b73ca120b97ac9f34bfa8414feb15e00e37415dbd51cf227ef6"}, - {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:827bf60e749e78acb408a6c5af6688efbc9993e44ecc792b036ec2f4b4acf485"}, - {file = "pyzmq-25.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7b504ae43d37e282301da586529e2ded8b36d4ee2cd5e6db4386724ddeaa6bbc"}, - {file = "pyzmq-25.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb1f69a0a2a2b1aae8412979dd6293cc6bcddd4439bf07e4758d864ddb112354"}, - {file = "pyzmq-25.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b9c9cc965cdf28381e36da525dcb89fc1571d9c54800fdcd73e3f73a2fc29bd"}, - {file = "pyzmq-25.0.2-cp310-cp310-win32.whl", hash = "sha256:24abbfdbb75ac5039205e72d6c75f10fc39d925f2df8ff21ebc74179488ebfca"}, - {file = "pyzmq-25.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6a821a506822fac55d2df2085a52530f68ab15ceed12d63539adc32bd4410f6e"}, - {file = "pyzmq-25.0.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:9af0bb0277e92f41af35e991c242c9c71920169d6aa53ade7e444f338f4c8128"}, - {file = "pyzmq-25.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:54a96cf77684a3a537b76acfa7237b1e79a8f8d14e7f00e0171a94b346c5293e"}, - {file = "pyzmq-25.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88649b19ede1cab03b96b66c364cbbf17c953615cdbc844f7f6e5f14c5e5261c"}, - {file = "pyzmq-25.0.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:715cff7644a80a7795953c11b067a75f16eb9fc695a5a53316891ebee7f3c9d5"}, - {file = "pyzmq-25.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:312b3f0f066b4f1d17383aae509bacf833ccaf591184a1f3c7a1661c085063ae"}, - {file = "pyzmq-25.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d488c5c8630f7e782e800869f82744c3aca4aca62c63232e5d8c490d3d66956a"}, - {file = "pyzmq-25.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:38d9f78d69bcdeec0c11e0feb3bc70f36f9b8c44fc06e5d06d91dc0a21b453c7"}, - {file = "pyzmq-25.0.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3059a6a534c910e1d5d068df42f60d434f79e6cc6285aa469b384fa921f78cf8"}, - {file = "pyzmq-25.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6526d097b75192f228c09d48420854d53dfbc7abbb41b0e26f363ccb26fbc177"}, - {file = "pyzmq-25.0.2-cp311-cp311-win32.whl", hash = "sha256:5c5fbb229e40a89a2fe73d0c1181916f31e30f253cb2d6d91bea7927c2e18413"}, - {file = "pyzmq-25.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:ed15e3a2c3c2398e6ae5ce86d6a31b452dfd6ad4cd5d312596b30929c4b6e182"}, - {file = "pyzmq-25.0.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:032f5c8483c85bf9c9ca0593a11c7c749d734ce68d435e38c3f72e759b98b3c9"}, - {file = "pyzmq-25.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:374b55516393bfd4d7a7daa6c3b36d6dd6a31ff9d2adad0838cd6a203125e714"}, - {file = "pyzmq-25.0.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:08bfcc21b5997a9be4fefa405341320d8e7f19b4d684fb9c0580255c5bd6d695"}, - {file = "pyzmq-25.0.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1a843d26a8da1b752c74bc019c7b20e6791ee813cd6877449e6a1415589d22ff"}, - {file = "pyzmq-25.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:b48616a09d7df9dbae2f45a0256eee7b794b903ddc6d8657a9948669b345f220"}, - {file = "pyzmq-25.0.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d4427b4a136e3b7f85516c76dd2e0756c22eec4026afb76ca1397152b0ca8145"}, - {file = "pyzmq-25.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:26b0358e8933990502f4513c991c9935b6c06af01787a36d133b7c39b1df37fa"}, - {file = "pyzmq-25.0.2-cp36-cp36m-win32.whl", hash = "sha256:c8fedc3ccd62c6b77dfe6f43802057a803a411ee96f14e946f4a76ec4ed0e117"}, - {file = "pyzmq-25.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:2da6813b7995b6b1d1307329c73d3e3be2fd2d78e19acfc4eff2e27262732388"}, - {file = "pyzmq-25.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a35960c8b2f63e4ef67fd6731851030df68e4b617a6715dd11b4b10312d19fef"}, - {file = "pyzmq-25.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eef2a0b880ab40aca5a878933376cb6c1ec483fba72f7f34e015c0f675c90b20"}, - {file = "pyzmq-25.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:85762712b74c7bd18e340c3639d1bf2f23735a998d63f46bb6584d904b5e401d"}, - {file = "pyzmq-25.0.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:64812f29d6eee565e129ca14b0c785744bfff679a4727137484101b34602d1a7"}, - {file = "pyzmq-25.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:510d8e55b3a7cd13f8d3e9121edf0a8730b87d925d25298bace29a7e7bc82810"}, - {file = "pyzmq-25.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b164cc3c8acb3d102e311f2eb6f3c305865ecb377e56adc015cb51f721f1dda6"}, - {file = "pyzmq-25.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:28fdb9224a258134784a9cf009b59265a9dde79582fb750d4e88a6bcbc6fa3dc"}, - {file = "pyzmq-25.0.2-cp37-cp37m-win32.whl", hash = "sha256:dd771a440effa1c36d3523bc6ba4e54ff5d2e54b4adcc1e060d8f3ca3721d228"}, - {file = "pyzmq-25.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:9bdc40efb679b9dcc39c06d25629e55581e4c4f7870a5e88db4f1c51ce25e20d"}, - {file = "pyzmq-25.0.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:1f82906a2d8e4ee310f30487b165e7cc8ed09c009e4502da67178b03083c4ce0"}, - {file = "pyzmq-25.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:21ec0bf4831988af43c8d66ba3ccd81af2c5e793e1bf6790eb2d50e27b3c570a"}, - {file = "pyzmq-25.0.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbce982a17c88d2312ec2cf7673985d444f1beaac6e8189424e0a0e0448dbb3"}, - {file = "pyzmq-25.0.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9e1d2f2d86fc75ed7f8845a992c5f6f1ab5db99747fb0d78b5e4046d041164d2"}, - {file = "pyzmq-25.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e92ff20ad5d13266bc999a29ed29a3b5b101c21fdf4b2cf420c09db9fb690e"}, - {file = "pyzmq-25.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edbbf06cc2719889470a8d2bf5072bb00f423e12de0eb9ffec946c2c9748e149"}, - {file = "pyzmq-25.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:77942243ff4d14d90c11b2afd8ee6c039b45a0be4e53fb6fa7f5e4fd0b59da39"}, - {file = "pyzmq-25.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ab046e9cb902d1f62c9cc0eca055b1d11108bdc271caf7c2171487298f229b56"}, - {file = "pyzmq-25.0.2-cp38-cp38-win32.whl", hash = "sha256:ad761cfbe477236802a7ab2c080d268c95e784fe30cafa7e055aacd1ca877eb0"}, - {file = "pyzmq-25.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8560756318ec7c4c49d2c341012167e704b5a46d9034905853c3d1ade4f55bee"}, - {file = "pyzmq-25.0.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:ab2c056ac503f25a63f6c8c6771373e2a711b98b304614151dfb552d3d6c81f6"}, - {file = "pyzmq-25.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cca8524b61c0eaaa3505382dc9b9a3bc8165f1d6c010fdd1452c224225a26689"}, - {file = "pyzmq-25.0.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cfb9f7eae02d3ac42fbedad30006b7407c984a0eb4189a1322241a20944d61e5"}, - {file = "pyzmq-25.0.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5eaeae038c68748082137d6896d5c4db7927e9349237ded08ee1bbd94f7361c9"}, - {file = "pyzmq-25.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a31992a8f8d51663ebf79df0df6a04ffb905063083d682d4380ab8d2c67257c"}, - {file = "pyzmq-25.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6a979e59d2184a0c8f2ede4b0810cbdd86b64d99d9cc8a023929e40dce7c86cc"}, - {file = "pyzmq-25.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1f124cb73f1aa6654d31b183810febc8505fd0c597afa127c4f40076be4574e0"}, - {file = "pyzmq-25.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:65c19a63b4a83ae45d62178b70223adeee5f12f3032726b897431b6553aa25af"}, - {file = "pyzmq-25.0.2-cp39-cp39-win32.whl", hash = "sha256:83d822e8687621bed87404afc1c03d83fa2ce39733d54c2fd52d8829edb8a7ff"}, - {file = "pyzmq-25.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:24683285cc6b7bf18ad37d75b9db0e0fefe58404e7001f1d82bf9e721806daa7"}, - {file = "pyzmq-25.0.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a4b4261eb8f9ed71f63b9eb0198dd7c934aa3b3972dac586d0ef502ba9ab08b"}, - {file = "pyzmq-25.0.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:62ec8d979f56c0053a92b2b6a10ff54b9ec8a4f187db2b6ec31ee3dd6d3ca6e2"}, - {file = "pyzmq-25.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:affec1470351178e892121b3414c8ef7803269f207bf9bef85f9a6dd11cde264"}, - {file = "pyzmq-25.0.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffc71111433bd6ec8607a37b9211f4ef42e3d3b271c6d76c813669834764b248"}, - {file = "pyzmq-25.0.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6fadc60970714d86eff27821f8fb01f8328dd36bebd496b0564a500fe4a9e354"}, - {file = "pyzmq-25.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:269968f2a76c0513490aeb3ba0dc3c77b7c7a11daa894f9d1da88d4a0db09835"}, - {file = "pyzmq-25.0.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f7c8b8368e84381ae7c57f1f5283b029c888504aaf4949c32e6e6fb256ec9bf0"}, - {file = "pyzmq-25.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:25e6873a70ad5aa31e4a7c41e5e8c709296edef4a92313e1cd5fc87bbd1874e2"}, - {file = "pyzmq-25.0.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b733076ff46e7db5504c5e7284f04a9852c63214c74688bdb6135808531755a3"}, - {file = "pyzmq-25.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a6f6ae12478fdc26a6d5fdb21f806b08fa5403cd02fd312e4cb5f72df078f96f"}, - {file = "pyzmq-25.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:67da1c213fbd208906ab3470cfff1ee0048838365135a9bddc7b40b11e6d6c89"}, - {file = "pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531e36d9fcd66f18de27434a25b51d137eb546931033f392e85674c7a7cea853"}, - {file = "pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34a6fddd159ff38aa9497b2e342a559f142ab365576284bc8f77cb3ead1f79c5"}, - {file = "pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b491998ef886662c1f3d49ea2198055a9a536ddf7430b051b21054f2a5831800"}, - {file = "pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5d496815074e3e3d183fe2c7fcea2109ad67b74084c254481f87b64e04e9a471"}, - {file = "pyzmq-25.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:56a94ab1d12af982b55ca96c6853db6ac85505e820d9458ac76364c1998972f4"}, - {file = "pyzmq-25.0.2.tar.gz", hash = "sha256:6b8c1bbb70e868dc88801aa532cae6bd4e3b5233784692b786f17ad2962e5149"}, + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:381469297409c5adf9a0e884c5eb5186ed33137badcbbb0560b86e910a2f1e76"}, + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:955215ed0604dac5b01907424dfa28b40f2b2292d6493445dd34d0dfa72586a8"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:985bbb1316192b98f32e25e7b9958088431d853ac63aca1d2c236f40afb17c83"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afea96f64efa98df4da6958bae37f1cbea7932c35878b185e5982821bc883369"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76705c9325d72a81155bb6ab48d4312e0032bf045fb0754889133200f7a0d849"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77a41c26205d2353a4c94d02be51d6cbdf63c06fbc1295ea57dad7e2d3381b71"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:12720a53e61c3b99d87262294e2b375c915fea93c31fc2336898c26d7aed34cd"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:57459b68e5cd85b0be8184382cefd91959cafe79ae019e6b1ae6e2ba8a12cda7"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:292fe3fc5ad4a75bc8df0dfaee7d0babe8b1f4ceb596437213821f761b4589f9"}, + {file = "pyzmq-25.1.1-cp310-cp310-win32.whl", hash = "sha256:35b5ab8c28978fbbb86ea54958cd89f5176ce747c1fb3d87356cf698048a7790"}, + {file = "pyzmq-25.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:11baebdd5fc5b475d484195e49bae2dc64b94a5208f7c89954e9e354fc609d8f"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:d20a0ddb3e989e8807d83225a27e5c2eb2260eaa851532086e9e0fa0d5287d83"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e1c1be77bc5fb77d923850f82e55a928f8638f64a61f00ff18a67c7404faf008"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d89528b4943d27029a2818f847c10c2cecc79fa9590f3cb1860459a5be7933eb"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90f26dc6d5f241ba358bef79be9ce06de58d477ca8485e3291675436d3827cf8"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2b92812bd214018e50b6380ea3ac0c8bb01ac07fcc14c5f86a5bb25e74026e9"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f957ce63d13c28730f7fd6b72333814221c84ca2421298f66e5143f81c9f91f"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:047a640f5c9c6ade7b1cc6680a0e28c9dd5a0825135acbd3569cc96ea00b2505"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7f7e58effd14b641c5e4dec8c7dab02fb67a13df90329e61c869b9cc607ef752"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c2910967e6ab16bf6fbeb1f771c89a7050947221ae12a5b0b60f3bca2ee19bca"}, + {file = "pyzmq-25.1.1-cp311-cp311-win32.whl", hash = "sha256:76c1c8efb3ca3a1818b837aea423ff8a07bbf7aafe9f2f6582b61a0458b1a329"}, + {file = "pyzmq-25.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:44e58a0554b21fc662f2712814a746635ed668d0fbc98b7cb9d74cb798d202e6"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e1ffa1c924e8c72778b9ccd386a7067cddf626884fd8277f503c48bb5f51c762"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1af379b33ef33757224da93e9da62e6471cf4a66d10078cf32bae8127d3d0d4a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cff084c6933680d1f8b2f3b4ff5bbb88538a4aac00d199ac13f49d0698727ecb"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2400a94f7dd9cb20cd012951a0cbf8249e3d554c63a9c0cdfd5cbb6c01d2dec"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d81f1ddae3858b8299d1da72dd7d19dd36aab654c19671aa8a7e7fb02f6638a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:255ca2b219f9e5a3a9ef3081512e1358bd4760ce77828e1028b818ff5610b87b"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a882ac0a351288dd18ecae3326b8a49d10c61a68b01419f3a0b9a306190baf69"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:724c292bb26365659fc434e9567b3f1adbdb5e8d640c936ed901f49e03e5d32e"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ca1ed0bb2d850aa8471387882247c68f1e62a4af0ce9c8a1dbe0d2bf69e41fb"}, + {file = "pyzmq-25.1.1-cp312-cp312-win32.whl", hash = "sha256:b3451108ab861040754fa5208bca4a5496c65875710f76789a9ad27c801a0075"}, + {file = "pyzmq-25.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eadbefd5e92ef8a345f0525b5cfd01cf4e4cc651a2cffb8f23c0dd184975d787"}, + {file = "pyzmq-25.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:db0b2af416ba735c6304c47f75d348f498b92952f5e3e8bff449336d2728795d"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c133e93b405eb0d36fa430c94185bdd13c36204a8635470cccc200723c13bb"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:273bc3959bcbff3f48606b28229b4721716598d76b5aaea2b4a9d0ab454ec062"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cbc8df5c6a88ba5ae385d8930da02201165408dde8d8322072e3e5ddd4f68e22"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:18d43df3f2302d836f2a56f17e5663e398416e9dd74b205b179065e61f1a6edf"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:73461eed88a88c866656e08f89299720a38cb4e9d34ae6bf5df6f71102570f2e"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:34c850ce7976d19ebe7b9d4b9bb8c9dfc7aac336c0958e2651b88cbd46682123"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win32.whl", hash = "sha256:d2045d6d9439a0078f2a34b57c7b18c4a6aef0bee37f22e4ec9f32456c852c71"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:458dea649f2f02a0b244ae6aef8dc29325a2810aa26b07af8374dc2a9faf57e3"}, + {file = "pyzmq-25.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cff25c5b315e63b07a36f0c2bab32c58eafbe57d0dce61b614ef4c76058c115"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1579413ae492b05de5a6174574f8c44c2b9b122a42015c5292afa4be2507f28"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3d0a409d3b28607cc427aa5c30a6f1e4452cc44e311f843e05edb28ab5e36da0"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21eb4e609a154a57c520e3d5bfa0d97e49b6872ea057b7c85257b11e78068222"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:034239843541ef7a1aee0c7b2cb7f6aafffb005ede965ae9cbd49d5ff4ff73cf"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f8115e303280ba09f3898194791a153862cbf9eef722ad8f7f741987ee2a97c7"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a5d26fe8f32f137e784f768143728438877d69a586ddeaad898558dc971a5ae"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win32.whl", hash = "sha256:f32260e556a983bc5c7ed588d04c942c9a8f9c2e99213fec11a031e316874c7e"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf34e43c531bbb510ae7e8f5b2b1f2a8ab93219510e2b287a944432fad135f3"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:87e34f31ca8f168c56d6fbf99692cc8d3b445abb5bfd08c229ae992d7547a92a"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c9c6c9b2c2f80747a98f34ef491c4d7b1a8d4853937bb1492774992a120f475d"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5619f3f5a4db5dbb572b095ea3cb5cc035335159d9da950830c9c4db2fbb6995"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a34d2395073ef862b4032343cf0c32a712f3ab49d7ec4f42c9661e0294d106f"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0e6b78220aba09815cd1f3a32b9c7cb3e02cb846d1cfc526b6595f6046618"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3669cf8ee3520c2f13b2e0351c41fea919852b220988d2049249db10046a7afb"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2d163a18819277e49911f7461567bda923461c50b19d169a062536fffe7cd9d2"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:df27ffddff4190667d40de7beba4a950b5ce78fe28a7dcc41d6f8a700a80a3c0"}, + {file = "pyzmq-25.1.1-cp38-cp38-win32.whl", hash = "sha256:a382372898a07479bd34bda781008e4a954ed8750f17891e794521c3e21c2e1c"}, + {file = "pyzmq-25.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:52533489f28d62eb1258a965f2aba28a82aa747202c8fa5a1c7a43b5db0e85c1"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:03b3f49b57264909aacd0741892f2aecf2f51fb053e7d8ac6767f6c700832f45"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:330f9e188d0d89080cde66dc7470f57d1926ff2fb5576227f14d5be7ab30b9fa"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2ca57a5be0389f2a65e6d3bb2962a971688cbdd30b4c0bd188c99e39c234f414"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d457aed310f2670f59cc5b57dcfced452aeeed77f9da2b9763616bd57e4dbaae"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56d748ea50215abef7030c72b60dd723ed5b5c7e65e7bc2504e77843631c1a6"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f03d3f0d01cb5a018debeb412441996a517b11c5c17ab2001aa0597c6d6882c"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:820c4a08195a681252f46926de10e29b6bbf3e17b30037bd4250d72dd3ddaab8"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17ef5f01d25b67ca8f98120d5fa1d21efe9611604e8eb03a5147360f517dd1e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win32.whl", hash = "sha256:04ccbed567171579ec2cebb9c8a3e30801723c575601f9a990ab25bcac6b51e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e61f091c3ba0c3578411ef505992d356a812fb200643eab27f4f70eed34a29ef"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ade6d25bb29c4555d718ac6d1443a7386595528c33d6b133b258f65f963bb0f6"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c95ddd4f6e9fca4e9e3afaa4f9df8552f0ba5d1004e89ef0a68e1f1f9807c7"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48e466162a24daf86f6b5ca72444d2bf39a5e58da5f96370078be67c67adc978"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc719161780932c4e11aaebb203be3d6acc6b38d2f26c0f523b5b59d2fc1996"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ccf825981640b8c34ae54231b7ed00271822ea1c6d8ba1090ebd4943759abf5"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2f20ce161ebdb0091a10c9ca0372e023ce24980d0e1f810f519da6f79c60800"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:deee9ca4727f53464daf089536e68b13e6104e84a37820a88b0a057b97bba2d2"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa8d6cdc8b8aa19ceb319aaa2b660cdaccc533ec477eeb1309e2a291eaacc43a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019e59ef5c5256a2c7378f2fb8560fc2a9ff1d315755204295b2eab96b254d0a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b9af3757495c1ee3b5c4e945c1df7be95562277c6e5bccc20a39aec50f826cd0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:548d6482dc8aadbe7e79d1b5806585c8120bafa1ef841167bc9090522b610fa6"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:057e824b2aae50accc0f9a0570998adc021b372478a921506fddd6c02e60308e"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2243700cc5548cff20963f0ca92d3e5e436394375ab8a354bbea2b12911b20b0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79986f3b4af059777111409ee517da24a529bdbd46da578b33f25580adcff728"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:11d58723d44d6ed4dd677c5615b2ffb19d5c426636345567d6af82be4dff8a55"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:49d238cf4b69652257db66d0c623cd3e09b5d2e9576b56bc067a396133a00d4a"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fedbdc753827cf014c01dbbee9c3be17e5a208dcd1bf8641ce2cd29580d1f0d4"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc16ac425cc927d0a57d242589f87ee093884ea4804c05a13834d07c20db203c"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11c1d2aed9079c6b0c9550a7257a836b4a637feb334904610f06d70eb44c56d2"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e8a701123029cc240cea61dd2d16ad57cab4691804143ce80ecd9286b464d180"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61706a6b6c24bdece85ff177fec393545a3191eeda35b07aaa1458a027ad1304"}, + {file = "pyzmq-25.1.1.tar.gz", hash = "sha256:259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23"}, ] [package.dependencies] @@ -6229,89 +6885,117 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2023.3.23" +version = "2023.10.3" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "regex-2023.3.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:845a5e2d84389c4ddada1a9b95c055320070f18bb76512608374aca00d22eca8"}, - {file = "regex-2023.3.23-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:87d9951f5a538dd1d016bdc0dcae59241d15fa94860964833a54d18197fcd134"}, - {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37ae17d3be44c0b3f782c28ae9edd8b47c1f1776d4cabe87edc0b98e1f12b021"}, - {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b8eb1e3bca6b48dc721818a60ae83b8264d4089a4a41d62be6d05316ec38e15"}, - {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df45fac182ebc3c494460c644e853515cc24f5ad9da05f8ffb91da891bfee879"}, - {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7006105b10b59971d3b248ad75acc3651c7e4cf54d81694df5a5130a3c3f7ea"}, - {file = "regex-2023.3.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93f3f1aa608380fe294aa4cb82e2afda07a7598e828d0341e124b8fd9327c715"}, - {file = "regex-2023.3.23-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787954f541ab95d8195d97b0b8cf1dc304424adb1e07365967e656b92b38a699"}, - {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:20abe0bdf03630fe92ccafc45a599bca8b3501f48d1de4f7d121153350a2f77d"}, - {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11d00c31aeab9a6e0503bc77e73ed9f4527b3984279d997eb145d7c7be6268fd"}, - {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d5bbe0e1511b844794a3be43d6c145001626ba9a6c1db8f84bdc724e91131d9d"}, - {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ea3c0cb56eadbf4ab2277e7a095676370b3e46dbfc74d5c383bd87b0d6317910"}, - {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d895b4c863059a4934d3e874b90998df774644a41b349ebb330f85f11b4ef2c0"}, - {file = "regex-2023.3.23-cp310-cp310-win32.whl", hash = "sha256:9d764514d19b4edcc75fd8cb1423448ef393e8b6cbd94f38cab983ab1b75855d"}, - {file = "regex-2023.3.23-cp310-cp310-win_amd64.whl", hash = "sha256:11d1f2b7a0696dc0310de0efb51b1f4d813ad4401fe368e83c0c62f344429f98"}, - {file = "regex-2023.3.23-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8a9c63cde0eaa345795c0fdeb19dc62d22e378c50b0bc67bf4667cd5b482d98b"}, - {file = "regex-2023.3.23-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dd7200b4c27b68cf9c9646da01647141c6db09f48cc5b51bc588deaf8e98a797"}, - {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22720024b90a6ba673a725dcc62e10fb1111b889305d7c6b887ac7466b74bedb"}, - {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b190a339090e6af25f4a5fd9e77591f6d911cc7b96ecbb2114890b061be0ac1"}, - {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e76b6fc0d8e9efa39100369a9b3379ce35e20f6c75365653cf58d282ad290f6f"}, - {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7868b8f218bf69a2a15402fde08b08712213a1f4b85a156d90473a6fb6b12b09"}, - {file = "regex-2023.3.23-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2472428efc4127374f494e570e36b30bb5e6b37d9a754f7667f7073e43b0abdd"}, - {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c37df2a060cb476d94c047b18572ee2b37c31f831df126c0da3cd9227b39253d"}, - {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4479f9e2abc03362df4045b1332d4a2b7885b245a30d4f4b051c4083b97d95d8"}, - {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2396e0678167f2d0c197da942b0b3fb48fee2f0b5915a0feb84d11b6686afe6"}, - {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75f288c60232a5339e0ff2fa05779a5e9c74e9fc085c81e931d4a264501e745b"}, - {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c869260aa62cee21c5eb171a466c0572b5e809213612ef8d495268cd2e34f20d"}, - {file = "regex-2023.3.23-cp311-cp311-win32.whl", hash = "sha256:25f0532fd0c53e96bad84664171969de9673b4131f2297f1db850d3918d58858"}, - {file = "regex-2023.3.23-cp311-cp311-win_amd64.whl", hash = "sha256:5ccfafd98473e007cebf7da10c1411035b7844f0f204015efd050601906dbb53"}, - {file = "regex-2023.3.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6572ff287176c0fb96568adb292674b421fa762153ed074d94b1d939ed92c253"}, - {file = "regex-2023.3.23-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a610e0adfcb0fc84ea25f6ea685e39e74cbcd9245a72a9a7aab85ff755a5ed27"}, - {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086afe222d58b88b62847bdbd92079b4699350b4acab892f88a935db5707c790"}, - {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79e29fd62fa2f597a6754b247356bda14b866131a22444d67f907d6d341e10f3"}, - {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c07ce8e9eee878a48ebeb32ee661b49504b85e164b05bebf25420705709fdd31"}, - {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b036f401895e854de9fefe061518e78d506d8a919cc250dc3416bca03f6f9a"}, - {file = "regex-2023.3.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78ac8dd8e18800bb1f97aad0d73f68916592dddf233b99d2b5cabc562088503a"}, - {file = "regex-2023.3.23-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:539dd010dc35af935b32f248099e38447bbffc10b59c2b542bceead2bed5c325"}, - {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9bf4a5626f2a0ea006bf81e8963f498a57a47d58907eaa58f4b3e13be68759d8"}, - {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf86b4328c204c3f315074a61bc1c06f8a75a8e102359f18ce99fbcbbf1951f0"}, - {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:2848bf76673c83314068241c8d5b7fa9ad9bed866c979875a0e84039349e8fa7"}, - {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c125a02d22c555e68f7433bac8449992fa1cead525399f14e47c2d98f2f0e467"}, - {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cd1671e9d5ac05ce6aa86874dd8dfa048824d1dbe73060851b310c6c1a201a96"}, - {file = "regex-2023.3.23-cp38-cp38-win32.whl", hash = "sha256:fffe57312a358be6ec6baeb43d253c36e5790e436b7bf5b7a38df360363e88e9"}, - {file = "regex-2023.3.23-cp38-cp38-win_amd64.whl", hash = "sha256:dbb3f87e15d3dd76996d604af8678316ad2d7d20faa394e92d9394dfd621fd0c"}, - {file = "regex-2023.3.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c88e8c226473b5549fe9616980ea7ca09289246cfbdf469241edf4741a620004"}, - {file = "regex-2023.3.23-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6560776ec19c83f3645bbc5db64a7a5816c9d8fb7ed7201c5bcd269323d88072"}, - {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b1fc2632c01f42e06173d8dd9bb2e74ab9b0afa1d698058c867288d2c7a31f3"}, - {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fdf7ad455f1916b8ea5cdbc482d379f6daf93f3867b4232d14699867a5a13af7"}, - {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5fc33b27b1d800fc5b78d7f7d0f287e35079ecabe68e83d46930cf45690e1c8c"}, - {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c49552dc938e3588f63f8a78c86f3c9c75301e813bca0bef13bdb4b87ccf364"}, - {file = "regex-2023.3.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e152461e9a0aedec7d37fc66ec0fa635eca984777d3d3c3e36f53bf3d3ceb16e"}, - {file = "regex-2023.3.23-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db034255e72d2995cf581b14bb3fc9c00bdbe6822b49fcd4eef79e1d5f232618"}, - {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:55ae114da21b7a790b90255ea52d2aa3a0d121a646deb2d3c6a3194e722fc762"}, - {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ef3f528fe1cc3d139508fe1b22523745aa77b9d6cb5b0bf277f48788ee0b993f"}, - {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:a81c9ec59ca2303acd1ccd7b9ac409f1e478e40e96f8f79b943be476c5fdb8bb"}, - {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cde09c4fdd070772aa2596d97e942eb775a478b32459e042e1be71b739d08b77"}, - {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3cd9f5dd7b821f141d3a6ca0d5d9359b9221e4f051ca3139320adea9f1679691"}, - {file = "regex-2023.3.23-cp39-cp39-win32.whl", hash = "sha256:7304863f3a652dab5e68e6fb1725d05ebab36ec0390676d1736e0571ebb713ef"}, - {file = "regex-2023.3.23-cp39-cp39-win_amd64.whl", hash = "sha256:54c3fa855a3f7438149de3211738dd9b5f0c733f48b54ae05aa7fce83d48d858"}, - {file = "regex-2023.3.23.tar.gz", hash = "sha256:dc80df325b43ffea5cdea2e3eaa97a44f3dd298262b1c7fe9dbb2a9522b956a7"}, + {file = "regex-2023.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c34d4f73ea738223a094d8e0ffd6d2c1a1b4c175da34d6b0de3d8d69bee6bcc"}, + {file = "regex-2023.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8f4e49fc3ce020f65411432183e6775f24e02dff617281094ba6ab079ef0915"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cd1bccf99d3ef1ab6ba835308ad85be040e6a11b0977ef7ea8c8005f01a3c29"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81dce2ddc9f6e8f543d94b05d56e70d03a0774d32f6cca53e978dc01e4fc75b8"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c6b4d23c04831e3ab61717a707a5d763b300213db49ca680edf8bf13ab5d91b"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c15ad0aee158a15e17e0495e1e18741573d04eb6da06d8b84af726cfc1ed02ee"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6239d4e2e0b52c8bd38c51b760cd870069f0bdf99700a62cd509d7a031749a55"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4a8bf76e3182797c6b1afa5b822d1d5802ff30284abe4599e1247be4fd6b03be"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9c727bbcf0065cbb20f39d2b4f932f8fa1631c3e01fcedc979bd4f51fe051c5"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3ccf2716add72f80714b9a63899b67fa711b654be3fcdd34fa391d2d274ce767"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:107ac60d1bfdc3edb53be75e2a52aff7481b92817cfdddd9b4519ccf0e54a6ff"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:00ba3c9818e33f1fa974693fb55d24cdc8ebafcb2e4207680669d8f8d7cca79a"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f0a47efb1dbef13af9c9a54a94a0b814902e547b7f21acb29434504d18f36e3a"}, + {file = "regex-2023.10.3-cp310-cp310-win32.whl", hash = "sha256:36362386b813fa6c9146da6149a001b7bd063dabc4d49522a1f7aa65b725c7ec"}, + {file = "regex-2023.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:c65a3b5330b54103e7d21cac3f6bf3900d46f6d50138d73343d9e5b2900b2353"}, + {file = "regex-2023.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90a79bce019c442604662d17bf69df99090e24cdc6ad95b18b6725c2988a490e"}, + {file = "regex-2023.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c7964c2183c3e6cce3f497e3a9f49d182e969f2dc3aeeadfa18945ff7bdd7051"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ef80829117a8061f974b2fda8ec799717242353bff55f8a29411794d635d964"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5addc9d0209a9afca5fc070f93b726bf7003bd63a427f65ef797a931782e7edc"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c148bec483cc4b421562b4bcedb8e28a3b84fcc8f0aa4418e10898f3c2c0eb9b"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d1f21af4c1539051049796a0f50aa342f9a27cde57318f2fc41ed50b0dbc4ac"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b9ac09853b2a3e0d0082104036579809679e7715671cfbf89d83c1cb2a30f58"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ebedc192abbc7fd13c5ee800e83a6df252bec691eb2c4bedc9f8b2e2903f5e2a"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d8a993c0a0ffd5f2d3bda23d0cd75e7086736f8f8268de8a82fbc4bd0ac6791e"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:be6b7b8d42d3090b6c80793524fa66c57ad7ee3fe9722b258aec6d0672543fd0"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4023e2efc35a30e66e938de5aef42b520c20e7eda7bb5fb12c35e5d09a4c43f6"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d47840dc05e0ba04fe2e26f15126de7c755496d5a8aae4a08bda4dd8d646c54"}, + {file = "regex-2023.10.3-cp311-cp311-win32.whl", hash = "sha256:9145f092b5d1977ec8c0ab46e7b3381b2fd069957b9862a43bd383e5c01d18c2"}, + {file = "regex-2023.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:b6104f9a46bd8743e4f738afef69b153c4b8b592d35ae46db07fc28ae3d5fb7c"}, + {file = "regex-2023.10.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff507ae210371d4b1fe316d03433ac099f184d570a1a611e541923f78f05037"}, + {file = "regex-2023.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be5e22bbb67924dea15039c3282fa4cc6cdfbe0cbbd1c0515f9223186fc2ec5f"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a992f702c9be9c72fa46f01ca6e18d131906a7180950958f766c2aa294d4b41"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7434a61b158be563c1362d9071358f8ab91b8d928728cd2882af060481244c9e"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2169b2dcabf4e608416f7f9468737583ce5f0a6e8677c4efbf795ce81109d7c"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9e908ef5889cda4de038892b9accc36d33d72fb3e12c747e2799a0e806ec841"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12bd4bc2c632742c7ce20db48e0d99afdc05e03f0b4c1af90542e05b809a03d9"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bce8814b076f0ce5766dc87d5a056b0e9437b8e0cd351b9a6c4e1134a7dfbda9"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ba7cd6dc4d585ea544c1412019921570ebd8a597fabf475acc4528210d7c4a6f"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b0c7d2f698e83f15228ba41c135501cfe7d5740181d5903e250e47f617eb4292"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5a8f91c64f390ecee09ff793319f30a0f32492e99f5dc1c72bc361f23ccd0a9a"}, + {file = "regex-2023.10.3-cp312-cp312-win32.whl", hash = "sha256:ad08a69728ff3c79866d729b095872afe1e0557251da4abb2c5faff15a91d19a"}, + {file = "regex-2023.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:39cdf8d141d6d44e8d5a12a8569d5a227f645c87df4f92179bd06e2e2705e76b"}, + {file = "regex-2023.10.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4a3ee019a9befe84fa3e917a2dd378807e423d013377a884c1970a3c2792d293"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76066d7ff61ba6bf3cb5efe2428fc82aac91802844c022d849a1f0f53820502d"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe50b61bab1b1ec260fa7cd91106fa9fece57e6beba05630afe27c71259c59b"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fd88f373cb71e6b59b7fa597e47e518282455c2734fd4306a05ca219a1991b0"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ab05a182c7937fb374f7e946f04fb23a0c0699c0450e9fb02ef567412d2fa3"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dac37cf08fcf2094159922edc7a2784cfcc5c70f8354469f79ed085f0328ebdf"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e54ddd0bb8fb626aa1f9ba7b36629564544954fff9669b15da3610c22b9a0991"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3367007ad1951fde612bf65b0dffc8fd681a4ab98ac86957d16491400d661302"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:16f8740eb6dbacc7113e3097b0a36065a02e37b47c936b551805d40340fb9971"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f4f2ca6df64cbdd27f27b34f35adb640b5d2d77264228554e68deda54456eb11"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:39807cbcbe406efca2a233884e169d056c35aa7e9f343d4e78665246a332f597"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7eece6fbd3eae4a92d7c748ae825cbc1ee41a89bb1c3db05b5578ed3cfcfd7cb"}, + {file = "regex-2023.10.3-cp37-cp37m-win32.whl", hash = "sha256:ce615c92d90df8373d9e13acddd154152645c0dc060871abf6bd43809673d20a"}, + {file = "regex-2023.10.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f649fa32fe734c4abdfd4edbb8381c74abf5f34bc0b3271ce687b23729299ed"}, + {file = "regex-2023.10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b98b7681a9437262947f41c7fac567c7e1f6eddd94b0483596d320092004533"}, + {file = "regex-2023.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:91dc1d531f80c862441d7b66c4505cd6ea9d312f01fb2f4654f40c6fdf5cc37a"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82fcc1f1cc3ff1ab8a57ba619b149b907072e750815c5ba63e7aa2e1163384a4"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7979b834ec7a33aafae34a90aad9f914c41fd6eaa8474e66953f3f6f7cbd4368"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef71561f82a89af6cfcbee47f0fabfdb6e63788a9258e913955d89fdd96902ab"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd829712de97753367153ed84f2de752b86cd1f7a88b55a3a775eb52eafe8a94"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00e871d83a45eee2f8688d7e6849609c2ca2a04a6d48fba3dff4deef35d14f07"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:706e7b739fdd17cb89e1fbf712d9dc21311fc2333f6d435eac2d4ee81985098c"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cc3f1c053b73f20c7ad88b0d1d23be7e7b3901229ce89f5000a8399746a6e039"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f85739e80d13644b981a88f529d79c5bdf646b460ba190bffcaf6d57b2a9863"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:741ba2f511cc9626b7561a440f87d658aabb3d6b744a86a3c025f866b4d19e7f"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e77c90ab5997e85901da85131fd36acd0ed2221368199b65f0d11bca44549711"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:979c24cbefaf2420c4e377ecd1f165ea08cc3d1fbb44bdc51bccbbf7c66a2cb4"}, + {file = "regex-2023.10.3-cp38-cp38-win32.whl", hash = "sha256:58837f9d221744d4c92d2cf7201c6acd19623b50c643b56992cbd2b745485d3d"}, + {file = "regex-2023.10.3-cp38-cp38-win_amd64.whl", hash = "sha256:c55853684fe08d4897c37dfc5faeff70607a5f1806c8be148f1695be4a63414b"}, + {file = "regex-2023.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2c54e23836650bdf2c18222c87f6f840d4943944146ca479858404fedeb9f9af"}, + {file = "regex-2023.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69c0771ca5653c7d4b65203cbfc5e66db9375f1078689459fe196fe08b7b4930"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ac965a998e1388e6ff2e9781f499ad1eaa41e962a40d11c7823c9952c77123e"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c0e8fae5b27caa34177bdfa5a960c46ff2f78ee2d45c6db15ae3f64ecadde14"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c56c3d47da04f921b73ff9415fbaa939f684d47293f071aa9cbb13c94afc17d"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ef1e014eed78ab650bef9a6a9cbe50b052c0aebe553fb2881e0453717573f52"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d29338556a59423d9ff7b6eb0cb89ead2b0875e08fe522f3e068b955c3e7b59b"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9c6d0ced3c06d0f183b73d3c5920727268d2201aa0fe6d55c60d68c792ff3588"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:994645a46c6a740ee8ce8df7911d4aee458d9b1bc5639bc968226763d07f00fa"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:66e2fe786ef28da2b28e222c89502b2af984858091675044d93cb50e6f46d7af"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:11175910f62b2b8c055f2b089e0fedd694fe2be3941b3e2633653bc51064c528"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:06e9abc0e4c9ab4779c74ad99c3fc10d3967d03114449acc2c2762ad4472b8ca"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fb02e4257376ae25c6dd95a5aec377f9b18c09be6ebdefa7ad209b9137b73d48"}, + {file = "regex-2023.10.3-cp39-cp39-win32.whl", hash = "sha256:3b2c3502603fab52d7619b882c25a6850b766ebd1b18de3df23b2f939360e1bd"}, + {file = "regex-2023.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:adbccd17dcaff65704c856bd29951c58a1bd4b2b0f8ad6b826dbd543fe740988"}, + {file = "regex-2023.10.3.tar.gz", hash = "sha256:3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f"}, ] [[package]] name = "requests" -version = "2.28.2" +version = "2.31.0" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" files = [ - {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, - {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, ] [package.dependencies] certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] @@ -6383,13 +7067,13 @@ jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] [[package]] name = "rich-argparse" -version = "1.2.0" +version = "1.4.0" description = "Rich help formatters for argparse and optparse" optional = false python-versions = ">=3.7" files = [ - {file = "rich_argparse-1.2.0-py3-none-any.whl", hash = "sha256:ebd9ca7b418e9aff4a9c502caf9ea24237ad4967c1adfd68a628a4c21d5184f3"}, - {file = "rich_argparse-1.2.0.tar.gz", hash = "sha256:bf17fe00603ad90dbb94cd3a6a27a3a0051df6b3363fb1b46300398bb83740ea"}, + {file = "rich_argparse-1.4.0-py3-none-any.whl", hash = "sha256:68b263d3628d07b1d27cfe6ad896da2f5a5583ee2ba226aeeb24459840023b38"}, + {file = "rich_argparse-1.4.0.tar.gz", hash = "sha256:c275f34ea3afe36aec6342c2a2298893104b5650528941fb53c21067276dba19"}, ] [package.dependencies] @@ -6397,108 +7081,110 @@ rich = ">=11.0.0" [[package]] name = "rpds-py" -version = "0.9.2" +version = "0.10.6" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.9.2-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:ab6919a09c055c9b092798ce18c6c4adf49d24d4d9e43a92b257e3f2548231e7"}, - {file = "rpds_py-0.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d55777a80f78dd09410bd84ff8c95ee05519f41113b2df90a69622f5540c4f8b"}, - {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a216b26e5af0a8e265d4efd65d3bcec5fba6b26909014effe20cd302fd1138fa"}, - {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29cd8bfb2d716366a035913ced99188a79b623a3512292963d84d3e06e63b496"}, - {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44659b1f326214950a8204a248ca6199535e73a694be8d3e0e869f820767f12f"}, - {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:745f5a43fdd7d6d25a53ab1a99979e7f8ea419dfefebcab0a5a1e9095490ee5e"}, - {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a987578ac5214f18b99d1f2a3851cba5b09f4a689818a106c23dbad0dfeb760f"}, - {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bf4151acb541b6e895354f6ff9ac06995ad9e4175cbc6d30aaed08856558201f"}, - {file = "rpds_py-0.9.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:03421628f0dc10a4119d714a17f646e2837126a25ac7a256bdf7c3943400f67f"}, - {file = "rpds_py-0.9.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:13b602dc3e8dff3063734f02dcf05111e887f301fdda74151a93dbbc249930fe"}, - {file = "rpds_py-0.9.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fae5cb554b604b3f9e2c608241b5d8d303e410d7dfb6d397c335f983495ce7f6"}, - {file = "rpds_py-0.9.2-cp310-none-win32.whl", hash = "sha256:47c5f58a8e0c2c920cc7783113df2fc4ff12bf3a411d985012f145e9242a2764"}, - {file = "rpds_py-0.9.2-cp310-none-win_amd64.whl", hash = "sha256:4ea6b73c22d8182dff91155af018b11aac9ff7eca085750455c5990cb1cfae6e"}, - {file = "rpds_py-0.9.2-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:e564d2238512c5ef5e9d79338ab77f1cbbda6c2d541ad41b2af445fb200385e3"}, - {file = "rpds_py-0.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f411330a6376fb50e5b7a3e66894e4a39e60ca2e17dce258d53768fea06a37bd"}, - {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e7521f5af0233e89939ad626b15278c71b69dc1dfccaa7b97bd4cdf96536bb7"}, - {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8d3335c03100a073883857e91db9f2e0ef8a1cf42dc0369cbb9151c149dbbc1b"}, - {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d25b1c1096ef0447355f7293fbe9ad740f7c47ae032c2884113f8e87660d8f6e"}, - {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a5d3fbd02efd9cf6a8ffc2f17b53a33542f6b154e88dd7b42ef4a4c0700fdad"}, - {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5934e2833afeaf36bd1eadb57256239785f5af0220ed8d21c2896ec4d3a765f"}, - {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:095b460e117685867d45548fbd8598a8d9999227e9061ee7f012d9d264e6048d"}, - {file = "rpds_py-0.9.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:91378d9f4151adc223d584489591dbb79f78814c0734a7c3bfa9c9e09978121c"}, - {file = "rpds_py-0.9.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:24a81c177379300220e907e9b864107614b144f6c2a15ed5c3450e19cf536fae"}, - {file = "rpds_py-0.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:de0b6eceb46141984671802d412568d22c6bacc9b230174f9e55fc72ef4f57de"}, - {file = "rpds_py-0.9.2-cp311-none-win32.whl", hash = "sha256:700375326ed641f3d9d32060a91513ad668bcb7e2cffb18415c399acb25de2ab"}, - {file = "rpds_py-0.9.2-cp311-none-win_amd64.whl", hash = "sha256:0766babfcf941db8607bdaf82569ec38107dbb03c7f0b72604a0b346b6eb3298"}, - {file = "rpds_py-0.9.2-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:b1440c291db3f98a914e1afd9d6541e8fc60b4c3aab1a9008d03da4651e67386"}, - {file = "rpds_py-0.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0f2996fbac8e0b77fd67102becb9229986396e051f33dbceada3debaacc7033f"}, - {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f30d205755566a25f2ae0382944fcae2f350500ae4df4e795efa9e850821d82"}, - {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:159fba751a1e6b1c69244e23ba6c28f879a8758a3e992ed056d86d74a194a0f3"}, - {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1f044792e1adcea82468a72310c66a7f08728d72a244730d14880cd1dabe36b"}, - {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9251eb8aa82e6cf88510530b29eef4fac825a2b709baf5b94a6094894f252387"}, - {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01899794b654e616c8625b194ddd1e5b51ef5b60ed61baa7a2d9c2ad7b2a4238"}, - {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0c43f8ae8f6be1d605b0465671124aa8d6a0e40f1fb81dcea28b7e3d87ca1e1"}, - {file = "rpds_py-0.9.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:207f57c402d1f8712618f737356e4b6f35253b6d20a324d9a47cb9f38ee43a6b"}, - {file = "rpds_py-0.9.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b52e7c5ae35b00566d244ffefba0f46bb6bec749a50412acf42b1c3f402e2c90"}, - {file = "rpds_py-0.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:978fa96dbb005d599ec4fd9ed301b1cc45f1a8f7982d4793faf20b404b56677d"}, - {file = "rpds_py-0.9.2-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:6aa8326a4a608e1c28da191edd7c924dff445251b94653988efb059b16577a4d"}, - {file = "rpds_py-0.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aad51239bee6bff6823bbbdc8ad85136c6125542bbc609e035ab98ca1e32a192"}, - {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bd4dc3602370679c2dfb818d9c97b1137d4dd412230cfecd3c66a1bf388a196"}, - {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dd9da77c6ec1f258387957b754f0df60766ac23ed698b61941ba9acccd3284d1"}, - {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:190ca6f55042ea4649ed19c9093a9be9d63cd8a97880106747d7147f88a49d18"}, - {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:876bf9ed62323bc7dcfc261dbc5572c996ef26fe6406b0ff985cbcf460fc8a4c"}, - {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa2818759aba55df50592ecbc95ebcdc99917fa7b55cc6796235b04193eb3c55"}, - {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9ea4d00850ef1e917815e59b078ecb338f6a8efda23369677c54a5825dbebb55"}, - {file = "rpds_py-0.9.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:5855c85eb8b8a968a74dc7fb014c9166a05e7e7a8377fb91d78512900aadd13d"}, - {file = "rpds_py-0.9.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:14c408e9d1a80dcb45c05a5149e5961aadb912fff42ca1dd9b68c0044904eb32"}, - {file = "rpds_py-0.9.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:65a0583c43d9f22cb2130c7b110e695fff834fd5e832a776a107197e59a1898e"}, - {file = "rpds_py-0.9.2-cp38-none-win32.whl", hash = "sha256:71f2f7715935a61fa3e4ae91d91b67e571aeb5cb5d10331ab681256bda2ad920"}, - {file = "rpds_py-0.9.2-cp38-none-win_amd64.whl", hash = "sha256:674c704605092e3ebbbd13687b09c9f78c362a4bc710343efe37a91457123044"}, - {file = "rpds_py-0.9.2-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:07e2c54bef6838fa44c48dfbc8234e8e2466d851124b551fc4e07a1cfeb37260"}, - {file = "rpds_py-0.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f7fdf55283ad38c33e35e2855565361f4bf0abd02470b8ab28d499c663bc5d7c"}, - {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:890ba852c16ace6ed9f90e8670f2c1c178d96510a21b06d2fa12d8783a905193"}, - {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:50025635ba8b629a86d9d5474e650da304cb46bbb4d18690532dd79341467846"}, - {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:517cbf6e67ae3623c5127206489d69eb2bdb27239a3c3cc559350ef52a3bbf0b"}, - {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0836d71ca19071090d524739420a61580f3f894618d10b666cf3d9a1688355b1"}, - {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c439fd54b2b9053717cca3de9583be6584b384d88d045f97d409f0ca867d80f"}, - {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f68996a3b3dc9335037f82754f9cdbe3a95db42bde571d8c3be26cc6245f2324"}, - {file = "rpds_py-0.9.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7d68dc8acded354c972116f59b5eb2e5864432948e098c19fe6994926d8e15c3"}, - {file = "rpds_py-0.9.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f963c6b1218b96db85fc37a9f0851eaf8b9040aa46dec112611697a7023da535"}, - {file = "rpds_py-0.9.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a46859d7f947061b4010e554ccd1791467d1b1759f2dc2ec9055fa239f1bc26"}, - {file = "rpds_py-0.9.2-cp39-none-win32.whl", hash = "sha256:e07e5dbf8a83c66783a9fe2d4566968ea8c161199680e8ad38d53e075df5f0d0"}, - {file = "rpds_py-0.9.2-cp39-none-win_amd64.whl", hash = "sha256:682726178138ea45a0766907957b60f3a1bf3acdf212436be9733f28b6c5af3c"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:196cb208825a8b9c8fc360dc0f87993b8b260038615230242bf18ec84447c08d"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c7671d45530fcb6d5e22fd40c97e1e1e01965fc298cbda523bb640f3d923b387"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83b32f0940adec65099f3b1c215ef7f1d025d13ff947975a055989cb7fd019a4"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f67da97f5b9eac838b6980fc6da268622e91f8960e083a34533ca710bec8611"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03975db5f103997904c37e804e5f340c8fdabbb5883f26ee50a255d664eed58c"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:987b06d1cdb28f88a42e4fb8a87f094e43f3c435ed8e486533aea0bf2e53d931"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c861a7e4aef15ff91233751619ce3a3d2b9e5877e0fcd76f9ea4f6847183aa16"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02938432352359805b6da099c9c95c8a0547fe4b274ce8f1a91677401bb9a45f"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:ef1f08f2a924837e112cba2953e15aacfccbbfcd773b4b9b4723f8f2ddded08e"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:35da5cc5cb37c04c4ee03128ad59b8c3941a1e5cd398d78c37f716f32a9b7f67"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:141acb9d4ccc04e704e5992d35472f78c35af047fa0cfae2923835d153f091be"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:79f594919d2c1a0cc17d1988a6adaf9a2f000d2e1048f71f298b056b1018e872"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:a06418fe1155e72e16dddc68bb3780ae44cebb2912fbd8bb6ff9161de56e1798"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b2eb034c94b0b96d5eddb290b7b5198460e2d5d0c421751713953a9c4e47d10"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b08605d248b974eb02f40bdcd1a35d3924c83a2a5e8f5d0fa5af852c4d960af"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a0805911caedfe2736935250be5008b261f10a729a303f676d3d5fea6900c96a"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab2299e3f92aa5417d5e16bb45bb4586171c1327568f638e8453c9f8d9e0f020"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c8d7594e38cf98d8a7df25b440f684b510cf4627fe038c297a87496d10a174f"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8b9ec12ad5f0a4625db34db7e0005be2632c1013b253a4a60e8302ad4d462afd"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1fcdee18fea97238ed17ab6478c66b2095e4ae7177e35fb71fbe561a27adf620"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:933a7d5cd4b84f959aedeb84f2030f0a01d63ae6cf256629af3081cf3e3426e8"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:686ba516e02db6d6f8c279d1641f7067ebb5dc58b1d0536c4aaebb7bf01cdc5d"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:0173c0444bec0a3d7d848eaeca2d8bd32a1b43f3d3fde6617aac3731fa4be05f"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d576c3ef8c7b2d560e301eb33891d1944d965a4d7a2eacb6332eee8a71827db6"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed89861ee8c8c47d6beb742a602f912b1bb64f598b1e2f3d758948721d44d468"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1054a08e818f8e18910f1bee731583fe8f899b0a0a5044c6e680ceea34f93876"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99e7c4bb27ff1aab90dcc3e9d37ee5af0231ed98d99cb6f5250de28889a3d502"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c545d9d14d47be716495076b659db179206e3fd997769bc01e2d550eeb685596"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9039a11bca3c41be5a58282ed81ae422fa680409022b996032a43badef2a3752"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fb39aca7a64ad0c9490adfa719dbeeb87d13be137ca189d2564e596f8ba32c07"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2d8b3b3a2ce0eaa00c5bbbb60b6713e94e7e0becab7b3db6c5c77f979e8ed1f1"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:99b1c16f732b3a9971406fbfe18468592c5a3529585a45a35adbc1389a529a03"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c27ee01a6c3223025f4badd533bea5e87c988cb0ba2811b690395dfe16088cfe"}, - {file = "rpds_py-0.9.2.tar.gz", hash = "sha256:8d70e8f14900f2657c249ea4def963bed86a29b81f81f5b76b5a9215680de945"}, + {file = "rpds_py-0.10.6-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:6bdc11f9623870d75692cc33c59804b5a18d7b8a4b79ef0b00b773a27397d1f6"}, + {file = "rpds_py-0.10.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:26857f0f44f0e791f4a266595a7a09d21f6b589580ee0585f330aaccccb836e3"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7f5e15c953ace2e8dde9824bdab4bec50adb91a5663df08d7d994240ae6fa31"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61fa268da6e2e1cd350739bb61011121fa550aa2545762e3dc02ea177ee4de35"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c48f3fbc3e92c7dd6681a258d22f23adc2eb183c8cb1557d2fcc5a024e80b094"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0503c5b681566e8b722fe8c4c47cce5c7a51f6935d5c7012c4aefe952a35eed"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:734c41f9f57cc28658d98270d3436dba65bed0cfc730d115b290e970150c540d"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a5d7ed104d158c0042a6a73799cf0eb576dfd5fc1ace9c47996e52320c37cb7c"}, + {file = "rpds_py-0.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e3df0bc35e746cce42579826b89579d13fd27c3d5319a6afca9893a9b784ff1b"}, + {file = "rpds_py-0.10.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:73e0a78a9b843b8c2128028864901f55190401ba38aae685350cf69b98d9f7c9"}, + {file = "rpds_py-0.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5ed505ec6305abd2c2c9586a7b04fbd4baf42d4d684a9c12ec6110deefe2a063"}, + {file = "rpds_py-0.10.6-cp310-none-win32.whl", hash = "sha256:d97dd44683802000277bbf142fd9f6b271746b4846d0acaf0cefa6b2eaf2a7ad"}, + {file = "rpds_py-0.10.6-cp310-none-win_amd64.whl", hash = "sha256:b455492cab07107bfe8711e20cd920cc96003e0da3c1f91297235b1603d2aca7"}, + {file = "rpds_py-0.10.6-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:e8cdd52744f680346ff8c1ecdad5f4d11117e1724d4f4e1874f3a67598821069"}, + {file = "rpds_py-0.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66414dafe4326bca200e165c2e789976cab2587ec71beb80f59f4796b786a238"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc435d059f926fdc5b05822b1be4ff2a3a040f3ae0a7bbbe672babb468944722"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8e7f2219cb72474571974d29a191714d822e58be1eb171f229732bc6fdedf0ac"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3953c6926a63f8ea5514644b7afb42659b505ece4183fdaaa8f61d978754349e"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2bb2e4826be25e72013916eecd3d30f66fd076110de09f0e750163b416500721"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bf347b495b197992efc81a7408e9a83b931b2f056728529956a4d0858608b80"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:102eac53bb0bf0f9a275b438e6cf6904904908562a1463a6fc3323cf47d7a532"}, + {file = "rpds_py-0.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40f93086eef235623aa14dbddef1b9fb4b22b99454cb39a8d2e04c994fb9868c"}, + {file = "rpds_py-0.10.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e22260a4741a0e7a206e175232867b48a16e0401ef5bce3c67ca5b9705879066"}, + {file = "rpds_py-0.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f4e56860a5af16a0fcfa070a0a20c42fbb2012eed1eb5ceeddcc7f8079214281"}, + {file = "rpds_py-0.10.6-cp311-none-win32.whl", hash = "sha256:0774a46b38e70fdde0c6ded8d6d73115a7c39d7839a164cc833f170bbf539116"}, + {file = "rpds_py-0.10.6-cp311-none-win_amd64.whl", hash = "sha256:4a5ee600477b918ab345209eddafde9f91c0acd931f3776369585a1c55b04c57"}, + {file = "rpds_py-0.10.6-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:5ee97c683eaface61d38ec9a489e353d36444cdebb128a27fe486a291647aff6"}, + {file = "rpds_py-0.10.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0713631d6e2d6c316c2f7b9320a34f44abb644fc487b77161d1724d883662e31"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5a53f5998b4bbff1cb2e967e66ab2addc67326a274567697379dd1e326bded7"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a555ae3d2e61118a9d3e549737bb4a56ff0cec88a22bd1dfcad5b4e04759175"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:945eb4b6bb8144909b203a88a35e0a03d22b57aefb06c9b26c6e16d72e5eb0f0"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:52c215eb46307c25f9fd2771cac8135d14b11a92ae48d17968eda5aa9aaf5071"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1b3cd23d905589cb205710b3988fc8f46d4a198cf12862887b09d7aaa6bf9b9"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64ccc28683666672d7c166ed465c09cee36e306c156e787acef3c0c62f90da5a"}, + {file = "rpds_py-0.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:516a611a2de12fbea70c78271e558f725c660ce38e0006f75139ba337d56b1f6"}, + {file = "rpds_py-0.10.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9ff93d3aedef11f9c4540cf347f8bb135dd9323a2fc705633d83210d464c579d"}, + {file = "rpds_py-0.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d858532212f0650be12b6042ff4378dc2efbb7792a286bee4489eaa7ba010586"}, + {file = "rpds_py-0.10.6-cp312-none-win32.whl", hash = "sha256:3c4eff26eddac49d52697a98ea01b0246e44ca82ab09354e94aae8823e8bda02"}, + {file = "rpds_py-0.10.6-cp312-none-win_amd64.whl", hash = "sha256:150eec465dbc9cbca943c8e557a21afdcf9bab8aaabf386c44b794c2f94143d2"}, + {file = "rpds_py-0.10.6-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:cf693eb4a08eccc1a1b636e4392322582db2a47470d52e824b25eca7a3977b53"}, + {file = "rpds_py-0.10.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4134aa2342f9b2ab6c33d5c172e40f9ef802c61bb9ca30d21782f6e035ed0043"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e782379c2028a3611285a795b89b99a52722946d19fc06f002f8b53e3ea26ea9"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f6da6d842195fddc1cd34c3da8a40f6e99e4a113918faa5e60bf132f917c247"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4a9fe992887ac68256c930a2011255bae0bf5ec837475bc6f7edd7c8dfa254e"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b788276a3c114e9f51e257f2a6f544c32c02dab4aa7a5816b96444e3f9ffc336"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:caa1afc70a02645809c744eefb7d6ee8fef7e2fad170ffdeacca267fd2674f13"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bddd4f91eede9ca5275e70479ed3656e76c8cdaaa1b354e544cbcf94c6fc8ac4"}, + {file = "rpds_py-0.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:775049dfa63fb58293990fc59473e659fcafd953bba1d00fc5f0631a8fd61977"}, + {file = "rpds_py-0.10.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c6c45a2d2b68c51fe3d9352733fe048291e483376c94f7723458cfd7b473136b"}, + {file = "rpds_py-0.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0699ab6b8c98df998c3eacf51a3b25864ca93dab157abe358af46dc95ecd9801"}, + {file = "rpds_py-0.10.6-cp38-none-win32.whl", hash = "sha256:ebdab79f42c5961682654b851f3f0fc68e6cc7cd8727c2ac4ffff955154123c1"}, + {file = "rpds_py-0.10.6-cp38-none-win_amd64.whl", hash = "sha256:24656dc36f866c33856baa3ab309da0b6a60f37d25d14be916bd3e79d9f3afcf"}, + {file = "rpds_py-0.10.6-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:0898173249141ee99ffcd45e3829abe7bcee47d941af7434ccbf97717df020e5"}, + {file = "rpds_py-0.10.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e9184fa6c52a74a5521e3e87badbf9692549c0fcced47443585876fcc47e469"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5752b761902cd15073a527b51de76bbae63d938dc7c5c4ad1e7d8df10e765138"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:99a57006b4ec39dbfb3ed67e5b27192792ffb0553206a107e4aadb39c5004cd5"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09586f51a215d17efdb3a5f090d7cbf1633b7f3708f60a044757a5d48a83b393"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e225a6a14ecf44499aadea165299092ab0cba918bb9ccd9304eab1138844490b"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2039f8d545f20c4e52713eea51a275e62153ee96c8035a32b2abb772b6fc9e5"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:34ad87a831940521d462ac11f1774edf867c34172010f5390b2f06b85dcc6014"}, + {file = "rpds_py-0.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dcdc88b6b01015da066da3fb76545e8bb9a6880a5ebf89e0f0b2e3ca557b3ab7"}, + {file = "rpds_py-0.10.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:25860ed5c4e7f5e10c496ea78af46ae8d8468e0be745bd233bab9ca99bfd2647"}, + {file = "rpds_py-0.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7854a207ef77319ec457c1eb79c361b48807d252d94348305db4f4b62f40f7f3"}, + {file = "rpds_py-0.10.6-cp39-none-win32.whl", hash = "sha256:e6fcc026a3f27c1282c7ed24b7fcac82cdd70a0e84cc848c0841a3ab1e3dea2d"}, + {file = "rpds_py-0.10.6-cp39-none-win_amd64.whl", hash = "sha256:e98c4c07ee4c4b3acf787e91b27688409d918212dfd34c872201273fdd5a0e18"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:68fe9199184c18d997d2e4293b34327c0009a78599ce703e15cd9a0f47349bba"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:3339eca941568ed52d9ad0f1b8eb9fe0958fa245381747cecf2e9a78a5539c42"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a360cfd0881d36c6dc271992ce1eda65dba5e9368575663de993eeb4523d895f"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:031f76fc87644a234883b51145e43985aa2d0c19b063e91d44379cd2786144f8"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f36a9d751f86455dc5278517e8b65580eeee37d61606183897f122c9e51cef3"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:052a832078943d2b2627aea0d19381f607fe331cc0eb5df01991268253af8417"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023574366002bf1bd751ebaf3e580aef4a468b3d3c216d2f3f7e16fdabd885ed"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:defa2c0c68734f4a82028c26bcc85e6b92cced99866af118cd6a89b734ad8e0d"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:879fb24304ead6b62dbe5034e7b644b71def53c70e19363f3c3be2705c17a3b4"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:53c43e10d398e365da2d4cc0bcaf0854b79b4c50ee9689652cdc72948e86f487"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:3777cc9dea0e6c464e4b24760664bd8831738cc582c1d8aacf1c3f546bef3f65"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:40578a6469e5d1df71b006936ce95804edb5df47b520c69cf5af264d462f2cbb"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:cf71343646756a072b85f228d35b1d7407da1669a3de3cf47f8bbafe0c8183a4"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10f32b53f424fc75ff7b713b2edb286fdbfc94bf16317890260a81c2c00385dc"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:81de24a1c51cfb32e1fbf018ab0bdbc79c04c035986526f76c33e3f9e0f3356c"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac17044876e64a8ea20ab132080ddc73b895b4abe9976e263b0e30ee5be7b9c2"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e8a78bd4879bff82daef48c14d5d4057f6856149094848c3ed0ecaf49f5aec2"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78ca33811e1d95cac8c2e49cb86c0fb71f4d8409d8cbea0cb495b6dbddb30a55"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c63c3ef43f0b3fb00571cff6c3967cc261c0ebd14a0a134a12e83bdb8f49f21f"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:7fde6d0e00b2fd0dbbb40c0eeec463ef147819f23725eda58105ba9ca48744f4"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:79edd779cfc46b2e15b0830eecd8b4b93f1a96649bcb502453df471a54ce7977"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9164ec8010327ab9af931d7ccd12ab8d8b5dc2f4c6a16cbdd9d087861eaaefa1"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d29ddefeab1791e3c751e0189d5f4b3dbc0bbe033b06e9c333dca1f99e1d523e"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:30adb75ecd7c2a52f5e76af50644b3e0b5ba036321c390b8e7ec1bb2a16dd43c"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd609fafdcdde6e67a139898196698af37438b035b25ad63704fd9097d9a3482"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6eef672de005736a6efd565577101277db6057f65640a813de6c2707dc69f396"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cf4393c7b41abbf07c88eb83e8af5013606b1cdb7f6bc96b1b3536b53a574b8"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad857f42831e5b8d41a32437f88d86ead6c191455a3499c4b6d15e007936d4cf"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d7360573f1e046cb3b0dceeb8864025aa78d98be4bb69f067ec1c40a9e2d9df"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d08f63561c8a695afec4975fae445245386d645e3e446e6f260e81663bfd2e38"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:f0f17f2ce0f3529177a5fff5525204fad7b43dd437d017dd0317f2746773443d"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:442626328600bde1d09dc3bb00434f5374948838ce75c41a52152615689f9403"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e9616f5bd2595f7f4a04b67039d890348ab826e943a9bfdbe4938d0eba606971"}, + {file = "rpds_py-0.10.6.tar.gz", hash = "sha256:4ce5a708d65a8dbf3748d2474b580d606b1b9f91b5c6ab2a316e0b0cf7a4ba50"}, ] [[package]] @@ -6517,39 +7203,39 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruff" -version = "0.0.287" -description = "An extremely fast Python linter, written in Rust." +version = "0.1.8" +description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.0.287-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:1e0f9ee4c3191444eefeda97d7084721d9b8e29017f67997a20c153457f2eafd"}, - {file = "ruff-0.0.287-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:e9843e5704d4fb44e1a8161b0d31c1a38819723f0942639dfeb53d553be9bfb5"}, - {file = "ruff-0.0.287-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca1ed11d759a29695aed2bfc7f914b39bcadfe2ef08d98ff69c873f639ad3a8"}, - {file = "ruff-0.0.287-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1cf4d5ad3073af10f186ea22ce24bc5a8afa46151f6896f35c586e40148ba20b"}, - {file = "ruff-0.0.287-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d9d58bcb29afd72d2afe67120afcc7d240efc69a235853813ad556443dc922"}, - {file = "ruff-0.0.287-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:06ac5df7dd3ba8bf83bba1490a72f97f1b9b21c7cbcba8406a09de1a83f36083"}, - {file = "ruff-0.0.287-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2bfb478e1146a60aa740ab9ebe448b1f9e3c0dfb54be3cc58713310eef059c30"}, - {file = "ruff-0.0.287-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00d579a011949108c4b4fa04c4f1ee066dab536a9ba94114e8e580c96be2aeb4"}, - {file = "ruff-0.0.287-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3a810a79b8029cc92d06c36ea1f10be5298d2323d9024e1d21aedbf0a1a13e5"}, - {file = "ruff-0.0.287-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:150007028ad4976ce9a7704f635ead6d0e767f73354ce0137e3e44f3a6c0963b"}, - {file = "ruff-0.0.287-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a24a280db71b0fa2e0de0312b4aecb8e6d08081d1b0b3c641846a9af8e35b4a7"}, - {file = "ruff-0.0.287-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2918cb7885fa1611d542de1530bea3fbd63762da793751cc8c8d6e4ba234c3d8"}, - {file = "ruff-0.0.287-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:33d7b251afb60bec02a64572b0fd56594b1923ee77585bee1e7e1daf675e7ae7"}, - {file = "ruff-0.0.287-py3-none-win32.whl", hash = "sha256:022f8bed2dcb5e5429339b7c326155e968a06c42825912481e10be15dafb424b"}, - {file = "ruff-0.0.287-py3-none-win_amd64.whl", hash = "sha256:26bd0041d135a883bd6ab3e0b29c42470781fb504cf514e4c17e970e33411d90"}, - {file = "ruff-0.0.287-py3-none-win_arm64.whl", hash = "sha256:44bceb3310ac04f0e59d4851e6227f7b1404f753997c7859192e41dbee9f5c8d"}, - {file = "ruff-0.0.287.tar.gz", hash = "sha256:02dc4f5bf53ef136e459d467f3ce3e04844d509bc46c025a05b018feb37bbc39"}, + {file = "ruff-0.1.8-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7de792582f6e490ae6aef36a58d85df9f7a0cfd1b0d4fe6b4fb51803a3ac96fa"}, + {file = "ruff-0.1.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:c8e3255afd186c142eef4ec400d7826134f028a85da2146102a1172ecc7c3696"}, + {file = "ruff-0.1.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff78a7583020da124dd0deb835ece1d87bb91762d40c514ee9b67a087940528b"}, + {file = "ruff-0.1.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd8ee69b02e7bdefe1e5da2d5b6eaaddcf4f90859f00281b2333c0e3a0cc9cd6"}, + {file = "ruff-0.1.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a05b0ddd7ea25495e4115a43125e8a7ebed0aa043c3d432de7e7d6e8e8cd6448"}, + {file = "ruff-0.1.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:e6f08ca730f4dc1b76b473bdf30b1b37d42da379202a059eae54ec7fc1fbcfed"}, + {file = "ruff-0.1.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f35960b02df6b827c1b903091bb14f4b003f6cf102705efc4ce78132a0aa5af3"}, + {file = "ruff-0.1.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d076717c67b34c162da7c1a5bda16ffc205e0e0072c03745275e7eab888719f"}, + {file = "ruff-0.1.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6a21ab023124eafb7cef6d038f835cb1155cd5ea798edd8d9eb2f8b84be07d9"}, + {file = "ruff-0.1.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ce697c463458555027dfb194cb96d26608abab920fa85213deb5edf26e026664"}, + {file = "ruff-0.1.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:db6cedd9ffed55548ab313ad718bc34582d394e27a7875b4b952c2d29c001b26"}, + {file = "ruff-0.1.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:05ffe9dbd278965271252704eddb97b4384bf58b971054d517decfbf8c523f05"}, + {file = "ruff-0.1.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5daaeaf00ae3c1efec9742ff294b06c3a2a9db8d3db51ee4851c12ad385cda30"}, + {file = "ruff-0.1.8-py3-none-win32.whl", hash = "sha256:e49fbdfe257fa41e5c9e13c79b9e79a23a79bd0e40b9314bc53840f520c2c0b3"}, + {file = "ruff-0.1.8-py3-none-win_amd64.whl", hash = "sha256:f41f692f1691ad87f51708b823af4bb2c5c87c9248ddd3191c8f088e66ce590a"}, + {file = "ruff-0.1.8-py3-none-win_arm64.whl", hash = "sha256:aa8ee4f8440023b0a6c3707f76cadce8657553655dcbb5fc9b2f9bb9bee389f6"}, + {file = "ruff-0.1.8.tar.gz", hash = "sha256:f7ee467677467526cfe135eab86a40a0e8db43117936ac4f9b469ce9cdb3fb62"}, ] [[package]] name = "s3transfer" -version = "0.6.0" +version = "0.7.0" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">= 3.7" files = [ - {file = "s3transfer-0.6.0-py3-none-any.whl", hash = "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd"}, - {file = "s3transfer-0.6.0.tar.gz", hash = "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947"}, + {file = "s3transfer-0.7.0-py3-none-any.whl", hash = "sha256:10d6923c6359175f264811ef4bf6161a3156ce8e350e705396a7557d6293c33a"}, + {file = "s3transfer-0.7.0.tar.gz", hash = "sha256:fd3889a66f5fe17299fe75b82eae6cf722554edca744ca5d5fe308b104883d2e"}, ] [package.dependencies] @@ -6558,123 +7244,235 @@ botocore = ">=1.12.36,<2.0a.0" [package.extras] crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] +[[package]] +name = "scikit-learn" +version = "1.3.2" +description = "A set of python modules for machine learning and data mining" +optional = false +python-versions = ">=3.8" +files = [ + {file = "scikit-learn-1.3.2.tar.gz", hash = "sha256:a2f54c76accc15a34bfb9066e6c7a56c1e7235dda5762b990792330b52ccfb05"}, + {file = "scikit_learn-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e326c0eb5cf4d6ba40f93776a20e9a7a69524c4db0757e7ce24ba222471ee8a1"}, + {file = "scikit_learn-1.3.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:535805c2a01ccb40ca4ab7d081d771aea67e535153e35a1fd99418fcedd1648a"}, + {file = "scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1215e5e58e9880b554b01187b8c9390bf4dc4692eedeaf542d3273f4785e342c"}, + {file = "scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ee107923a623b9f517754ea2f69ea3b62fc898a3641766cb7deb2f2ce450161"}, + {file = "scikit_learn-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:35a22e8015048c628ad099da9df5ab3004cdbf81edc75b396fd0cff8699ac58c"}, + {file = "scikit_learn-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6fb6bc98f234fda43163ddbe36df8bcde1d13ee176c6dc9b92bb7d3fc842eb66"}, + {file = "scikit_learn-1.3.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:18424efee518a1cde7b0b53a422cde2f6625197de6af36da0b57ec502f126157"}, + {file = "scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3271552a5eb16f208a6f7f617b8cc6d1f137b52c8a1ef8edf547db0259b2c9fb"}, + {file = "scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4144a5004a676d5022b798d9e573b05139e77f271253a4703eed295bde0433"}, + {file = "scikit_learn-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:67f37d708f042a9b8d59551cf94d30431e01374e00dc2645fa186059c6c5d78b"}, + {file = "scikit_learn-1.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8db94cd8a2e038b37a80a04df8783e09caac77cbe052146432e67800e430c028"}, + {file = "scikit_learn-1.3.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:61a6efd384258789aa89415a410dcdb39a50e19d3d8410bd29be365bcdd512d5"}, + {file = "scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb06f8dce3f5ddc5dee1715a9b9f19f20d295bed8e3cd4fa51e1d050347de525"}, + {file = "scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b2de18d86f630d68fe1f87af690d451388bb186480afc719e5f770590c2ef6c"}, + {file = "scikit_learn-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:0402638c9a7c219ee52c94cbebc8fcb5eb9fe9c773717965c1f4185588ad3107"}, + {file = "scikit_learn-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a19f90f95ba93c1a7f7924906d0576a84da7f3b2282ac3bfb7a08a32801add93"}, + {file = "scikit_learn-1.3.2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:b8692e395a03a60cd927125eef3a8e3424d86dde9b2370d544f0ea35f78a8073"}, + {file = "scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15e1e94cc23d04d39da797ee34236ce2375ddea158b10bee3c343647d615581d"}, + {file = "scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:785a2213086b7b1abf037aeadbbd6d67159feb3e30263434139c98425e3dcfcf"}, + {file = "scikit_learn-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:64381066f8aa63c2710e6b56edc9f0894cc7bf59bd71b8ce5613a4559b6145e0"}, + {file = "scikit_learn-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6c43290337f7a4b969d207e620658372ba3c1ffb611f8bc2b6f031dc5c6d1d03"}, + {file = "scikit_learn-1.3.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:dc9002fc200bed597d5d34e90c752b74df516d592db162f756cc52836b38fe0e"}, + {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d08ada33e955c54355d909b9c06a4789a729977f165b8bae6f225ff0a60ec4a"}, + {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763f0ae4b79b0ff9cca0bf3716bcc9915bdacff3cebea15ec79652d1cc4fa5c9"}, + {file = "scikit_learn-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:ed932ea780517b00dae7431e031faae6b49b20eb6950918eb83bd043237950e0"}, +] + +[package.dependencies] +joblib = ">=1.1.1" +numpy = ">=1.17.3,<2.0" +scipy = ">=1.5.0" +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.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.10.1)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] +tests = ["black (>=23.3.0)", "matplotlib (>=3.1.3)", "mypy (>=1.3)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.0.272)", "scikit-image (>=0.16.2)"] + [[package]] name = "scipy" -version = "1.9.3" +version = "1.11.4" description = "Fundamental algorithms for scientific computing in Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" 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"}, + {file = "scipy-1.11.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc9a714581f561af0848e6b69947fda0614915f072dfd14142ed1bfe1b806710"}, + {file = "scipy-1.11.4-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cf00bd2b1b0211888d4dc75656c0412213a8b25e80d73898083f402b50f47e41"}, + {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9999c008ccf00e8fbcce1236f85ade5c569d13144f77a1946bef8863e8f6eb4"}, + {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:933baf588daa8dc9a92c20a0be32f56d43faf3d1a60ab11b3f08c356430f6e56"}, + {file = "scipy-1.11.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8fce70f39076a5aa62e92e69a7f62349f9574d8405c0a5de6ed3ef72de07f446"}, + {file = "scipy-1.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:6550466fbeec7453d7465e74d4f4b19f905642c89a7525571ee91dd7adabb5a3"}, + {file = "scipy-1.11.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f313b39a7e94f296025e3cffc2c567618174c0b1dde173960cf23808f9fae4be"}, + {file = "scipy-1.11.4-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1b7c3dca977f30a739e0409fb001056484661cb2541a01aba0bb0029f7b68db8"}, + {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00150c5eae7b610c32589dda259eacc7c4f1665aedf25d921907f4d08a951b1c"}, + {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530f9ad26440e85766509dbf78edcfe13ffd0ab7fec2560ee5c36ff74d6269ff"}, + {file = "scipy-1.11.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5e347b14fe01003d3b78e196e84bd3f48ffe4c8a7b8a1afbcb8f5505cb710993"}, + {file = "scipy-1.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:acf8ed278cc03f5aff035e69cb511741e0418681d25fbbb86ca65429c4f4d9cd"}, + {file = "scipy-1.11.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:028eccd22e654b3ea01ee63705681ee79933652b2d8f873e7949898dda6d11b6"}, + {file = "scipy-1.11.4-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c6ff6ef9cc27f9b3db93a6f8b38f97387e6e0591600369a297a50a8e96e835d"}, + {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b030c6674b9230d37c5c60ab456e2cf12f6784596d15ce8da9365e70896effc4"}, + {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad669df80528aeca5f557712102538f4f37e503f0c5b9541655016dd0932ca79"}, + {file = "scipy-1.11.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce7fff2e23ab2cc81ff452a9444c215c28e6305f396b2ba88343a567feec9660"}, + {file = "scipy-1.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:36750b7733d960d7994888f0d148d31ea3017ac15eef664194b4ef68d36a4a97"}, + {file = "scipy-1.11.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e619aba2df228a9b34718efb023966da781e89dd3d21637b27f2e54db0410d7"}, + {file = "scipy-1.11.4-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:f3cd9e7b3c2c1ec26364856f9fbe78695fe631150f94cd1c22228456404cf1ec"}, + {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d10e45a6c50211fe256da61a11c34927c68f277e03138777bdebedd933712fea"}, + {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91af76a68eeae0064887a48e25c4e616fa519fa0d38602eda7e0f97d65d57937"}, + {file = "scipy-1.11.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6df1468153a31cf55ed5ed39647279beb9cfb5d3f84369453b49e4b8502394fd"}, + {file = "scipy-1.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:ee410e6de8f88fd5cf6eadd73c135020bfbbbdfcd0f6162c36a7638a1ea8cc65"}, + {file = "scipy-1.11.4.tar.gz", hash = "sha256:90a2b78e7f5733b9de748f589f09225013685f9b218275257f8a8168ededaeaa"}, ] [package.dependencies] -numpy = ">=1.18.5,<1.26.0" +numpy = ">=1.21.6,<1.28.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"] +dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "sentry-sdk" +version = "1.33.1" +description = "Python client for Sentry (https://sentry.io)" +optional = false +python-versions = "*" +files = [ + {file = "sentry-sdk-1.33.1.tar.gz", hash = "sha256:816aeb900a54bba2d9346bad8ffac2d258c4fa09271b95a6533a714e9000f074"}, + {file = "sentry_sdk-1.33.1-py2.py3-none-any.whl", hash = "sha256:1cce906dc86afda1ecd22c4716b0c846639151a3c3b59e23826711c6525c5642"}, +] + +[package.dependencies] +certifi = "*" +urllib3 = {version = ">=1.26.11", markers = "python_version >= \"3.6\""} + +[package.extras] +aiohttp = ["aiohttp (>=3.5)"] +arq = ["arq (>=0.23)"] +asyncpg = ["asyncpg (>=0.23)"] +beam = ["apache-beam (>=2.12)"] +bottle = ["bottle (>=0.12.13)"] +celery = ["celery (>=3)"] +chalice = ["chalice (>=1.16.0)"] +clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] +django = ["django (>=1.8)"] +falcon = ["falcon (>=1.4)"] +fastapi = ["fastapi (>=0.79.0)"] +flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] +grpcio = ["grpcio (>=1.21.1)"] +httpx = ["httpx (>=0.16.0)"] +huey = ["huey (>=2)"] +loguru = ["loguru (>=0.5)"] +opentelemetry = ["opentelemetry-distro (>=0.35b0)"] +opentelemetry-experimental = ["opentelemetry-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] +pure-eval = ["asttokens", "executing", "pure_eval"] +pymongo = ["pymongo (>=3.1)"] +pyspark = ["pyspark (>=2.4.4)"] +quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] +rq = ["rq (>=0.6)"] +sanic = ["sanic (>=0.8)"] +sqlalchemy = ["sqlalchemy (>=1.2)"] +starlette = ["starlette (>=0.19.1)"] +starlite = ["starlite (>=1.48)"] +tornado = ["tornado (>=5)"] [[package]] name = "setproctitle" -version = "1.3.2" +version = "1.3.3" description = "A Python module to customize the process title" optional = false python-versions = ">=3.7" files = [ - {file = "setproctitle-1.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:288943dec88e178bb2fd868adf491197cc0fc8b6810416b1c6775e686bab87fe"}, - {file = "setproctitle-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:630f6fe5e24a619ccf970c78e084319ee8be5be253ecc9b5b216b0f474f5ef18"}, - {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c877691b90026670e5a70adfbcc735460a9f4c274d35ec5e8a43ce3f8443005"}, - {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a55fe05f15c10e8c705038777656fe45e3bd676d49ad9ac8370b75c66dd7cd7"}, - {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab45146c71ca6592c9cc8b354a2cc9cc4843c33efcbe1d245d7d37ce9696552d"}, - {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00c9d5c541a2713ba0e657e0303bf96ddddc412ef4761676adc35df35d7c246"}, - {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:265ecbe2c6eafe82e104f994ddd7c811520acdd0647b73f65c24f51374cf9494"}, - {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c2c46200656280a064073447ebd363937562debef329482fd7e570c8d498f806"}, - {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:fa2f50678f04fda7a75d0fe5dd02bbdd3b13cbe6ed4cf626e4472a7ccf47ae94"}, - {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7f2719a398e1a2c01c2a63bf30377a34d0b6ef61946ab9cf4d550733af8f1ef1"}, - {file = "setproctitle-1.3.2-cp310-cp310-win32.whl", hash = "sha256:e425be62524dc0c593985da794ee73eb8a17abb10fe692ee43bb39e201d7a099"}, - {file = "setproctitle-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:e85e50b9c67854f89635a86247412f3ad66b132a4d8534ac017547197c88f27d"}, - {file = "setproctitle-1.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a97d51c17d438cf5be284775a322d57b7ca9505bb7e118c28b1824ecaf8aeaa"}, - {file = "setproctitle-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:587c7d6780109fbd8a627758063d08ab0421377c0853780e5c356873cdf0f077"}, - {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d17c8bd073cbf8d141993db45145a70b307385b69171d6b54bcf23e5d644de"}, - {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e932089c35a396dc31a5a1fc49889dd559548d14cb2237adae260382a090382e"}, - {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e4f8f12258a8739c565292a551c3db62cca4ed4f6b6126664e2381acb4931bf"}, - {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:570d255fd99c7f14d8f91363c3ea96bd54f8742275796bca67e1414aeca7d8c3"}, - {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a8e0881568c5e6beff91ef73c0ec8ac2a9d3ecc9edd6bd83c31ca34f770910c4"}, - {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4bba3be4c1fabf170595b71f3af46c6d482fbe7d9e0563999b49999a31876f77"}, - {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:37ece938110cab2bb3957e3910af8152ca15f2b6efdf4f2612e3f6b7e5459b80"}, - {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db684d6bbb735a80bcbc3737856385b55d53f8a44ce9b46e9a5682c5133a9bf7"}, - {file = "setproctitle-1.3.2-cp311-cp311-win32.whl", hash = "sha256:ca58cd260ea02759238d994cfae844fc8b1e206c684beb8f38877dcab8451dfc"}, - {file = "setproctitle-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:88486e6cce2a18a033013d17b30a594f1c5cb42520c49c19e6ade40b864bb7ff"}, - {file = "setproctitle-1.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:92c626edc66169a1b09e9541b9c0c9f10488447d8a2b1d87c8f0672e771bc927"}, - {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:710e16fa3bade3b026907e4a5e841124983620046166f355bbb84be364bf2a02"}, - {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f29b75e86260b0ab59adb12661ef9f113d2f93a59951373eb6d68a852b13e83"}, - {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c8d9650154afaa86a44ff195b7b10d683c73509d085339d174e394a22cccbb9"}, - {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0452282258dfcc01697026a8841258dd2057c4438b43914b611bccbcd048f10"}, - {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e49ae693306d7624015f31cb3e82708916759d592c2e5f72a35c8f4cc8aef258"}, - {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1ff863a20d1ff6ba2c24e22436a3daa3cd80be1dfb26891aae73f61b54b04aca"}, - {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:55ce1e9925ce1765865442ede9dca0ba9bde10593fcd570b1f0fa25d3ec6b31c"}, - {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7fe9df7aeb8c64db6c34fc3b13271a363475d77bc157d3f00275a53910cb1989"}, - {file = "setproctitle-1.3.2-cp37-cp37m-win32.whl", hash = "sha256:e5c50e164cd2459bc5137c15288a9ef57160fd5cbf293265ea3c45efe7870865"}, - {file = "setproctitle-1.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a499fff50387c1520c085a07578a000123f519e5f3eee61dd68e1d301659651f"}, - {file = "setproctitle-1.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5b932c3041aa924163f4aab970c2f0e6b4d9d773f4d50326e0ea1cd69240e5c5"}, - {file = "setproctitle-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4bfc89bd33ebb8e4c0e9846a09b1f5a4a86f5cb7a317e75cc42fee1131b4f4f"}, - {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd3cf4286a60fdc95451d8d14e0389a6b4f5cebe02c7f2609325eb016535963"}, - {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5fb4f769c02f63fac90989711a3fee83919f47ae9afd4758ced5d86596318c65"}, - {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5194b4969f82ea842a4f6af2f82cd16ebdc3f1771fb2771796e6add9835c1973"}, - {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cde41857a644b7353a0060b5f94f7ba7cf593ebde5a1094da1be581ac9a31"}, - {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9124bedd8006b0e04d4e8a71a0945da9b67e7a4ab88fdad7b1440dc5b6122c42"}, - {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c8a09d570b39517de10ee5b718730e171251ce63bbb890c430c725c8c53d4484"}, - {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:8ff3c8cb26afaed25e8bca7b9dd0c1e36de71f35a3a0706b5c0d5172587a3827"}, - {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:589be87172b238f839e19f146b9ea47c71e413e951ef0dc6db4218ddacf3c202"}, - {file = "setproctitle-1.3.2-cp38-cp38-win32.whl", hash = "sha256:4749a2b0c9ac52f864d13cee94546606f92b981b50e46226f7f830a56a9dc8e1"}, - {file = "setproctitle-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:e43f315c68aa61cbdef522a2272c5a5b9b8fd03c301d3167b5e1343ef50c676c"}, - {file = "setproctitle-1.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:de3a540cd1817ede31f530d20e6a4935bbc1b145fd8f8cf393903b1e02f1ae76"}, - {file = "setproctitle-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4058564195b975ddc3f0462375c533cce310ccdd41b80ac9aed641c296c3eff4"}, - {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c5d5dad7c28bdd1ec4187d818e43796f58a845aa892bb4481587010dc4d362b"}, - {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ffc61a388a5834a97953d6444a2888c24a05f2e333f9ed49f977a87bb1ad4761"}, - {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fa1a0fbee72b47dc339c87c890d3c03a72ea65c061ade3204f285582f2da30f"}, - {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8a988c7220c002c45347430993830666e55bc350179d91fcee0feafe64e1d4"}, - {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bae283e85fc084b18ffeb92e061ff7ac5af9e183c9d1345c93e178c3e5069cbe"}, - {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fed18e44711c5af4b681c2b3b18f85e6f0f1b2370a28854c645d636d5305ccd8"}, - {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:b34baef93bfb20a8ecb930e395ccd2ae3268050d8cf4fe187de5e2bd806fd796"}, - {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7f0bed90a216ef28b9d227d8d73e28a8c9b88c0f48a082d13ab3fa83c581488f"}, - {file = "setproctitle-1.3.2-cp39-cp39-win32.whl", hash = "sha256:4d8938249a7cea45ab7e1e48b77685d0f2bab1ebfa9dde23e94ab97968996a7c"}, - {file = "setproctitle-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:a47d97a75fd2d10c37410b180f67a5835cb1d8fdea2648fd7f359d4277f180b9"}, - {file = "setproctitle-1.3.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:dad42e676c5261eb50fdb16bdf3e2771cf8f99a79ef69ba88729aeb3472d8575"}, - {file = "setproctitle-1.3.2-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c91b9bc8985d00239f7dc08a49927a7ca1ca8a6af2c3890feec3ed9665b6f91e"}, - {file = "setproctitle-1.3.2-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8579a43eafd246e285eb3a5b939e7158073d5087aacdd2308f23200eac2458b"}, - {file = "setproctitle-1.3.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:2fbd8187948284293f43533c150cd69a0e4192c83c377da837dbcd29f6b83084"}, - {file = "setproctitle-1.3.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:faec934cfe5fd6ac1151c02e67156c3f526e82f96b24d550b5d51efa4a5527c6"}, - {file = "setproctitle-1.3.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1aafc91cbdacc9e5fe712c52077369168e6b6c346f3a9d51bf600b53eae56bb"}, - {file = "setproctitle-1.3.2-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b617f12c9be61e8f4b2857be4a4319754756845dbbbd9c3718f468bbb1e17bcb"}, - {file = "setproctitle-1.3.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b2c9cb2705fc84cb8798f1ba74194f4c080aaef19d9dae843591c09b97678e98"}, - {file = "setproctitle-1.3.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a149a5f7f2c5a065d4e63cb0d7a4b6d3b66e6e80f12e3f8827c4f63974cbf122"}, - {file = "setproctitle-1.3.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e3ac25bfc4a0f29d2409650c7532d5ddfdbf29f16f8a256fc31c47d0dc05172"}, - {file = "setproctitle-1.3.2-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65d884e22037b23fa25b2baf1a3316602ed5c5971eb3e9d771a38c3a69ce6e13"}, - {file = "setproctitle-1.3.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7aa0aac1711fadffc1d51e9d00a3bea61f68443d6ac0241a224e4d622489d665"}, - {file = "setproctitle-1.3.2.tar.gz", hash = "sha256:b9fb97907c830d260fa0658ed58afd48a86b2b88aac521135c352ff7fd3477fd"}, + {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:897a73208da48db41e687225f355ce993167079eda1260ba5e13c4e53be7f754"}, + {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c331e91a14ba4076f88c29c777ad6b58639530ed5b24b5564b5ed2fd7a95452"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbbd6c7de0771c84b4aa30e70b409565eb1fc13627a723ca6be774ed6b9d9fa3"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c05ac48ef16ee013b8a326c63e4610e2430dbec037ec5c5b58fcced550382b74"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1342f4fdb37f89d3e3c1c0a59d6ddbedbde838fff5c51178a7982993d238fe4f"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc74e84fdfa96821580fb5e9c0b0777c1c4779434ce16d3d62a9c4d8c710df39"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9617b676b95adb412bb69645d5b077d664b6882bb0d37bfdafbbb1b999568d85"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6a249415f5bb88b5e9e8c4db47f609e0bf0e20a75e8d744ea787f3092ba1f2d0"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:38da436a0aaace9add67b999eb6abe4b84397edf4a78ec28f264e5b4c9d53cd5"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:da0d57edd4c95bf221b2ebbaa061e65b1788f1544977288bdf95831b6e44e44d"}, + {file = "setproctitle-1.3.3-cp310-cp310-win32.whl", hash = "sha256:a1fcac43918b836ace25f69b1dca8c9395253ad8152b625064415b1d2f9be4fb"}, + {file = "setproctitle-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:200620c3b15388d7f3f97e0ae26599c0c378fdf07ae9ac5a13616e933cbd2086"}, + {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:334f7ed39895d692f753a443102dd5fed180c571eb6a48b2a5b7f5b3564908c8"}, + {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:950f6476d56ff7817a8fed4ab207727fc5260af83481b2a4b125f32844df513a"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:195c961f54a09eb2acabbfc90c413955cf16c6e2f8caa2adbf2237d1019c7dd8"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f05e66746bf9fe6a3397ec246fe481096664a9c97eb3fea6004735a4daf867fd"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b5901a31012a40ec913265b64e48c2a4059278d9f4e6be628441482dd13fb8b5"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64286f8a995f2cd934082b398fc63fca7d5ffe31f0e27e75b3ca6b4efda4e353"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:184239903bbc6b813b1a8fc86394dc6ca7d20e2ebe6f69f716bec301e4b0199d"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:664698ae0013f986118064b6676d7dcd28fefd0d7d5a5ae9497cbc10cba48fa5"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e5119a211c2e98ff18b9908ba62a3bd0e3fabb02a29277a7232a6fb4b2560aa0"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:417de6b2e214e837827067048f61841f5d7fc27926f2e43954567094051aff18"}, + {file = "setproctitle-1.3.3-cp311-cp311-win32.whl", hash = "sha256:6a143b31d758296dc2f440175f6c8e0b5301ced3b0f477b84ca43cdcf7f2f476"}, + {file = "setproctitle-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a680d62c399fa4b44899094027ec9a1bdaf6f31c650e44183b50d4c4d0ccc085"}, + {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d4460795a8a7a391e3567b902ec5bdf6c60a47d791c3b1d27080fc203d11c9dc"}, + {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bdfd7254745bb737ca1384dee57e6523651892f0ea2a7344490e9caefcc35e64"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477d3da48e216d7fc04bddab67b0dcde633e19f484a146fd2a34bb0e9dbb4a1e"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ab2900d111e93aff5df9fddc64cf51ca4ef2c9f98702ce26524f1acc5a786ae7"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:088b9efc62d5aa5d6edf6cba1cf0c81f4488b5ce1c0342a8b67ae39d64001120"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6d50252377db62d6a0bb82cc898089916457f2db2041e1d03ce7fadd4a07381"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:87e668f9561fd3a457ba189edfc9e37709261287b52293c115ae3487a24b92f6"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:287490eb90e7a0ddd22e74c89a92cc922389daa95babc833c08cf80c84c4df0a"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe1c49486109f72d502f8be569972e27f385fe632bd8895f4730df3c87d5ac8"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4a6ba2494a6449b1f477bd3e67935c2b7b0274f2f6dcd0f7c6aceae10c6c6ba3"}, + {file = "setproctitle-1.3.3-cp312-cp312-win32.whl", hash = "sha256:2df2b67e4b1d7498632e18c56722851ba4db5d6a0c91aaf0fd395111e51cdcf4"}, + {file = "setproctitle-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:f38d48abc121263f3b62943f84cbaede05749047e428409c2c199664feb6abc7"}, + {file = "setproctitle-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:816330675e3504ae4d9a2185c46b573105d2310c20b19ea2b4596a9460a4f674"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68f960bc22d8d8e4ac886d1e2e21ccbd283adcf3c43136161c1ba0fa509088e0"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00e6e7adff74796ef12753ff399491b8827f84f6c77659d71bd0b35870a17d8f"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53bc0d2358507596c22b02db079618451f3bd720755d88e3cccd840bafb4c41c"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad6d20f9541f5f6ac63df553b6d7a04f313947f550eab6a61aa758b45f0d5657"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c1c84beab776b0becaa368254801e57692ed749d935469ac10e2b9b825dbdd8e"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:507e8dc2891021350eaea40a44ddd887c9f006e6b599af8d64a505c0f718f170"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b1067647ac7aba0b44b591936118a22847bda3c507b0a42d74272256a7a798e9"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2e71f6365744bf53714e8bd2522b3c9c1d83f52ffa6324bd7cbb4da707312cd8"}, + {file = "setproctitle-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:7f1d36a1e15a46e8ede4e953abb104fdbc0845a266ec0e99cc0492a4364f8c44"}, + {file = "setproctitle-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9a402881ec269d0cc9c354b149fc29f9ec1a1939a777f1c858cdb09c7a261df"}, + {file = "setproctitle-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ff814dea1e5c492a4980e3e7d094286077054e7ea116cbeda138819db194b2cd"}, + {file = "setproctitle-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:accb66d7b3ccb00d5cd11d8c6e07055a4568a24c95cf86109894dcc0c134cc89"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554eae5a5b28f02705b83a230e9d163d645c9a08914c0ad921df363a07cf39b1"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a911b26264dbe9e8066c7531c0591cfab27b464459c74385b276fe487ca91c12"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2982efe7640c4835f7355fdb4da313ad37fb3b40f5c69069912f8048f77b28c8"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df3f4274b80709d8bcab2f9a862973d453b308b97a0b423a501bcd93582852e3"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:af2c67ae4c795d1674a8d3ac1988676fa306bcfa1e23fddb5e0bd5f5635309ca"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:af4061f67fd7ec01624c5e3c21f6b7af2ef0e6bab7fbb43f209e6506c9ce0092"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:37a62cbe16d4c6294e84670b59cf7adcc73faafe6af07f8cb9adaf1f0e775b19"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a83ca086fbb017f0d87f240a8f9bbcf0809f3b754ee01cec928fff926542c450"}, + {file = "setproctitle-1.3.3-cp38-cp38-win32.whl", hash = "sha256:059f4ce86f8cc92e5860abfc43a1dceb21137b26a02373618d88f6b4b86ba9b2"}, + {file = "setproctitle-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:ab92e51cd4a218208efee4c6d37db7368fdf182f6e7ff148fb295ecddf264287"}, + {file = "setproctitle-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c7951820b77abe03d88b114b998867c0f99da03859e5ab2623d94690848d3e45"}, + {file = "setproctitle-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc94cf128676e8fac6503b37763adb378e2b6be1249d207630f83fc325d9b11"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f5d9027eeda64d353cf21a3ceb74bb1760bd534526c9214e19f052424b37e42"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e4a8104db15d3462e29d9946f26bed817a5b1d7a47eabca2d9dc2b995991503"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c32c41ace41f344d317399efff4cffb133e709cec2ef09c99e7a13e9f3b9483c"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbf16381c7bf7f963b58fb4daaa65684e10966ee14d26f5cc90f07049bfd8c1e"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e18b7bd0898398cc97ce2dfc83bb192a13a087ef6b2d5a8a36460311cb09e775"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69d565d20efe527bd8a9b92e7f299ae5e73b6c0470f3719bd66f3cd821e0d5bd"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ddedd300cd690a3b06e7eac90ed4452348b1348635777ce23d460d913b5b63c3"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:415bfcfd01d1fbf5cbd75004599ef167a533395955305f42220a585f64036081"}, + {file = "setproctitle-1.3.3-cp39-cp39-win32.whl", hash = "sha256:21112fcd2195d48f25760f0eafa7a76510871bbb3b750219310cf88b04456ae3"}, + {file = "setproctitle-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:5a740f05d0968a5a17da3d676ce6afefebeeeb5ce137510901bf6306ba8ee002"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6b9e62ddb3db4b5205c0321dd69a406d8af9ee1693529d144e86bd43bcb4b6c0"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e3b99b338598de0bd6b2643bf8c343cf5ff70db3627af3ca427a5e1a1a90dd9"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ae9a02766dad331deb06855fb7a6ca15daea333b3967e214de12cfae8f0ef5"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:200ede6fd11233085ba9b764eb055a2a191fb4ffb950c68675ac53c874c22e20"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0d3a953c50776751e80fe755a380a64cb14d61e8762bd43041ab3f8cc436092f"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e08e232b78ba3ac6bc0d23ce9e2bee8fad2be391b7e2da834fc9a45129eb87"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1da82c3e11284da4fcbf54957dafbf0655d2389cd3d54e4eaba636faf6d117a"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:aeaa71fb9568ebe9b911ddb490c644fbd2006e8c940f21cb9a1e9425bd709574"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:59335d000c6250c35989394661eb6287187854e94ac79ea22315469ee4f4c244"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3ba57029c9c50ecaf0c92bb127224cc2ea9fda057b5d99d3f348c9ec2855ad3"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d876d355c53d975c2ef9c4f2487c8f83dad6aeaaee1b6571453cb0ee992f55f6"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:224602f0939e6fb9d5dd881be1229d485f3257b540f8a900d4271a2c2aa4e5f4"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d7f27e0268af2d7503386e0e6be87fb9b6657afd96f5726b733837121146750d"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5e7266498cd31a4572378c61920af9f6b4676a73c299fce8ba93afd694f8ae7"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33c5609ad51cd99d388e55651b19148ea99727516132fb44680e1f28dd0d1de9"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:eae8988e78192fd1a3245a6f4f382390b61bce6cfcc93f3809726e4c885fa68d"}, + {file = "setproctitle-1.3.3.tar.gz", hash = "sha256:c913e151e7ea01567837ff037a23ca8740192880198b7fbb90b16d181607caae"}, ] [package.extras] @@ -6682,75 +7480,87 @@ test = ["pytest"] [[package]] name = "setuptools" -version = "66.1.1" +version = "68.2.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "setuptools-66.1.1-py3-none-any.whl", hash = "sha256:6f590d76b713d5de4e49fe4fbca24474469f53c83632d5d0fd056f7ff7e8112b"}, - {file = "setuptools-66.1.1.tar.gz", hash = "sha256:ac4008d396bc9cd983ea483cb7139c0240a07bbc74ffb6232fceffedc6cf03a8"}, + {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, + {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, ] [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"] +docs = ["furo", "jaraco.packaging (>=9.3)", "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 (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "shapely" -version = "1.8.5.post1" -description = "Geometric objects, predicates, and operations" +version = "2.0.2" +description = "Manipulation and analysis of geometric objects" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shapely-2.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6ca8cffbe84ddde8f52b297b53f8e0687bd31141abb2c373fd8a9f032df415d6"}, + {file = "shapely-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:baa14fc27771e180c06b499a0a7ba697c7988c7b2b6cba9a929a19a4d2762de3"}, + {file = "shapely-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:36480e32c434d168cdf2f5e9862c84aaf4d714a43a8465ae3ce8ff327f0affb7"}, + {file = "shapely-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ef753200cbffd4f652efb2c528c5474e5a14341a473994d90ad0606522a46a2"}, + {file = "shapely-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9a41ff4323fc9d6257759c26eb1cf3a61ebc7e611e024e6091f42977303fd3a"}, + {file = "shapely-2.0.2-cp310-cp310-win32.whl", hash = "sha256:72b5997272ae8c25f0fd5b3b967b3237e87fab7978b8d6cd5fa748770f0c5d68"}, + {file = "shapely-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:34eac2337cbd67650248761b140d2535855d21b969d76d76123317882d3a0c1a"}, + {file = "shapely-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b0c052709c8a257c93b0d4943b0b7a3035f87e2d6a8ac9407b6a992d206422f"}, + {file = "shapely-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2d217e56ae067e87b4e1731d0dc62eebe887ced729ba5c2d4590e9e3e9fdbd88"}, + {file = "shapely-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94ac128ae2ab4edd0bffcd4e566411ea7bdc738aeaf92c32a8a836abad725f9f"}, + {file = "shapely-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa3ee28f5e63a130ec5af4dc3c4cb9c21c5788bb13c15e89190d163b14f9fb89"}, + {file = "shapely-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:737dba15011e5a9b54a8302f1748b62daa207c9bc06f820cd0ad32a041f1c6f2"}, + {file = "shapely-2.0.2-cp311-cp311-win32.whl", hash = "sha256:45ac6906cff0765455a7b49c1670af6e230c419507c13e2f75db638c8fc6f3bd"}, + {file = "shapely-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:dc9342fc82e374130db86a955c3c4525bfbf315a248af8277a913f30911bed9e"}, + {file = "shapely-2.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:06f193091a7c6112fc08dfd195a1e3846a64306f890b151fa8c63b3e3624202c"}, + {file = "shapely-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:eebe544df5c018134f3c23b6515877f7e4cd72851f88a8d0c18464f414d141a2"}, + {file = "shapely-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7e92e7c255f89f5cdf777690313311f422aa8ada9a3205b187113274e0135cd8"}, + {file = "shapely-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be46d5509b9251dd9087768eaf35a71360de6afac82ce87c636990a0871aa18b"}, + {file = "shapely-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5533a925d8e211d07636ffc2fdd9a7f9f13d54686d00577eeb11d16f00be9c4"}, + {file = "shapely-2.0.2-cp312-cp312-win32.whl", hash = "sha256:084b023dae8ad3d5b98acee9d3bf098fdf688eb0bb9b1401e8b075f6a627b611"}, + {file = "shapely-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:ea84d1cdbcf31e619d672b53c4532f06253894185ee7acb8ceb78f5f33cbe033"}, + {file = "shapely-2.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ed1e99702125e7baccf401830a3b94d810d5c70b329b765fe93451fe14cf565b"}, + {file = "shapely-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7d897e6bdc6bc64f7f65155dbbb30e49acaabbd0d9266b9b4041f87d6e52b3a"}, + {file = "shapely-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0521d76d1e8af01e712db71da9096b484f081e539d4f4a8c97342e7971d5e1b4"}, + {file = "shapely-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:5324be299d4c533ecfcfd43424dfd12f9428fd6f12cda38a4316da001d6ef0ea"}, + {file = "shapely-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:78128357a0cee573257a0c2c388d4b7bf13cb7dbe5b3fe5d26d45ebbe2a39e25"}, + {file = "shapely-2.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87dc2be34ac3a3a4a319b963c507ac06682978a5e6c93d71917618b14f13066e"}, + {file = "shapely-2.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:42997ac806e4583dad51c80a32d38570fd9a3d4778f5e2c98f9090aa7db0fe91"}, + {file = "shapely-2.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ccfd5fa10a37e67dbafc601c1ddbcbbfef70d34c3f6b0efc866ddbdb55893a6c"}, + {file = "shapely-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7c95d3379ae3abb74058938a9fcbc478c6b2e28d20dace38f8b5c587dde90aa"}, + {file = "shapely-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a21353d28209fb0d8cc083e08ca53c52666e0d8a1f9bbe23b6063967d89ed24"}, + {file = "shapely-2.0.2-cp38-cp38-win32.whl", hash = "sha256:03e63a99dfe6bd3beb8d5f41ec2086585bb969991d603f9aeac335ad396a06d4"}, + {file = "shapely-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:c6fd29fbd9cd76350bd5cc14c49de394a31770aed02d74203e23b928f3d2f1aa"}, + {file = "shapely-2.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1f217d28ecb48e593beae20a0082a95bd9898d82d14b8fcb497edf6bff9a44d7"}, + {file = "shapely-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:394e5085b49334fd5b94fa89c086edfb39c3ecab7f669e8b2a4298b9d523b3a5"}, + {file = "shapely-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fd3ad17b64466a033848c26cb5b509625c87d07dcf39a1541461cacdb8f7e91c"}, + {file = "shapely-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d41a116fcad58048d7143ddb01285e1a8780df6dc1f56c3b1e1b7f12ed296651"}, + {file = "shapely-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dea9a0651333cf96ef5bb2035044e3ad6a54f87d90e50fe4c2636debf1b77abc"}, + {file = "shapely-2.0.2-cp39-cp39-win32.whl", hash = "sha256:b8eb0a92f7b8c74f9d8fdd1b40d395113f59bd8132ca1348ebcc1f5aece94b96"}, + {file = "shapely-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:794affd80ca0f2c536fc948a3afa90bd8fb61ebe37fe873483ae818e7f21def4"}, + {file = "shapely-2.0.2.tar.gz", hash = "sha256:1713cc04c171baffc5b259ba8531c58acc2a301707b7f021d88a15ed090649e7"}, +] + +[package.dependencies] +numpy = ">=1.14" + +[package.extras] +docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "shellingham" +version = "1.5.4" +description = "Tool to Detect Surrounding Shell" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "Shapely-1.8.5.post1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d048f93e42ba578b82758c15d8ae037d08e69d91d9872bca5a1895b118f4e2b0"}, - {file = "Shapely-1.8.5.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99ab0ddc05e44acabdbe657c599fdb9b2d82e86c5493bdae216c0c4018a82dee"}, - {file = "Shapely-1.8.5.post1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:99a2f0da0109e81e0c101a2b4cd8412f73f5f299e7b5b2deaf64cd2a100ac118"}, - {file = "Shapely-1.8.5.post1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6fe855e7d45685926b6ba00aaeb5eba5862611f7465775dacd527e081a8ced6d"}, - {file = "Shapely-1.8.5.post1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec14ceca36f67cb48b34d02d7f65a9acae15cd72b48e303531893ba4a960f3ea"}, - {file = "Shapely-1.8.5.post1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a2b2a65fa7f97115c1cd989fe9d6f39281ca2a8a014f1d4904c1a6e34d7f25"}, - {file = "Shapely-1.8.5.post1-cp310-cp310-win32.whl", hash = "sha256:21776184516a16bf82a0c3d6d6a312b3cd15a4cabafc61ee01cf2714a82e8396"}, - {file = "Shapely-1.8.5.post1-cp310-cp310-win_amd64.whl", hash = "sha256:a354199219c8d836f280b88f2c5102c81bb044ccea45bd361dc38a79f3873714"}, - {file = "Shapely-1.8.5.post1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:783bad5f48e2708a0e2f695a34ed382e4162c795cb2f0368b39528ac1d6db7ed"}, - {file = "Shapely-1.8.5.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a23ef3882d6aa203dd3623a3d55d698f59bfbd9f8a3bfed52c2da05a7f0f8640"}, - {file = "Shapely-1.8.5.post1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ab38f7b5196ace05725e407cb8cab9ff66edb8e6f7bb36a398e8f73f52a7aaa2"}, - {file = "Shapely-1.8.5.post1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d086591f744be483b34628b391d741e46f2645fe37594319e0a673cc2c26bcf"}, - {file = "Shapely-1.8.5.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4728666fff8cccc65a07448cae72c75a8773fea061c3f4f139c44adc429b18c3"}, - {file = "Shapely-1.8.5.post1-cp311-cp311-win32.whl", hash = "sha256:84010db15eb364a52b74ea8804ef92a6a930dfc1981d17a369444b6ddec66efd"}, - {file = "Shapely-1.8.5.post1-cp311-cp311-win_amd64.whl", hash = "sha256:48dcfffb9e225c0481120f4bdf622131c8c95f342b00b158cdbe220edbbe20b6"}, - {file = "Shapely-1.8.5.post1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2fd15397638df291c427a53d641d3e6fd60458128029c8c4f487190473a69a91"}, - {file = "Shapely-1.8.5.post1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a74631e511153366c6dbe3229fa93f877e3c87ea8369cd00f1d38c76b0ed9ace"}, - {file = "Shapely-1.8.5.post1-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:66bdac74fbd1d3458fa787191a90fa0ae610f09e2a5ec398c36f968cc0ed743f"}, - {file = "Shapely-1.8.5.post1-cp36-cp36m-win32.whl", hash = "sha256:6d388c0c1bd878ed1af4583695690aa52234b02ed35f93a1c8486ff52a555838"}, - {file = "Shapely-1.8.5.post1-cp36-cp36m-win_amd64.whl", hash = "sha256:be9423d5a3577ac2e92c7e758bd8a2b205f5e51a012177a590bc46fc51eb4834"}, - {file = "Shapely-1.8.5.post1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5d7f85c2d35d39ff53c9216bc76b7641c52326f7e09aaad1789a3611a0f812f2"}, - {file = "Shapely-1.8.5.post1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:adcf8a11b98af9375e32bff91de184f33a68dc48b9cb9becad4f132fa25cfa3c"}, - {file = "Shapely-1.8.5.post1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:753ed0e21ab108bd4282405b9b659f2e985e8502b1a72b978eaa51d3496dee19"}, - {file = "Shapely-1.8.5.post1-cp37-cp37m-win32.whl", hash = "sha256:65b21243d8f6bcd421210daf1fabb9de84de2c04353c5b026173b88d17c1a581"}, - {file = "Shapely-1.8.5.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:370b574c78dc5af3a198a6da5d9b3d7c04654bd2ef7e80e80a3a0992dfb2d9cd"}, - {file = "Shapely-1.8.5.post1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:532a55ee2a6c52d23d6f7d1567c8f0473635f3b270262c44e1b0c88096827e22"}, - {file = "Shapely-1.8.5.post1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3480657460e939f45a7d359ef0e172a081f249312557fe9aa78c4fd3a362d993"}, - {file = "Shapely-1.8.5.post1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b65f5d530ba91e49ffc7c589255e878d2506a8b96ffce69d3b7c4500a9a9eaf8"}, - {file = "Shapely-1.8.5.post1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:147066da0be41b147a61f8eb805dea3b13709dbc873a431ccd7306e24d712bc0"}, - {file = "Shapely-1.8.5.post1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c2822111ddc5bcfb116e6c663e403579d0fe3f147d2a97426011a191c43a7458"}, - {file = "Shapely-1.8.5.post1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b47bb6f9369e8bf3e6dbd33e6a25a47ee02b2874792a529fe04a49bf8bc0df6"}, - {file = "Shapely-1.8.5.post1-cp38-cp38-win32.whl", hash = "sha256:2e0a8c2e55f1be1312b51c92b06462ea89e6bb703fab4b114e7a846d941cfc40"}, - {file = "Shapely-1.8.5.post1-cp38-cp38-win_amd64.whl", hash = "sha256:0d885cb0cf670c1c834df3f371de8726efdf711f18e2a75da5cfa82843a7ab65"}, - {file = "Shapely-1.8.5.post1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0b4ee3132ee90f07d63db3aea316c4c065ed7a26231458dda0874414a09d6ba3"}, - {file = "Shapely-1.8.5.post1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:02dd5d7dc6e46515d88874134dc8fcdc65826bca93c3eecee59d1910c42c1b17"}, - {file = "Shapely-1.8.5.post1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c6a9a4a31cd6e86d0fbe8473ceed83d4fe760b19d949fb557ef668defafea0f6"}, - {file = "Shapely-1.8.5.post1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:38f0fbbcb8ca20c16451c966c1f527cc43968e121c8a048af19ed3e339a921cd"}, - {file = "Shapely-1.8.5.post1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:78fb9d929b8ee15cfd424b6c10879ce1907f24e05fb83310fc47d2cd27088e40"}, - {file = "Shapely-1.8.5.post1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89164e7a9776a19e29f01369a98529321994e2e4d852b92b7e01d4d9804c55bf"}, - {file = "Shapely-1.8.5.post1-cp39-cp39-win32.whl", hash = "sha256:8e59817b0fe63d34baedaabba8c393c0090f061917d18fc0bcc2f621937a8f73"}, - {file = "Shapely-1.8.5.post1-cp39-cp39-win_amd64.whl", hash = "sha256:e9c30b311de2513555ab02464ebb76115d242842b29c412f5a9aa0cac57be9f6"}, - {file = "Shapely-1.8.5.post1.tar.gz", hash = "sha256:ef3be705c3eac282a28058e6c6e5503419b250f482320df2172abcbea642c831"}, -] - -[package.extras] -all = ["numpy", "pytest", "pytest-cov"] -test = ["pytest", "pytest-cov"] -vectorized = ["numpy"] + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, +] [[package]] name = "six" @@ -6765,13 +7575,13 @@ files = [ [[package]] name = "smmap" -version = "5.0.0" +version = "5.0.1" description = "A pure Python implementation of a sliding window memory map manager" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, - {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, ] [[package]] @@ -6798,67 +7608,54 @@ files = [ [[package]] name = "soupsieve" -version = "2.4.1" +version = "2.5" description = "A modern CSS selector implementation for Beautiful Soup." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, - {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, ] [[package]] name = "sqlalchemy" -version = "1.4.49" +version = "1.4.50" description = "Database Abstraction Library" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "SQLAlchemy-1.4.49-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e126cf98b7fd38f1e33c64484406b78e937b1a280e078ef558b95bf5b6895f6"}, - {file = "SQLAlchemy-1.4.49-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:03db81b89fe7ef3857b4a00b63dedd632d6183d4ea5a31c5d8a92e000a41fc71"}, - {file = "SQLAlchemy-1.4.49-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:95b9df9afd680b7a3b13b38adf6e3a38995da5e162cc7524ef08e3be4e5ed3e1"}, - {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a63e43bf3f668c11bb0444ce6e809c1227b8f067ca1068898f3008a273f52b09"}, - {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f835c050ebaa4e48b18403bed2c0fda986525896efd76c245bdd4db995e51a4c"}, - {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c21b172dfb22e0db303ff6419451f0cac891d2e911bb9fbf8003d717f1bcf91"}, - {file = "SQLAlchemy-1.4.49-cp310-cp310-win32.whl", hash = "sha256:5fb1ebdfc8373b5a291485757bd6431de8d7ed42c27439f543c81f6c8febd729"}, - {file = "SQLAlchemy-1.4.49-cp310-cp310-win_amd64.whl", hash = "sha256:f8a65990c9c490f4651b5c02abccc9f113a7f56fa482031ac8cb88b70bc8ccaa"}, - {file = "SQLAlchemy-1.4.49-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8923dfdf24d5aa8a3adb59723f54118dd4fe62cf59ed0d0d65d940579c1170a4"}, - {file = "SQLAlchemy-1.4.49-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9ab2c507a7a439f13ca4499db6d3f50423d1d65dc9b5ed897e70941d9e135b0"}, - {file = "SQLAlchemy-1.4.49-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5debe7d49b8acf1f3035317e63d9ec8d5e4d904c6e75a2a9246a119f5f2fdf3d"}, - {file = "SQLAlchemy-1.4.49-cp311-cp311-win32.whl", hash = "sha256:82b08e82da3756765c2e75f327b9bf6b0f043c9c3925fb95fb51e1567fa4ee87"}, - {file = "SQLAlchemy-1.4.49-cp311-cp311-win_amd64.whl", hash = "sha256:171e04eeb5d1c0d96a544caf982621a1711d078dbc5c96f11d6469169bd003f1"}, - {file = "SQLAlchemy-1.4.49-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:36e58f8c4fe43984384e3fbe6341ac99b6b4e083de2fe838f0fdb91cebe9e9cb"}, - {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b31e67ff419013f99ad6f8fc73ee19ea31585e1e9fe773744c0f3ce58c039c30"}, - {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c14b29d9e1529f99efd550cd04dbb6db6ba5d690abb96d52de2bff4ed518bc95"}, - {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c40f3470e084d31247aea228aa1c39bbc0904c2b9ccbf5d3cfa2ea2dac06f26d"}, - {file = "SQLAlchemy-1.4.49-cp36-cp36m-win32.whl", hash = "sha256:706bfa02157b97c136547c406f263e4c6274a7b061b3eb9742915dd774bbc264"}, - {file = "SQLAlchemy-1.4.49-cp36-cp36m-win_amd64.whl", hash = "sha256:a7f7b5c07ae5c0cfd24c2db86071fb2a3d947da7bd487e359cc91e67ac1c6d2e"}, - {file = "SQLAlchemy-1.4.49-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:4afbbf5ef41ac18e02c8dc1f86c04b22b7a2125f2a030e25bbb4aff31abb224b"}, - {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24e300c0c2147484a002b175f4e1361f102e82c345bf263242f0449672a4bccf"}, - {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:201de072b818f8ad55c80d18d1a788729cccf9be6d9dc3b9d8613b053cd4836d"}, - {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653ed6817c710d0c95558232aba799307d14ae084cc9b1f4c389157ec50df5c"}, - {file = "SQLAlchemy-1.4.49-cp37-cp37m-win32.whl", hash = "sha256:647e0b309cb4512b1f1b78471fdaf72921b6fa6e750b9f891e09c6e2f0e5326f"}, - {file = "SQLAlchemy-1.4.49-cp37-cp37m-win_amd64.whl", hash = "sha256:ab73ed1a05ff539afc4a7f8cf371764cdf79768ecb7d2ec691e3ff89abbc541e"}, - {file = "SQLAlchemy-1.4.49-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:37ce517c011560d68f1ffb28af65d7e06f873f191eb3a73af5671e9c3fada08a"}, - {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1878ce508edea4a879015ab5215546c444233881301e97ca16fe251e89f1c55"}, - {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e8e608983e6f85d0852ca61f97e521b62e67969e6e640fe6c6b575d4db68557"}, - {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccf956da45290df6e809ea12c54c02ace7f8ff4d765d6d3dfb3655ee876ce58d"}, - {file = "SQLAlchemy-1.4.49-cp38-cp38-win32.whl", hash = "sha256:f167c8175ab908ce48bd6550679cc6ea20ae169379e73c7720a28f89e53aa532"}, - {file = "SQLAlchemy-1.4.49-cp38-cp38-win_amd64.whl", hash = "sha256:45806315aae81a0c202752558f0df52b42d11dd7ba0097bf71e253b4215f34f4"}, - {file = "SQLAlchemy-1.4.49-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:b6d0c4b15d65087738a6e22e0ff461b407533ff65a73b818089efc8eb2b3e1de"}, - {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a843e34abfd4c797018fd8d00ffffa99fd5184c421f190b6ca99def4087689bd"}, - {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c890421651b45a681181301b3497e4d57c0d01dc001e10438a40e9a9c25ee77"}, - {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d26f280b8f0a8f497bc10573849ad6dc62e671d2468826e5c748d04ed9e670d5"}, - {file = "SQLAlchemy-1.4.49-cp39-cp39-win32.whl", hash = "sha256:ec2268de67f73b43320383947e74700e95c6770d0c68c4e615e9897e46296294"}, - {file = "SQLAlchemy-1.4.49-cp39-cp39-win_amd64.whl", hash = "sha256:bbdf16372859b8ed3f4d05f925a984771cd2abd18bd187042f24be4886c2a15f"}, - {file = "SQLAlchemy-1.4.49.tar.gz", hash = "sha256:06ff25cbae30c396c4b7737464f2a7fc37a67b7da409993b182b024cec80aed9"}, + {file = "SQLAlchemy-1.4.50-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d00665725063692c42badfd521d0c4392e83c6c826795d38eb88fb108e5660e5"}, + {file = "SQLAlchemy-1.4.50-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85292ff52ddf85a39367057c3d7968a12ee1fb84565331a36a8fead346f08796"}, + {file = "SQLAlchemy-1.4.50-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d0fed0f791d78e7767c2db28d34068649dfeea027b83ed18c45a423f741425cb"}, + {file = "SQLAlchemy-1.4.50-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db4db3c08ffbb18582f856545f058a7a5e4ab6f17f75795ca90b3c38ee0a8ba4"}, + {file = "SQLAlchemy-1.4.50-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14b0cacdc8a4759a1e1bd47dc3ee3f5db997129eb091330beda1da5a0e9e5bd7"}, + {file = "SQLAlchemy-1.4.50-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fb9cb60e0f33040e4f4681e6658a7eb03b5cb4643284172f91410d8c493dace"}, + {file = "SQLAlchemy-1.4.50-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cb501d585aa74a0f86d0ea6263b9c5e1d1463f8f9071392477fd401bd3c7cc"}, + {file = "SQLAlchemy-1.4.50-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a7a66297e46f85a04d68981917c75723e377d2e0599d15fbe7a56abed5e2d75"}, + {file = "SQLAlchemy-1.4.50-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1db0221cb26d66294f4ca18c533e427211673ab86c1fbaca8d6d9ff78654293"}, + {file = "SQLAlchemy-1.4.50-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7dbe6369677a2bea68fe9812c6e4bbca06ebfa4b5cde257b2b0bf208709131"}, + {file = "SQLAlchemy-1.4.50-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a9bddb60566dc45c57fd0a5e14dd2d9e5f106d2241e0a2dc0c1da144f9444516"}, + {file = "SQLAlchemy-1.4.50-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82dd4131d88395df7c318eeeef367ec768c2a6fe5bd69423f7720c4edb79473c"}, + {file = "SQLAlchemy-1.4.50-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:273505fcad22e58cc67329cefab2e436006fc68e3c5423056ee0513e6523268a"}, + {file = "SQLAlchemy-1.4.50-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3257a6e09626d32b28a0c5b4f1a97bced585e319cfa90b417f9ab0f6145c33c"}, + {file = "SQLAlchemy-1.4.50-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d69738d582e3a24125f0c246ed8d712b03bd21e148268421e4a4d09c34f521a5"}, + {file = "SQLAlchemy-1.4.50-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34e1c5d9cd3e6bf3d1ce56971c62a40c06bfc02861728f368dcfec8aeedb2814"}, + {file = "SQLAlchemy-1.4.50-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1fcee5a2c859eecb4ed179edac5ffbc7c84ab09a5420219078ccc6edda45436"}, + {file = "SQLAlchemy-1.4.50-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbaf6643a604aa17e7a7afd74f665f9db882df5c297bdd86c38368f2c471f37d"}, + {file = "SQLAlchemy-1.4.50-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e70e0673d7d12fa6cd363453a0d22dac0d9978500aa6b46aa96e22690a55eab"}, + {file = "SQLAlchemy-1.4.50-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b881ac07d15fb3e4f68c5a67aa5cdaf9eb8f09eb5545aaf4b0a5f5f4659be18"}, + {file = "SQLAlchemy-1.4.50-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f6997da81114daef9203d30aabfa6b218a577fc2bd797c795c9c88c9eb78d49"}, + {file = "SQLAlchemy-1.4.50-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdb77e1789e7596b77fd48d99ec1d2108c3349abd20227eea0d48d3f8cf398d9"}, + {file = "SQLAlchemy-1.4.50-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:128a948bd40780667114b0297e2cc6d657b71effa942e0a368d8cc24293febb3"}, + {file = "SQLAlchemy-1.4.50-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2d526aeea1bd6a442abc7c9b4b00386fd70253b80d54a0930c0a216230a35be"}, + {file = "SQLAlchemy-1.4.50.tar.gz", hash = "sha256:3b97ddf509fc21e10b09403b5219b06c5b558b27fc2453150274fa4e70707dbf"}, ] [package.dependencies] greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} [package.extras] -aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] @@ -6982,13 +7779,13 @@ test = ["pytest", "pytest-cov"] [[package]] name = "stack-data" -version = "0.6.2" +version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = false python-versions = "*" files = [ - {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, - {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, ] [package.dependencies] @@ -7015,13 +7812,13 @@ widechars = ["wcwidth"] [[package]] name = "tenacity" -version = "8.2.2" +version = "8.2.3" description = "Retry code until it succeeds" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, - {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, ] [package.extras] @@ -7029,13 +7826,13 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"] [[package]] name = "termcolor" -version = "2.2.0" +version = "2.3.0" description = "ANSI color formatting for output in terminal" optional = false python-versions = ">=3.7" files = [ - {file = "termcolor-2.2.0-py3-none-any.whl", hash = "sha256:91ddd848e7251200eac969846cbae2dacd7d71c2871e92733289e7e3666f48e7"}, - {file = "termcolor-2.2.0.tar.gz", hash = "sha256:dfc8ac3f350788f23b2947b3e6cfa5a53b630b612e6cd8965a015a776020b99a"}, + {file = "termcolor-2.3.0-py3-none-any.whl", hash = "sha256:3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475"}, + {file = "termcolor-2.3.0.tar.gz", hash = "sha256:b5b08f68937f138fe92f6c089b99f1e2da0ae56c52b78bf7075fd95420fd9a5a"}, ] [package.extras] @@ -7052,6 +7849,17 @@ files = [ {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, ] +[[package]] +name = "threadpoolctl" +version = "3.2.0" +description = "threadpoolctl" +optional = false +python-versions = ">=3.8" +files = [ + {file = "threadpoolctl-3.2.0-py3-none-any.whl", hash = "sha256:2b7818516e423bdaebb97c723f86a7c6b0a83d3f3b0970328d66f4d9104dc032"}, + {file = "threadpoolctl-3.2.0.tar.gz", hash = "sha256:c96a0ba3bdddeaca37dc4cc7344aafad41cdb8c313f74fdfe387a867bba93355"}, +] + [[package]] name = "toml" version = "0.10.2" @@ -7074,50 +7882,93 @@ files = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] +[[package]] +name = "tomlkit" +version = "0.12.3" +description = "Style preserving TOML library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.12.3-py3-none-any.whl", hash = "sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba"}, + {file = "tomlkit-0.12.3.tar.gz", hash = "sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4"}, +] + [[package]] name = "tornado" -version = "6.3" +version = "6.3.3" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">= 3.8" files = [ - {file = "tornado-6.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:6cfff1e9c15c79e106b8352269d201f8fc0815914a6260f3893ca18b724ea94b"}, - {file = "tornado-6.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6164571f5b9f73143d1334df4584cb9ac86d20c461e17b6c189a19ead8bb93c1"}, - {file = "tornado-6.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4546003dc8b5733489139d3bff5fa6a0211be505faf819bd9970e7c2b32e8122"}, - {file = "tornado-6.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c659ab04d5aa477dbe44152c67d93f3ad3243b992d94f795ca1d5c73c37337ce"}, - {file = "tornado-6.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:912df5712024564e362ecce43c8d5862e14c78c8dd3846c9d889d44fbd7f4951"}, - {file = "tornado-6.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:c37b6a384d54ce6a31168d40ab21ad2591ddaf34973075cc0cad154402ecd9e8"}, - {file = "tornado-6.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:c9114a61a4588c09065b9996ae05462350d17160b92b9bf9a1e93689cc0424dc"}, - {file = "tornado-6.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:4d349846931557b7ec92f224b5d598b160e2ba26ae1812480b42e9622c884bf7"}, - {file = "tornado-6.3-cp38-abi3-win32.whl", hash = "sha256:d7b737e18f701de3e4a3b0824260b4d740e4d60607b8089bb80e80ffd464780e"}, - {file = "tornado-6.3-cp38-abi3-win_amd64.whl", hash = "sha256:720f53e6367b38190ae7fa398c25c086c69d88b3c6535bd6021a126b727fb5cd"}, - {file = "tornado-6.3.tar.gz", hash = "sha256:d68f3192936ff2c4add04dc21a436a43b4408d466746b78bb2b9d0a53a18683f"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, + {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, + {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, + {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, ] [[package]] name = "traitlets" -version = "5.9.0" +version = "5.13.0" description = "Traitlets Python configuration system" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, - {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, + {file = "traitlets-5.13.0-py3-none-any.whl", hash = "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619"}, + {file = "traitlets-5.13.0.tar.gz", hash = "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.6.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "typer" +version = "0.9.0" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +optional = false +python-versions = ">=3.6" +files = [ + {file = "typer-0.9.0-py3-none-any.whl", hash = "sha256:5d96d986a21493606a358cae4461bd8cdf83cbf33a5aa950ae629ca3b51467ee"}, + {file = "typer-0.9.0.tar.gz", hash = "sha256:50922fd79aea2f4751a8e0408ff10d2662bd0c8bbfa84755a699f3bada2978b2"}, +] + +[package.dependencies] +click = ">=7.1.1,<9.0.0" +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] +dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] +doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] +test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] [[package]] name = "typing-extensions" -version = "4.5.0" -description = "Backported and Experimental Type Hints for Python 3.7+" +version = "4.9.0" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" 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"}, + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, +] + +[[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]] @@ -7144,6 +7995,24 @@ files = [ {file = "unicodecsv-0.14.1.tar.gz", hash = "sha256:018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc"}, ] +[[package]] +name = "universal-pathlib" +version = "0.1.4" +description = "pathlib api extended to use fsspec backends" +optional = false +python-versions = ">=3.8" +files = [ + {file = "universal_pathlib-0.1.4-py3-none-any.whl", hash = "sha256:f99186cf950bde1262de9a590bb019613ef84f9fabd9f276e8b019722201943a"}, + {file = "universal_pathlib-0.1.4.tar.gz", hash = "sha256:82e5d86d16a27e0ea1adc7d88acbcba9d02d5a45488163174f96d9ac289db2e4"}, +] + +[package.dependencies] +fsspec = ">=2022.1.0" + +[package.extras] +dev = ["adlfs", "aiohttp", "cheroot", "gcsfs", "hadoop-test-cluster", "moto[s3,server]", "mypy (==1.3.0)", "packaging", "pyarrow", "pydantic", "pydantic-settings", "pylint (==2.17.4)", "pytest (==7.3.2)", "pytest-cov (==4.1.0)", "pytest-mock (==3.11.1)", "pytest-sugar (==0.9.6)", "requests", "s3fs", "webdav4[fsspec]", "wsgidav"] +tests = ["mypy (==1.3.0)", "packaging", "pylint (==2.17.4)", "pytest (==7.3.2)", "pytest-cov (==4.1.0)", "pytest-mock (==3.11.1)", "pytest-sugar (==0.9.6)"] + [[package]] name = "uritemplate" version = "4.1.1" @@ -7157,83 +8026,121 @@ files = [ [[package]] name = "urllib3" -version = "1.26.15" +version = "2.0.7" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7" files = [ - {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, - {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, + {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, + {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvloop" -version = "0.17.0" +version = "0.19.0" description = "Fast implementation of asyncio event loop on top of libuv" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8.0" files = [ - {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718"}, - {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:68532f4349fd3900b839f588972b3392ee56042e440dd5873dfbbcd2cc67617c"}, - {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0949caf774b9fcefc7c5756bacbbbd3fc4c05a6b7eebc7c7ad6f825b23998d6d"}, - {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff3d00b70ce95adce264462c930fbaecb29718ba6563db354608f37e49e09024"}, - {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a5abddb3558d3f0a78949c750644a67be31e47936042d4f6c888dd6f3c95f4aa"}, - {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8efcadc5a0003d3a6e887ccc1fb44dec25594f117a94e3127954c05cf144d811"}, - {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3378eb62c63bf336ae2070599e49089005771cc651c8769aaad72d1bd9385a7c"}, - {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6aafa5a78b9e62493539456f8b646f85abc7093dd997f4976bb105537cf2635e"}, - {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c686a47d57ca910a2572fddfe9912819880b8765e2f01dc0dd12a9bf8573e539"}, - {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:864e1197139d651a76c81757db5eb199db8866e13acb0dfe96e6fc5d1cf45fc4"}, - {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2a6149e1defac0faf505406259561bc14b034cdf1d4711a3ddcdfbaa8d825a05"}, - {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6708f30db9117f115eadc4f125c2a10c1a50d711461699a0cbfaa45b9a78e376"}, - {file = "uvloop-0.17.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:23609ca361a7fc587031429fa25ad2ed7242941adec948f9d10c045bfecab06b"}, - {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2deae0b0fb00a6af41fe60a675cec079615b01d68beb4cc7b722424406b126a8"}, - {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45cea33b208971e87a31c17622e4b440cac231766ec11e5d22c76fab3bf9df62"}, - {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9b09e0f0ac29eee0451d71798878eae5a4e6a91aa275e114037b27f7db72702d"}, - {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dbbaf9da2ee98ee2531e0c780455f2841e4675ff580ecf93fe5c48fe733b5667"}, - {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a4aee22ece20958888eedbad20e4dbb03c37533e010fb824161b4f05e641f738"}, - {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307958f9fc5c8bb01fad752d1345168c0abc5d62c1b72a4a8c6c06f042b45b20"}, - {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ebeeec6a6641d0adb2ea71dcfb76017602ee2bfd8213e3fcc18d8f699c5104f"}, - {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1436c8673c1563422213ac6907789ecb2b070f5939b9cbff9ef7113f2b531595"}, - {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8887d675a64cfc59f4ecd34382e5b4f0ef4ae1da37ed665adba0c2badf0d6578"}, - {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3db8de10ed684995a7f34a001f15b374c230f7655ae840964d51496e2f8a8474"}, - {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d37dccc7ae63e61f7b96ee2e19c40f153ba6ce730d8ba4d3b4e9738c1dccc1b"}, - {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cbbe908fda687e39afd6ea2a2f14c2c3e43f2ca88e3a11964b297822358d0e6c"}, - {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d97672dc709fa4447ab83276f344a165075fd9f366a97b712bdd3fee05efae8"}, - {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e507c9ee39c61bfddd79714e4f85900656db1aec4d40c6de55648e85c2799c"}, - {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c092a2c1e736086d59ac8e41f9c98f26bbf9b9222a76f21af9dfe949b99b2eb9"}, - {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:30babd84706115626ea78ea5dbc7dd8d0d01a2e9f9b306d24ca4ed5796c66ded"}, - {file = "uvloop-0.17.0.tar.gz", hash = "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1"}, -] - -[package.extras] -dev = ["Cython (>=0.29.32,<0.30.0)", "Sphinx (>=4.1.2,<4.2.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)", "pytest (>=3.6.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e"}, + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5"}, + {file = "uvloop-0.19.0.tar.gz", hash = "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd"}, +] + +[package.extras] docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] -test = ["Cython (>=0.29.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)"] +test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] [[package]] name = "virtualenv" -version = "20.21.0" +version = "20.24.6" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.21.0-py3-none-any.whl", hash = "sha256:31712f8f2a17bd06234fa97fdf19609e789dd4e3e4bf108c3da71d710651adbc"}, - {file = "virtualenv-20.21.0.tar.gz", hash = "sha256:f50e3e60f990a0757c9b68333c9fdaa72d7188caa417f96af9e52407831a3b68"}, + {file = "virtualenv-20.24.6-py3-none-any.whl", hash = "sha256:520d056652454c5098a00c0f073611ccbea4c79089331f60bf9d7ba247bb7381"}, + {file = "virtualenv-20.24.6.tar.gz", hash = "sha256:02ece4f56fbf939dbbc33c0715159951d6bf14aaf5457b092e4548e1382455af"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<4" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + +[[package]] +name = "wandb" +version = "0.16.1" +description = "A CLI and library for interacting with the Weights & Biases API." +optional = false +python-versions = ">=3.7" +files = [ + {file = "wandb-0.16.1-py3-none-any.whl", hash = "sha256:1d7423f92520984585bae9693bb637ae08d3e0c1d75ad4b34215bc44431f114c"}, + {file = "wandb-0.16.1.tar.gz", hash = "sha256:ffe6e8dd8cc8fcd72010c1246fb3d6d226b37c4f111f3f94308a1c0ae28a2fec"}, ] [package.dependencies] -distlib = ">=0.3.6,<1" -filelock = ">=3.4.1,<4" -platformdirs = ">=2.4,<4" +appdirs = ">=1.4.3" +Click = ">=7.1,<8.0.0 || >8.0.0" +docker-pycreds = ">=0.4.0" +GitPython = ">=1.0.0,<3.1.29 || >3.1.29" +protobuf = {version = ">=3.19.0,<4.21.0 || >4.21.0,<5", markers = "python_version > \"3.9\" or sys_platform != \"linux\""} +psutil = ">=5.0.0" +PyYAML = "*" +requests = ">=2.0.0,<3" +sentry-sdk = ">=1.0.0" +setproctitle = "*" +setuptools = "*" [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)"] +async = ["httpx (>=0.23.0)"] +aws = ["boto3"] +azure = ["azure-identity", "azure-storage-blob"] +core = ["wandb-core (>=0.17.0b2)"] +gcp = ["google-cloud-storage"] +kubeflow = ["google-cloud-storage", "kubernetes", "minio", "sh"] +launch = ["PyYAML (>=6.0.0)", "awscli", "azure-containerregistry", "azure-identity", "azure-storage-blob", "boto3", "botocore", "chardet", "google-auth", "google-cloud-aiplatform", "google-cloud-artifact-registry", "google-cloud-compute", "google-cloud-storage", "iso8601", "kubernetes", "kubernetes-asyncio", "nbconvert", "nbformat", "optuna", "typing-extensions"] +media = ["bokeh", "moviepy", "numpy", "pillow", "plotly", "rdkit-pypi", "soundfile"] +models = ["cloudpickle"] +perf = ["orjson"] +sweeps = ["sweeps (>=0.2.0)"] [[package]] name = "watchdog" @@ -7276,13 +8183,13 @@ watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "wcmatch" -version = "8.4.1" +version = "8.5" description = "Wildcard/glob file name matcher." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "wcmatch-8.4.1-py3-none-any.whl", hash = "sha256:3476cd107aba7b25ba1d59406938a47dc7eec6cfd0ad09ff77193f21a964dee7"}, - {file = "wcmatch-8.4.1.tar.gz", hash = "sha256:b1f042a899ea4c458b7321da1b5e3331e3e0ec781583434de1301946ceadb943"}, + {file = "wcmatch-8.5-py3-none-any.whl", hash = "sha256:14554e409b142edeefab901dc68ad570b30a72a8ab9a79106c5d5e9a6d241bd5"}, + {file = "wcmatch-8.5.tar.gz", hash = "sha256:86c17572d0f75cbf3bcb1a18f3bf2f9e72b39a9c08c9b4a74e991e1882a8efb3"}, ] [package.dependencies] @@ -7290,13 +8197,13 @@ bracex = ">=2.1.1" [[package]] name = "wcwidth" -version = "0.2.6" +version = "0.2.9" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, - {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, + {file = "wcwidth-0.2.9-py2.py3-none-any.whl", hash = "sha256:9a929bd8380f6cd9571a968a9c8f4353ca58d7cd812a4822bba831f8d685b223"}, + {file = "wcwidth-0.2.9.tar.gz", hash = "sha256:a675d1a4a2d24ef67096a04b85b02deeecd8e226f57b5e3a72dbb9ed99d27da8"}, ] [[package]] @@ -7417,94 +8324,165 @@ MarkupSafe = "*" [package.extras] email = ["email-validator"] +[[package]] +name = "xgboost" +version = "1.7.6" +description = "XGBoost Python Package" +optional = false +python-versions = ">=3.8" +files = [ + {file = "xgboost-1.7.6-py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.macosx_12_0_x86_64.whl", hash = "sha256:4c34675b4d2678c624ddde5d45361e7e16046923e362e4e609b88353e6b87124"}, + {file = "xgboost-1.7.6-py3-none-macosx_12_0_arm64.whl", hash = "sha256:59b4b366d2cafc7f645e87d897983a5b59be02876194b1d213bd8d8b811d8ce8"}, + {file = "xgboost-1.7.6-py3-none-manylinux2014_aarch64.whl", hash = "sha256:281c3c6f4fbed2d36bf95cd02a641afa95e72e9abde70064056da5e76233e8df"}, + {file = "xgboost-1.7.6-py3-none-manylinux2014_x86_64.whl", hash = "sha256:b1d5db49b199152d62bd9217c98760207d3de86d2b9d243260c573ffe638f80a"}, + {file = "xgboost-1.7.6-py3-none-win_amd64.whl", hash = "sha256:127cf1f5e2ec25cd41429394c6719b87af1456ce583e89f0bffd35d02ad18bcb"}, + {file = "xgboost-1.7.6.tar.gz", hash = "sha256:1c527554a400445e0c38186039ba1a00425dcdb4e40b37eed0e74cb39a159c47"}, +] + +[package.dependencies] +numpy = "*" +scipy = "*" + +[package.extras] +dask = ["dask", "distributed", "pandas"] +datatable = ["datatable"] +pandas = ["pandas"] +plotting = ["graphviz", "matplotlib"] +pyspark = ["cloudpickle", "pyspark", "scikit-learn"] +scikit-learn = ["scikit-learn"] + +[[package]] +name = "xyzservices" +version = "2023.10.1" +description = "Source of XYZ tiles providers" +optional = false +python-versions = ">=3.8" +files = [ + {file = "xyzservices-2023.10.1-py3-none-any.whl", hash = "sha256:6a4c38d3a9f89d3e77153eff9414b36a8ee0850c9e8b85796fd1b2a85b8dfd68"}, + {file = "xyzservices-2023.10.1.tar.gz", hash = "sha256:091229269043bc8258042edbedad4fcb44684b0473ede027b5672ad40dc9fa02"}, +] + +[[package]] +name = "yamllint" +version = "1.33.0" +description = "A linter for YAML files." +optional = false +python-versions = ">=3.8" +files = [ + {file = "yamllint-1.33.0-py3-none-any.whl", hash = "sha256:28a19f5d68d28d8fec538a1db21bb2d84c7dc2e2ea36266da8d4d1c5a683814d"}, + {file = "yamllint-1.33.0.tar.gz", hash = "sha256:2dceab9ef2d99518a2fcf4ffc964d44250ac4459be1ba3ca315118e4a1a81f7d"}, +] + +[package.dependencies] +pathspec = ">=0.5.3" +pyyaml = "*" + +[package.extras] +dev = ["doc8", "flake8", "flake8-import-order", "rstcheck[sphinx]", "sphinx"] + [[package]] name = "yarl" -version = "1.8.2" +version = "1.9.2" description = "Yet another URL library" optional = false python-versions = ">=3.7" files = [ - {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bb81f753c815f6b8e2ddd2eef3c855cf7da193b82396ac013c661aaa6cc6b0a5"}, - {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:47d49ac96156f0928f002e2424299b2c91d9db73e08c4cd6742923a086f1c863"}, - {file = "yarl-1.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3fc056e35fa6fba63248d93ff6e672c096f95f7836938241ebc8260e062832fe"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a3c13d1c3005dbbac5c9f0d3210b60220a65a999b1833aa46bd6677c69b08e"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10b08293cda921157f1e7c2790999d903b3fd28cd5c208cf8826b3b508026996"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de986979bbd87272fe557e0a8fcb66fd40ae2ddfe28a8b1ce4eae22681728fef"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c4fcfa71e2c6a3cb568cf81aadc12768b9995323186a10827beccf5fa23d4f8"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae4d7ff1049f36accde9e1ef7301912a751e5bae0a9d142459646114c70ecba6"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bf071f797aec5b96abfc735ab97da9fd8f8768b43ce2abd85356a3127909d146"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:74dece2bfc60f0f70907c34b857ee98f2c6dd0f75185db133770cd67300d505f"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:df60a94d332158b444301c7f569659c926168e4d4aad2cfbf4bce0e8fb8be826"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:63243b21c6e28ec2375f932a10ce7eda65139b5b854c0f6b82ed945ba526bff3"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cfa2bbca929aa742b5084fd4663dd4b87c191c844326fcb21c3afd2d11497f80"}, - {file = "yarl-1.8.2-cp310-cp310-win32.whl", hash = "sha256:b05df9ea7496df11b710081bd90ecc3a3db6adb4fee36f6a411e7bc91a18aa42"}, - {file = "yarl-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:24ad1d10c9db1953291f56b5fe76203977f1ed05f82d09ec97acb623a7976574"}, - {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a1fca9588f360036242f379bfea2b8b44cae2721859b1c56d033adfd5893634"}, - {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f37db05c6051eff17bc832914fe46869f8849de5b92dc4a3466cd63095d23dfd"}, - {file = "yarl-1.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77e913b846a6b9c5f767b14dc1e759e5aff05502fe73079f6f4176359d832581"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0978f29222e649c351b173da2b9b4665ad1feb8d1daa9d971eb90df08702668a"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388a45dc77198b2460eac0aca1efd6a7c09e976ee768b0d5109173e521a19daf"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2305517e332a862ef75be8fad3606ea10108662bc6fe08509d5ca99503ac2aee"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42430ff511571940d51e75cf42f1e4dbdded477e71c1b7a17f4da76c1da8ea76"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3150078118f62371375e1e69b13b48288e44f6691c1069340081c3fd12c94d5b"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c15163b6125db87c8f53c98baa5e785782078fbd2dbeaa04c6141935eb6dab7a"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4d04acba75c72e6eb90745447d69f84e6c9056390f7a9724605ca9c56b4afcc6"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e7fd20d6576c10306dea2d6a5765f46f0ac5d6f53436217913e952d19237efc4"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75c16b2a900b3536dfc7014905a128a2bea8fb01f9ee26d2d7d8db0a08e7cb2c"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6d88056a04860a98341a0cf53e950e3ac9f4e51d1b6f61a53b0609df342cc8b2"}, - {file = "yarl-1.8.2-cp311-cp311-win32.whl", hash = "sha256:fb742dcdd5eec9f26b61224c23baea46c9055cf16f62475e11b9b15dfd5c117b"}, - {file = "yarl-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8c46d3d89902c393a1d1e243ac847e0442d0196bbd81aecc94fcebbc2fd5857c"}, - {file = "yarl-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ceff9722e0df2e0a9e8a79c610842004fa54e5b309fe6d218e47cd52f791d7ef"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f6b4aca43b602ba0f1459de647af954769919c4714706be36af670a5f44c9c1"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1684a9bd9077e922300ecd48003ddae7a7474e0412bea38d4631443a91d61077"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ebb78745273e51b9832ef90c0898501006670d6e059f2cdb0e999494eb1450c2"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3adeef150d528ded2a8e734ebf9ae2e658f4c49bf413f5f157a470e17a4a2e89"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57a7c87927a468e5a1dc60c17caf9597161d66457a34273ab1760219953f7f4c"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:efff27bd8cbe1f9bd127e7894942ccc20c857aa8b5a0327874f30201e5ce83d0"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a783cd344113cb88c5ff7ca32f1f16532a6f2142185147822187913eb989f739"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:705227dccbe96ab02c7cb2c43e1228e2826e7ead880bb19ec94ef279e9555b5b"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:34c09b43bd538bf6c4b891ecce94b6fa4f1f10663a8d4ca589a079a5018f6ed7"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a48f4f7fea9a51098b02209d90297ac324241bf37ff6be6d2b0149ab2bd51b37"}, - {file = "yarl-1.8.2-cp37-cp37m-win32.whl", hash = "sha256:0414fd91ce0b763d4eadb4456795b307a71524dbacd015c657bb2a39db2eab89"}, - {file = "yarl-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d881d152ae0007809c2c02e22aa534e702f12071e6b285e90945aa3c376463c5"}, - {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5df5e3d04101c1e5c3b1d69710b0574171cc02fddc4b23d1b2813e75f35a30b1"}, - {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a66c506ec67eb3159eea5096acd05f5e788ceec7b96087d30c7d2865a243918"}, - {file = "yarl-1.8.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2b4fa2606adf392051d990c3b3877d768771adc3faf2e117b9de7eb977741229"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e21fb44e1eff06dd6ef971d4bdc611807d6bd3691223d9c01a18cec3677939e"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93202666046d9edadfe9f2e7bf5e0782ea0d497b6d63da322e541665d65a044e"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc77086ce244453e074e445104f0ecb27530d6fd3a46698e33f6c38951d5a0f1"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dd68a92cab699a233641f5929a40f02a4ede8c009068ca8aa1fe87b8c20ae3"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b372aad2b5f81db66ee7ec085cbad72c4da660d994e8e590c997e9b01e44901"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e6f3515aafe0209dd17fb9bdd3b4e892963370b3de781f53e1746a521fb39fc0"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dfef7350ee369197106805e193d420b75467b6cceac646ea5ed3049fcc950a05"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:728be34f70a190566d20aa13dc1f01dc44b6aa74580e10a3fb159691bc76909d"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ff205b58dc2929191f68162633d5e10e8044398d7a45265f90a0f1d51f85f72c"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf211dcad448a87a0d9047dc8282d7de59473ade7d7fdf22150b1d23859f946"}, - {file = "yarl-1.8.2-cp38-cp38-win32.whl", hash = "sha256:272b4f1599f1b621bf2aabe4e5b54f39a933971f4e7c9aa311d6d7dc06965165"}, - {file = "yarl-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:326dd1d3caf910cd26a26ccbfb84c03b608ba32499b5d6eeb09252c920bcbe4f"}, - {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f8ca8ad414c85bbc50f49c0a106f951613dfa5f948ab69c10ce9b128d368baf8"}, - {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:418857f837347e8aaef682679f41e36c24250097f9e2f315d39bae3a99a34cbf"}, - {file = "yarl-1.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae0eec05ab49e91a78700761777f284c2df119376e391db42c38ab46fd662b77"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:009a028127e0a1755c38b03244c0bea9d5565630db9c4cf9572496e947137a87"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3edac5d74bb3209c418805bda77f973117836e1de7c000e9755e572c1f7850d0"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da65c3f263729e47351261351b8679c6429151ef9649bba08ef2528ff2c423b2"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef8fb25e52663a1c85d608f6dd72e19bd390e2ecaf29c17fb08f730226e3a08"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcd7bb1e5c45274af9a1dd7494d3c52b2be5e6bd8d7e49c612705fd45420b12d"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44ceac0450e648de86da8e42674f9b7077d763ea80c8ceb9d1c3e41f0f0a9951"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:97209cc91189b48e7cfe777237c04af8e7cc51eb369004e061809bcdf4e55220"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:48dd18adcf98ea9cd721a25313aef49d70d413a999d7d89df44f469edfb38a06"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e59399dda559688461762800d7fb34d9e8a6a7444fd76ec33220a926c8be1516"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d617c241c8c3ad5c4e78a08429fa49e4b04bedfc507b34b4d8dceb83b4af3588"}, - {file = "yarl-1.8.2-cp39-cp39-win32.whl", hash = "sha256:cb6d48d80a41f68de41212f3dfd1a9d9898d7841c8f7ce6696cf2fd9cb57ef83"}, - {file = "yarl-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:6604711362f2dbf7160df21c416f81fac0de6dbcf0b5445a2ef25478ecc4c778"}, - {file = "yarl-1.8.2.tar.gz", hash = "sha256:49d43402c6e3013ad0978602bf6bf5328535c48d192304b91b97a3c6790b1562"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, ] [package.dependencies] idna = ">=2.0" multidict = ">=4.0" +[[package]] +name = "zipp" +version = "3.17.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + [metadata] lock-version = "2.0" python-versions = "3.10.8" -content-hash = "0bcb4eea7c9025afe7e9b09880fe444f200641151dd90333006d43430aaf7954" +content-hash = "e445af79a0eb25f73de6c46dbf4ab39af61a1ebed2cc2fb40a90168cee1c525c" diff --git a/pyproject.toml b/pyproject.toml index 9112e97c0..d6152994d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,81 +1,121 @@ [tool.poetry] name = "otgenetics" -version = "1.0.0" +# !! version is managed by semantic_release +version = "0.0.0" description = "Open targets Genetics Portal Python ETL" authors = ["Open Targets core team"] -license = "Apache License v2" -packages = [ - { include = "otg", from = "src"}, -] +license = "Apache-2.0" +readme = "README.md" +documentation = "https://opentargets.github.io/genetics_etl_python/" +repository = "https://github.com/opentargets/genetics_etl_python" +packages = [{ include = "otg", from = "src" }] + +[tool.poetry.urls] +"Bug Tracker" = "http://github.com/opentargets/issues" +"Funding" = "https://www.opentargets.org" [tool.poetry.scripts] otg = "otg.cli:main" [tool.poetry.dependencies] python = "3.10.8" -pyspark = "3.3.0" -scipy = "^1.6.1" -hydra-core = "^1.2.0" +pyspark = "3.3.4" +scipy = "^1.11.4" +hydra-core = "^1.3.2" pyliftover = "^0.4" -numpy = "^1.23.2" -hail = "^0.2.98" +xgboost = "^1.7.3" +numpy = "^1.26.2" +hail = "0.2.126" +wandb = "^0.16.1" +google = "^3.0.0" +omegaconf = "^2.3.0" +typing-extensions = "^4.9.0" +scikit-learn = "^1.3.2" [tool.poetry.dev-dependencies] -pre-commit = "^2.15.0" -black = {version = "^22.6.0", allow-prereleases = true} -mypy = "^0.971" +pre-commit = "^3.6.0" +mypy = "^1.8" pep8-naming = "^0.13.2" interrogate = "^1.5.0" -isort = "^5.10.1" +isort = "^5.13.2" darglint = "^1.8.1" -ruff = "^0.0.287" +ruff = "^0.1.8" [tool.poetry.group.docs.dependencies] -mkdocs = "^1.4.0" -mkdocstrings-python = "^0.7.1" +mkdocs = "^1.5.3" +mkdocstrings-python = "^1.7.5" mkdocs-material = "*" mkdocs-section-index = "^0.3.4" -mkdocs-git-revision-date-localized-plugin = "^1.1.0" -mkdocs-autolinks-plugin = "^0.6.0" -mkdocs-minify-plugin = "^0.5.0" -mkdocs-awesome-pages-plugin = "^2.8.0" +mkdocs-git-revision-date-localized-plugin = "^1.2.2" +mkdocs-autolinks-plugin = "^0.7.1" +mkdocs-awesome-pages-plugin = "^2.9.2" mkdocs-exclude = "^1.0.2" -mkdocs-git-committers-plugin-2 = "^1.1.1" -lxml = "^4.9.2" +mkdocs-git-committers-plugin-2 = "^2.2.2" +lxml = "^4.9.3" +pymdown-extensions = "^10.5" [tool.poetry.group.tests.dependencies] -pytest-cov = "^4.0.0" +pytest-cov = "^4.1.0" pytest-sugar = "^0.9.5" dbldatagen = "^0.3.1" -pyparsing = "^3.0.9" -pytest = "^7.2.2" -pytest-xdist = "^3.3.1" +pyparsing = "^3.1.1" +pytest = "^7.4.2" +pytest-xdist = "^3.5.0" [tool.poetry.group.dev.dependencies] -ipython = "^8.5.0" -ipykernel = "^6.19.0" -google-cloud-dataproc = "^5.4.1" -apache-airflow = "^2.7.0" -apache-airflow-providers-google = "^10.6.0" +ipython = "^8.19.0" +ipykernel = "^6.27.1" +google-cloud-dataproc = "^5.8.0" +apache-airflow = "^2.8.0" +apache-airflow-providers-google = "^10.12.0" +pydoclint = "^0.3.8" +prettier = "^0.0.7" +deptry = "^0.12.0" +python-semantic-release = "^8.7.0" +yamllint = "^1.33.0" [tool.semantic_release] -branch = "main" -version_variable = "src/otg/__init__.py:__version__" +logging_use_named_masks = true +build_command = "poetry build" +assets = [] +version_variable = ["src/otg/__init__.py:__version__"] version_toml = ["pyproject.toml:tool.poetry.version"] -version_source = "tag" -commit_version_number = true # required for version_source = "tag" -tag_commit = true upload_to_pypi = false -upload_to_release = false +upload_to_release = true + +[tool.semantic_release.branches.main] +match = "(main|master)" +prerelease = false + +[tool.semantic_release.branches."release"] +match = "release/*" +prerelease = true +prerelease_token = "rc" + +[tool.semantic_release.publish] +dist_glob_patterns = ["dist/*"] +upload_to_vcs_release = true + +[tool.semantic_release.changelog] +changelog_file = "CHANGELOG.md" +exclude_commit_patterns = ["chore\\(release\\):"] + +[tool.semantic_release.branches."step"] +match = "(build|chore|ci|docs|feat|fix|perf|style|refactor|test)" +prerelease = true +prerelease_token = "alpha" [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" -[tool.isort] -profile = "black" +[tool.deptry] +extend_exclude = ["src/conftest.py", "src/airflow", "src/utils"] + +[tool.deptry.per_rule_ignores] +DEP001 = ["otg"] [tool.interrogate] fail-under = 95 @@ -84,22 +124,126 @@ exclude = ["dist"] [tool.pytest.ini_options] addopts = "-n auto --doctest-modules --cov=src/ --cov-report=xml" +pythonpath = [".", "./src/airflow/dags"] -[[tool.mypy.overrides]] -module = "google.protobuf.duration_pb2" -ignore_missing_imports = true +# Semi-strict mode for mypy +[tool.mypy] +check_untyped_defs = true +disallow_any_generics = true +disallow_incomplete_defs = true +no_implicit_optional = true +no_implicit_reexport = true +strict_equality = true +warn_redundant_casts = true +warn_unused_ignores = true +disallow_untyped_defs = true [[tool.mypy.overrides]] -module = "yaml" +module = [ + "google.cloud", + "yaml", + "hail", + "pyliftover", + "dbldatagen", + "scipy", + "scipy.stats", + "chardet", + "omegaconf", + "xgboost", + "sklearn", +] ignore_missing_imports = true + [tool.ruff] -select = ["D", "E", "F", "B"] -ignore = ["D417", "E501", "E203"] -fixable = ["F401"] -unfixable = ["B"] -line-length = 88 -target-version = "py310" +select = [ + "B002", # Python does not support the unary prefix increment + "B007", # Loop control variable {name} not used within loop body + "B014", # Exception handler with duplicate exception + "B023", # Function definition does not bind loop variable {name} + "B026", # Star-arg unpacking after a keyword argument is strongly discouraged + "C", # complexity + "COM818", # Trailing comma on bare tuple prohibited + "D", # docstrings + "DTZ003", # Use datetime.now(tz=) instead of datetime.utcnow() + "DTZ004", # Use datetime.fromtimestamp(ts, tz=) instead of datetime.utcfromtimestamp(ts) + "E", # pycodestyle + "F", # pyflakes/autoflake + "G", # flake8-logging-format + "I", # isort + "ICN001", # import concentions; {name} should be imported as {asname} + "ISC001", # Implicitly concatenated string literals on one line + "N804", # First argument of a class method should be named cls + "N805", # First argument of a method should be named self + "N815", # Variable {name} in class scope should not be mixedCase + "PGH001", # No builtin eval() allowed + "PGH004", # Use specific rule codes when using noqa + "PLC0414", # Useless import alias. Import alias does not rename original package. + "PLC", # pylint + "PLE", # pylint + "PLR", # pylint + "PLW", # pylint + "Q000", # Double quotes found but single quotes preferred + "RUF006", # Store a reference to the return value of asyncio.create_task + "S102", # Use of exec detected + "S103", # bad-file-permissions + "S108", # hardcoded-temp-file + "S306", # suspicious-mktemp-usage + "S307", # suspicious-eval-usage + "S313", # suspicious-xmlc-element-tree-usage + "S314", # suspicious-xml-element-tree-usage + "S315", # suspicious-xml-expat-reader-usage + "S316", # suspicious-xml-expat-builder-usage + "S317", # suspicious-xml-sax-usage + "S318", # suspicious-xml-mini-dom-usage + "S319", # suspicious-xml-pull-dom-usage + "S320", # suspicious-xmle-tree-usage + "S601", # paramiko-call + "S602", # subprocess-popen-with-shell-equals-true + "S604", # call-with-shell-equals-true + "S608", # hardcoded-sql-expression + "S609", # unix-command-wildcard-injection + "SIM105", # Use contextlib.suppress({exception}) instead of try-except-pass + "SIM117", # Merge with-statements that use the same scope + "SIM118", # Use {key} in {dict} instead of {key} in {dict}.keys() + "SIM201", # Use {left} != {right} instead of not {left} == {right} + "SIM208", # Use {expr} instead of not (not {expr}) + "SIM212", # Use {a} if {a} else {b} instead of {b} if not {a} else {a} + "SIM300", # Yoda conditions. Use 'age == 42' instead of '42 == age'. + "SIM401", # Use get from dict with default instead of an if block + "T100", # Trace found: {name} used + "T20", # flake8-print + "TID251", # Banned imports + "TRY004", # Prefer TypeError exception for invalid type + "TRY200", # Use raise from to specify exception cause + "TRY302", # Remove exception handler; error is immediately re-raised + "UP", # pyupgrade + "W", # pycodestyle +] + +ignore = [ + "E501", # line too long + "E731", # do not assign a lambda expression, use a def + + # Ignore ignored, as the rule is now back in preview/nursery, which cannot + # be ignored anymore without warnings. + # https://github.com/astral-sh/ruff/issues/7491 + # "PLC1901", # Lots of false positives + + # False positives https://github.com/astral-sh/ruff/issues/5386 + "PLC0208", # Use a sequence type instead of a `set` when iterating over values + "PLR0911", # Too many return statements ({returns} > {max_returns}) + "PLR0912", # Too many branches ({branches} > {max_branches}) + "PLR0913", # Too many arguments to function call ({c_args} > {max_args}) + "PLR0915", # Too many statements ({statements} > {max_statements}) + "PLR2004", # Magic value used in comparison, consider replacing {value} with a constant variable + "PLW2901", # Outer {outer_kind} variable {name} overwritten by inner {inner_kind} target + "UP006", # keep type annotation style as is + "UP007", # keep type annotation style as is + # Ignored due to performance: https://github.com/charliermarsh/ruff/issues/2923 + "UP038", # Use `X | Y` in `isinstance` call instead of `(X, Y)` + +] [tool.ruff.per-file-ignores] "__init__.py" = ["E402"] @@ -111,3 +255,12 @@ docstring-quotes = "double" [tool.ruff.pydocstyle] convention = "google" + +[tool.pydoclint] +style = 'google' +exclude = '\.git|\.venv|__init__.py|tests' +require-return-section-when-returning-nothing = false +check-return-types = true +allow-init-docstring = true +arg-type-hints-in-docstring = true +skip-checking-short-docstrings = false diff --git a/src/__init__.py b/src/__init__.py deleted file mode 100644 index 3c5db3e2d..000000000 --- a/src/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Main folder for run scripts. - -Collection of elements of the OpenTargets Genetics data release pipeline -""" -from __future__ import annotations diff --git a/src/airflow/.env b/src/airflow/.env index 2b6ade116..2bcd8244f 100644 --- a/src/airflow/.env +++ b/src/airflow/.env @@ -1,2 +1,6 @@ -AIRFLOW_UID=1126896676 AIRFLOW_IMAGE_NAME=extending_airflow:latest +GOOGLE_LOCAL_CREDENTIALS_PATH=~/.config/gcloud +GOOGLE_DOCKER_CREDENTIALS_PATH=/.config/gcloud +GOOGLE_APPLICATION_CREDENTIALS=/.config/gcloud/service_account_credentials.json +AIRFLOW_CONN_GOOGLE_CLOUD_DEFAULT='google-cloud-platform://?extra__google_cloud_platform__key_path=/.config/gcloud/service_account_credentials.json' +GCP_PROJECT_ID=open-targets-genetics-dev diff --git a/src/airflow/Dockerfile b/src/airflow/Dockerfile index 2962e4a98..9ca7c9193 100644 --- a/src/airflow/Dockerfile +++ b/src/airflow/Dockerfile @@ -1,16 +1,17 @@ -FROM apache/airflow:2.7.1-python3.8 +FROM apache/airflow:slim-2.7.3-python3.10 +# Install additional Python requirements. +# --no-cache-dir is a good practice when installing packages using pip, because it helps to keep the image lightweight. COPY requirements.txt /requirements.txt -RUN pip install --user --upgrade pip -RUN pip install --no-cache-dir --user -r /requirements.txt # --no-cache-dir good practise when installing packages using pip. It helps to keep the image lightweight - +RUN pip install --quiet --user --no-cache-dir --upgrade pip setuptools && \ + pip install --quiet --user --no-cache-dir -r /requirements.txt # Source: https://airflow.apache.org/docs/docker-stack/recipes.html # Installing the GCP CLI in the container SHELL ["/bin/bash", "-o", "pipefail", "-e", "-u", "-x", "-c"] USER 0 -ARG CLOUD_SDK_VERSION=322.0.0 +ARG CLOUD_SDK_VERSION=452.0.0 ENV GCLOUD_HOME=/home/google-cloud-sdk ENV PATH="${GCLOUD_HOME}/bin/:${PATH}" @@ -27,3 +28,6 @@ RUN DOWNLOAD_URL="https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/goo --quiet \ && rm -rf "${TMP_DIR}" \ && gcloud --version + +# Switch back to a non-root user for security purposes +USER airflow diff --git a/src/airflow/config/.gitkeep b/src/airflow/config/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/airflow/dags/.gitkeep b/src/airflow/dags/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/airflow/dags/common_airflow.py b/src/airflow/dags/common_airflow.py new file mode 100644 index 000000000..a859a870e --- /dev/null +++ b/src/airflow/dags/common_airflow.py @@ -0,0 +1,354 @@ +"""Airflow boilerplate code which can be shared by several DAGs.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Optional + +import pendulum +import yaml +from airflow.providers.google.cloud.operators.dataproc import ( + ClusterGenerator, + DataprocCreateClusterOperator, + DataprocDeleteClusterOperator, + DataprocSubmitJobOperator, +) +from airflow.utils.trigger_rule import TriggerRule +from google.cloud import dataproc_v1 + +if TYPE_CHECKING: + from pathlib import Path + +# Code version. It has to be repeated here as well as in `pyproject.toml`, because Airflow isn't able to look at files outside of its `dags/` directory. +OTG_VERSION = "1.0.0" + + +# Cloud configuration. +GCP_PROJECT = "open-targets-genetics-dev" +GCP_REGION = "europe-west1" +GCP_ZONE = "europe-west1-d" +GCP_DATAPROC_IMAGE = "2.1" +GCP_AUTOSCALING_POLICY = "otg-etl" + + +# Cluster init configuration. +INITIALISATION_BASE_PATH = ( + f"gs://genetics_etl_python_playground/initialisation/{OTG_VERSION}" +) +CONFIG_TAG = f"{INITIALISATION_BASE_PATH}/config.tar.gz" +PACKAGE_WHEEL = f"{INITIALISATION_BASE_PATH}/otgenetics-{OTG_VERSION}-py3-none-any.whl" +INITIALISATION_EXECUTABLE_FILE = [ + f"{INITIALISATION_BASE_PATH}/install_dependencies_on_cluster.sh" +] + + +# CLI configuration. +CLUSTER_CONFIG_DIR = "/config" +CONFIG_NAME = "config" +PYTHON_CLI = "cli.py" + + +# Shared DAG construction parameters. +shared_dag_args = { + "owner": "Open Targets Data Team", + "retries": 0, +} +shared_dag_kwargs = { + "tags": ["genetics_etl", "experimental"], + "start_date": pendulum.now(tz="Europe/London").subtract(days=1), + "schedule": "@once", + "catchup": False, +} + + +def create_cluster( + cluster_name: str, + master_machine_type: str = "n1-highmem-8", + worker_machine_type: str = "n1-standard-16", + num_workers: int = 2, + num_preemptible_workers: int = 0, + num_local_ssds: int = 1, + autoscaling_policy: str = GCP_AUTOSCALING_POLICY, + master_disk_size: int = 500, +) -> DataprocCreateClusterOperator: + """Generate an Airflow task to create a Dataproc cluster. Common parameters are reused, and varying parameters can be specified as needed. + + Args: + cluster_name (str): Name of the cluster. + master_machine_type (str): Machine type for the master node. Defaults to "n1-highmem-8". + worker_machine_type (str): Machine type for the worker nodes. Defaults to "n1-standard-16". + num_workers (int): Number of worker nodes. Defaults to 2. + num_preemptible_workers (int): Number of preemptible worker nodes. Defaults to 0. + num_local_ssds (int): How many local SSDs to attach to each worker node, both primary and secondary. Defaults to 1. + autoscaling_policy (str): Name of the autoscaling policy to use. Defaults to GCP_AUTOSCALING_POLICY. + master_disk_size (int): Size of the master node's boot disk in GB. Defaults to 500. + + Returns: + DataprocCreateClusterOperator: Airflow task to create a Dataproc cluster. + """ + # Create base cluster configuration. + cluster_config = ClusterGenerator( + project_id=GCP_PROJECT, + zone=GCP_ZONE, + master_machine_type=master_machine_type, + worker_machine_type=worker_machine_type, + master_disk_size=master_disk_size, + worker_disk_size=500, + num_preemptible_workers=num_preemptible_workers, + num_workers=num_workers, + image_version=GCP_DATAPROC_IMAGE, + enable_component_gateway=True, + init_actions_uris=INITIALISATION_EXECUTABLE_FILE, + metadata={ + "CONFIGTAR": CONFIG_TAG, + "PACKAGE": PACKAGE_WHEEL, + }, + idle_delete_ttl=30 * 60, # In seconds. + autoscaling_policy=f"projects/{GCP_PROJECT}/regions/{GCP_REGION}/autoscalingPolicies/{autoscaling_policy}", + ).make() + + # If specified, amend the configuration to include local SSDs for worker nodes. + if num_local_ssds: + for worker_section in ("worker_config", "secondary_worker_config"): + # Create a disk config section if it does not exist. + cluster_config[worker_section].setdefault("disk_config", {}) + # Specify the number of local SSDs. + cluster_config[worker_section]["disk_config"][ + "num_local_ssds" + ] = num_local_ssds + + # Return the cluster creation operator. + return DataprocCreateClusterOperator( + task_id="create_cluster", + project_id=GCP_PROJECT, + cluster_config=cluster_config, + region=GCP_REGION, + cluster_name=cluster_name, + trigger_rule=TriggerRule.ALL_SUCCESS, + ) + + +def submit_job( + cluster_name: str, + task_id: str, + job_type: str, + job_specification: dict[str, Any], + trigger_rule: TriggerRule = TriggerRule.ALL_SUCCESS, +) -> DataprocSubmitJobOperator: + """Submit an arbitrary job to a Dataproc cluster. + + Args: + cluster_name (str): Name of the cluster. + task_id (str): Name of the task. + job_type (str): Type of the job to submit. + job_specification (dict[str, Any]): Specification of the job to submit. + trigger_rule (TriggerRule): Trigger rule for the task. Defaults to TriggerRule.ALL_SUCCESS. + + Returns: + DataprocSubmitJobOperator: Airflow task to submit an arbitrary job to a Dataproc cluster. + """ + return DataprocSubmitJobOperator( + task_id=task_id, + region=GCP_REGION, + project_id=GCP_PROJECT, + job={ + "job_uuid": f"airflow-{task_id}", + "reference": {"project_id": GCP_PROJECT}, + "placement": {"cluster_name": cluster_name}, + job_type: job_specification, + }, + trigger_rule=trigger_rule, + ) + + +def submit_pyspark_job( + cluster_name: str, + task_id: str, + python_module_path: str, + args: list[str], + trigger_rule: TriggerRule = TriggerRule.ALL_SUCCESS, +) -> DataprocSubmitJobOperator: + """Submit a PySpark job to a Dataproc cluster. + + Args: + cluster_name (str): Name of the cluster. + task_id (str): Name of the task. + python_module_path (str): Path to the Python module to run. + args (list[str]): Arguments to pass to the Python module. + trigger_rule (TriggerRule): Trigger rule for the task. Defaults to TriggerRule.ALL_SUCCESS. + + Returns: + DataprocSubmitJobOperator: Airflow task to submit a PySpark job to a Dataproc cluster. + """ + return submit_job( + cluster_name=cluster_name, + task_id=task_id, + job_type="pyspark_job", + trigger_rule=trigger_rule, + job_specification={ + "main_python_file_uri": python_module_path, + "args": args, + "properties": { + "spark.jars": "/opt/conda/miniconda3/lib/python3.10/site-packages/hail/backend/hail-all-spark.jar", + "spark.driver.extraClassPath": "/opt/conda/miniconda3/lib/python3.10/site-packages/hail/backend/hail-all-spark.jar", + "spark.executor.extraClassPath": "./hail-all-spark.jar", + "spark.serializer": "org.apache.spark.serializer.KryoSerializer", + "spark.kryo.registrator": "is.hail.kryo.HailKryoRegistrator", + }, + }, + ) + + +def submit_step( + cluster_name: str, + step_id: str, + task_id: str = "", + trigger_rule: TriggerRule = TriggerRule.ALL_SUCCESS, + other_args: Optional[list[str]] = None, +) -> DataprocSubmitJobOperator: + """Submit a PySpark job to execute a specific CLI step. + + Args: + cluster_name (str): Name of the cluster. + step_id (str): Name of the step in otg. + task_id (str): Name of the task. Defaults to step_id. + trigger_rule (TriggerRule): Trigger rule for the task. Defaults to TriggerRule.ALL_SUCCESS. + other_args (Optional[list[str]]): Other arguments to pass to the CLI step. Defaults to None. + + Returns: + DataprocSubmitJobOperator: Airflow task to submit a PySpark job to execute a specific CLI step. + """ + if task_id == "": + task_id = step_id + return submit_pyspark_job( + cluster_name=cluster_name, + task_id=task_id, + python_module_path=f"{INITIALISATION_BASE_PATH}/{PYTHON_CLI}", + trigger_rule=trigger_rule, + args=[f"step={step_id}"] + + (other_args if other_args is not None else []) + + [ + f"--config-dir={CLUSTER_CONFIG_DIR}", + f"--config-name={CONFIG_NAME}", + ], + ) + + +def install_dependencies(cluster_name: str) -> DataprocSubmitJobOperator: + """Install dependencies on a Dataproc cluster. + + Args: + cluster_name (str): Name of the cluster. + + Returns: + DataprocSubmitJobOperator: Airflow task to install dependencies on a Dataproc cluster. + """ + return submit_job( + cluster_name=cluster_name, + task_id="install_dependencies", + job_type="pig_job", + job_specification={ + "jar_file_uris": [ + f"gs://genetics_etl_python_playground/initialisation/{OTG_VERSION}/install_dependencies_on_cluster.sh" + ], + "query_list": { + "queries": [ + "sh chmod 750 ${PWD}/install_dependencies_on_cluster.sh", + "sh ${PWD}/install_dependencies_on_cluster.sh", + ] + }, + }, + ) + + +def delete_cluster(cluster_name: str) -> DataprocDeleteClusterOperator: + """Generate an Airflow task to delete a Dataproc cluster. + + Args: + cluster_name (str): Name of the cluster. + + Returns: + DataprocDeleteClusterOperator: Airflow task to delete a Dataproc cluster. + """ + return DataprocDeleteClusterOperator( + task_id="delete_cluster", + project_id=GCP_PROJECT, + cluster_name=cluster_name, + region=GCP_REGION, + trigger_rule=TriggerRule.ALL_DONE, + ) + + +def read_yaml_config(config_path: Path) -> Any: + """Parse a YAMl config file and do all necessary checks. + + Args: + config_path (Path): Path to the YAML config file. + + Returns: + Any: Parsed YAML config file. + """ + assert config_path.exists(), f"YAML config path {config_path} does not exist." + with open(config_path) as config_file: + return yaml.safe_load(config_file) + + +def generate_dag(cluster_name: str, tasks: list[DataprocSubmitJobOperator]) -> Any: + """For a list of tasks, generate a complete DAG. + + Args: + cluster_name (str): Name of the cluster. + tasks (list[DataprocSubmitJobOperator]): List of tasks to execute. + + Returns: + Any: Airflow DAG. + """ + return ( + create_cluster(cluster_name) + >> install_dependencies(cluster_name) + >> tasks + >> delete_cluster(cluster_name) + ) + + +def submit_pyspark_job_no_operator( + cluster_name: str, + step_id: str, + other_args: Optional[list[str]] = None, +) -> None: + """Submits the Pyspark job to the cluster. + + Args: + cluster_name (str): Cluster name + step_id (str): Step id + other_args (Optional[list[str]]): Other arguments to pass to the CLI step. Defaults to None. + """ + # Create the job client. + job_client = dataproc_v1.JobControllerClient( + client_options={"api_endpoint": f"{GCP_REGION}-dataproc.googleapis.com:443"} + ) + + python_uri = f"{INITIALISATION_BASE_PATH}/{PYTHON_CLI}" + # Create the job config. 'main_jar_file_uri' can also be a + # Google Cloud Storage URL. + job_description = { + "placement": {"cluster_name": cluster_name}, + "pyspark_job": { + "main_python_file_uri": python_uri, + "args": [f"step={step_id}"] + + (other_args if other_args is not None else []) + + [ + f"--config-dir={CLUSTER_CONFIG_DIR}", + f"--config-name={CONFIG_NAME}", + ], + "properties": { + "spark.jars": "/opt/conda/miniconda3/lib/python3.10/site-packages/hail/backend/hail-all-spark.jar", + "spark.driver.extraClassPath": "/opt/conda/miniconda3/lib/python3.10/site-packages/hail/backend/hail-all-spark.jar", + "spark.executor.extraClassPath": "./hail-all-spark.jar", + "spark.serializer": "org.apache.spark.serializer.KryoSerializer", + "spark.kryo.registrator": "is.hail.kryo.HailKryoRegistrator", + }, + }, + } + job_client.submit_job( + project_id=GCP_PROJECT, region=GCP_REGION, job=job_description + ) diff --git a/src/airflow/dags/configs/dag.yaml b/src/airflow/dags/configs/dag.yaml index a9416b774..caf55b373 100644 --- a/src/airflow/dags/configs/dag.yaml +++ b/src/airflow/dags/configs/dag.yaml @@ -1,18 +1,18 @@ -- id: "my_gene_index" -- id: "my_variant_annotation" -- id: "my_ld_index" -- id: "my_gwas_catalog" +- id: "gene_index" +- id: "gwas_catalog" +- id: "variant_index" prerequisites: - - "my_variant_annotation" - - "my_ld_index" -- id: "my_variant_index" + - "gwas_catalog" +- id: "v2g" prerequisites: - - "my_variant_annotation" - - "my_gwas_catalog" -- id: "my_v2g" + - "variant_index" + - "gene_index" +- id: "study_locus_overlap" prerequisites: - - "my_variant_index" - - "my_variant_annotation" - - "my_gene_index" -- id: "my_finngen" -- id: "my_ukbiobank" + - "gwas_catalog" +- id: "locus_to_gene" + prerequisites: + - "gwas_catalog" + - "variant_index" + - "v2g" + - "study_locus_overlap" diff --git a/src/airflow/dags/dag_genetics_etl.py b/src/airflow/dags/dag_genetics_etl.py new file mode 100644 index 000000000..1d27b8bba --- /dev/null +++ b/src/airflow/dags/dag_genetics_etl.py @@ -0,0 +1,35 @@ +"""Airflow DAG for the ETL part of the pipeline.""" +from __future__ import annotations + +from pathlib import Path + +import common_airflow as common +from airflow.models.dag import DAG + +CLUSTER_NAME = "otg-etl" +SOURCE_CONFIG_FILE_PATH = Path(__file__).parent / "configs" / "dag.yaml" + + +with DAG( + dag_id=Path(__file__).stem, + description="Open Targets Genetics ETL workflow", + default_args=common.shared_dag_args, + **common.shared_dag_kwargs, +): + # Parse and define all steps and their prerequisites. + tasks = {} + steps = common.read_yaml_config(SOURCE_CONFIG_FILE_PATH) + for step in steps: + # Define task for the current step. + step_id = step["id"] + this_task = common.submit_step( + cluster_name=CLUSTER_NAME, + step_id=step_id, + task_id=step_id, + ) + # Chain prerequisites. + tasks[step_id] = this_task + for prerequisite in step.get("prerequisites", []): + this_task.set_upstream(tasks[prerequisite]) + # Construct the DAG with all tasks. + dag = common.generate_dag(cluster_name=CLUSTER_NAME, tasks=list(tasks.values())) diff --git a/src/airflow/dags/dag_preprocess.py b/src/airflow/dags/dag_preprocess.py new file mode 100644 index 000000000..f0dde085e --- /dev/null +++ b/src/airflow/dags/dag_preprocess.py @@ -0,0 +1,30 @@ +"""Airflow DAG for the Preprocess part of the pipeline.""" +from __future__ import annotations + +from pathlib import Path + +import common_airflow as common +from airflow.models.dag import DAG + +CLUSTER_NAME = "otg-preprocess" + +ALL_STEPS = [ + "finngen", + "eqtl_catalogue", + "ld_index", + "variant_annotation", + "ukbiobank", +] + + +with DAG( + dag_id=Path(__file__).stem, + description="Open Targets Genetics — Preprocess", + default_args=common.shared_dag_args, + **common.shared_dag_kwargs, +): + all_tasks = [ + common.submit_step(cluster_name=CLUSTER_NAME, step_id=step, task_id=step) + for step in ALL_STEPS + ] + dag = common.generate_dag(cluster_name=CLUSTER_NAME, tasks=all_tasks) diff --git a/src/airflow/dags/finngen_harmonisation.py b/src/airflow/dags/finngen_harmonisation.py new file mode 100644 index 000000000..ad88e695c --- /dev/null +++ b/src/airflow/dags/finngen_harmonisation.py @@ -0,0 +1,77 @@ +"""Airflow DAG for the harmonisation part of the pipeline.""" +from __future__ import annotations + +import re +import time +from pathlib import Path +from typing import Any + +import common_airflow as common +from airflow.decorators import task +from airflow.models.dag import DAG +from airflow.providers.google.cloud.operators.gcs import GCSListObjectsOperator + +CLUSTER_NAME = "otg-finngen-harmonisation" +AUTOSCALING = "gwascatalog-harmonisation" # same as GWAS Catalog harmonisation +SUMMARY_STATS_BUCKET_NAME = "finngen-public-data-r10" +RELEASEBUCKET = "gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX" +SUMSTATS_PARQUET = f"{RELEASEBUCKET}/summary_statistics/finngen" + +with DAG( + dag_id=Path(__file__).stem, + description="Open Targets Genetics — Finngen harmonisation", + default_args=common.shared_dag_args, + **common.shared_dag_kwargs, +): + # List raw harmonised files from GWAS Catalog + list_inputs = GCSListObjectsOperator( + task_id="list_raw_sumstats", + bucket=SUMMARY_STATS_BUCKET_NAME, + prefix="summary_stats", + match_glob="**/*.gz", + ) + + # Submit jobs to dataproc + @task(task_id="submit_jobs") + def submit_jobs(**kwargs: Any) -> None: + """Submit jobs to dataproc. + + Args: + **kwargs (Any): Keyword arguments. + """ + ti = kwargs["ti"] + todo = ti.xcom_pull(task_ids="list_raw_sumstats", key="return_value") + print("Number of jobs to submit: ", len(todo)) # noqa: T201 + for i in range(len(todo)): + # Not to exceed default quota 400 jobs per minute + if i > 0 and i % 399 == 0: + time.sleep(60) + input_path = todo[i] + match_result = re.search(r"summary_stats/finngen_(.*).gz", input_path) + if match_result: + study_id = match_result.group(1) + print("Submitting job for study: ", study_id) # noqa: T201 + common.submit_pyspark_job_no_operator( + cluster_name=CLUSTER_NAME, + step_id="finngen_sumstat_preprocess", + other_args=[ + f"step.raw_sumstats_path=gs://{SUMMARY_STATS_BUCKET_NAME}/{input_path}", + f"step.out_sumstats_path={SUMSTATS_PARQUET}/{study_id}.parquet", + ], + ) + + # list_inputs >> + ( + list_inputs + >> common.create_cluster( + CLUSTER_NAME, + autoscaling_policy=AUTOSCALING, + num_workers=8, + # num_preemptible_workers=8, + master_machine_type="n1-highmem-32", + worker_machine_type="n1-standard-2", + ) + >> common.install_dependencies(CLUSTER_NAME) + >> submit_jobs() + >> common.delete_cluster(CLUSTER_NAME) + ) diff --git a/src/airflow/dags/finngen_preprocess.py b/src/airflow/dags/finngen_preprocess.py new file mode 100644 index 000000000..3ca5f3907 --- /dev/null +++ b/src/airflow/dags/finngen_preprocess.py @@ -0,0 +1,80 @@ +"""Airflow DAG for the Preprocess part of the pipeline.""" +from __future__ import annotations + +from pathlib import Path + +import common_airflow as common +from airflow.models.dag import DAG +from airflow.utils.trigger_rule import TriggerRule + +CLUSTER_NAME = "otg-preprocess-finngen" +AUTOSCALING = "finngen-preprocess" + +RELEASEBUCKET = "gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX" +SUMSTATS = f"{RELEASEBUCKET}/summary_statistics/finngen" +WINDOWBASED_CLUMPED = ( + f"{RELEASEBUCKET}/study_locus/from_sumstats_study_locus_window_clumped/finngen" +) +LD_CLUMPED = f"{RELEASEBUCKET}/study_locus/from_sumstats_study_locus_ld_clumped/finngen" +PICSED = f"{RELEASEBUCKET}/credible_set/from_sumstats_study_locus/finngen" + +with DAG( + dag_id=Path(__file__).stem, + description="Open Targets Genetics — Finngen preprocess", + default_args=common.shared_dag_args, + **common.shared_dag_kwargs, +): + study_index = common.submit_step( + cluster_name=CLUSTER_NAME, + step_id="finngen_studies", + task_id="finngen_studies", + ) + + window_based_clumping = common.submit_step( + cluster_name=CLUSTER_NAME, + step_id="clump", + task_id="finngen_window_based_clumping", + other_args=[ + f"step.input_path={SUMSTATS}", + f"step.clumped_study_locus_path={WINDOWBASED_CLUMPED}", + ], + ) + ld_clumping = common.submit_step( + cluster_name=CLUSTER_NAME, + step_id="clump", + task_id="finngen_ld_clumping", + other_args=[ + f"step.input_path={WINDOWBASED_CLUMPED}", + f"step.ld_index_path={RELEASEBUCKET}/ld_index", + f"step.study_index_path={RELEASEBUCKET}/study_index/finngen", + f"step.clumped_study_locus_path={LD_CLUMPED}", + ], + trigger_rule=TriggerRule.ALL_DONE, + ) + + pics = common.submit_step( + cluster_name=CLUSTER_NAME, + step_id="pics", + task_id="finngen_pics", + other_args=[ + f"step.study_locus_ld_annotated_in={LD_CLUMPED}", + f"step.picsed_study_locus_out={PICSED}", + ], + # This allows to attempt running the task when above step fails do to failifexists + trigger_rule=TriggerRule.ALL_DONE, + ) + + ( + common.create_cluster( + CLUSTER_NAME, + autoscaling_policy=AUTOSCALING, + master_disk_size=2000, + num_workers=6, + ) + >> common.install_dependencies(CLUSTER_NAME) + >> study_index + >> window_based_clumping + >> ld_clumping + >> pics + >> common.delete_cluster(CLUSTER_NAME) + ) diff --git a/src/airflow/dags/genetics_etl_gcp.py b/src/airflow/dags/genetics_etl_gcp.py deleted file mode 100644 index 9938daa08..000000000 --- a/src/airflow/dags/genetics_etl_gcp.py +++ /dev/null @@ -1,203 +0,0 @@ -"""Generate jinja2 template for workflow.""" -from __future__ import annotations - -from pathlib import Path - -import pendulum -import yaml -from airflow.decorators import dag, task_group -from airflow.operators.empty import EmptyOperator -from airflow.providers.google.cloud.operators.dataproc import ( - ClusterGenerator, - DataprocCreateClusterOperator, - DataprocDeleteClusterOperator, - DataprocSubmitJobOperator, -) -from airflow.utils.trigger_rule import TriggerRule - -DAG_ID = "etl_using_external_flat_file" - -DAG_DIR = Path(__file__).parent -CONFIG_DIR = "configs" - -SOURCES_FILE_NAME = "dag.yaml" -SOURCE_CONFIG_FILE_PATH = DAG_DIR / CONFIG_DIR / SOURCES_FILE_NAME - -# Managed cluster -project_id = "open-targets-genetics-dev" -otg_version = "0.1.4" -initialisation_base_path = ( - f"gs://genetics_etl_python_playground/initialisation/{otg_version}" -) -python_cli = f"{initialisation_base_path}/cli.py" -config_name = "my_config" -config_tar = f"{initialisation_base_path}/config.tar.gz" -package_wheel = f"{initialisation_base_path}/otgenetics-{otg_version}-py3-none-any.whl" -initialisation_executable_file = [f"{initialisation_base_path}/initialise_cluster.sh"] -image_version = "2.1" -num_local_ssds = 1 -# job -cluster_config_dir = "/config" - -default_args = { - "owner": "Open Targets Data Team", - # Tell airflow to start one day ago, so that it runs as soon as you upload it - "start_date": pendulum.now(tz="Europe/London").subtract(days=1), - # "start_date": pendulum.datetime(2020, 1, 1, tz="Europe/London"), - "schedule_interval": "@once", - "project_id": project_id, - "catchup": False, - "retries": 3, -} - -cluster_generator_config = ClusterGenerator( - project_id=project_id, - zone="europe-west1-d", - master_machine_type="n1-standard-4", - num_workers=0, - init_actions_uris=initialisation_executable_file, - # init_action_timeout="600s", - enable_component_gateway=True, - num_local_ssds=1, - image_version=image_version, - metadata={ - "CONFIGTAR": config_tar, - "PACKAGE": package_wheel, - }, -).make() - - -def generate_pyspark_job_from_dict( - step: dict, - cluster_config_dir: str, - config_name: str, - cluster_name: str, -) -> DataprocSubmitJobOperator: - """Generates a pyspark job from dictionary describing step. - - Args: - step (dict): Dictionary describing step. - cluster_config_dir (str): Directory containing cluster config. - config_name (str): Name of config file. - cluster_name (str): Name of cluster. - - Returns: - DataprocSubmitJobOperator: Operator for submitting pyspark job. - """ - return DataprocSubmitJobOperator( - task_id=f"job-{step['id']}", - region="europe-west1", - project_id=project_id, - job={ - "job_uuid": f"airflow-{step['id']}", - "reference": {"project_id": project_id}, - "placement": {"cluster_name": cluster_name}, - "pyspark_job": { - "main_python_file_uri": f"{initialisation_base_path}/cli.py", - "args": [ - f"step={ step['id'] }", - f"--config-dir={ cluster_config_dir }", - f"--config-name={ config_name }", - ], - "properties": { - "spark.jars": "/opt/conda/miniconda3/lib/python3.10/site-packages/hail/backend/hail-all-spark.jar", - "spark.driver.extraClassPath": "/opt/conda/miniconda3/lib/python3.10/site-packages/hail/backend/hail-all-spark.jar", - "spark.executor.extraClassPath": "./hail-all-spark.jar", - "spark.serializer": "org.apache.spark.serializer.KryoSerializer", - "spark.kryo.registrator": "is.hail.kryo.HailKryoRegistrator", - }, - }, - }, - ) - - -@dag( - dag_id=Path(__file__).stem, - default_args=default_args, - description="Open Targets Genetics ETL workflow", - tags=["genetics_etl", "experimental"], -) -def create_dag() -> None: - """Submit dataproc workflow.""" - start = EmptyOperator(task_id="start") - - source_config_file_path = Path(SOURCE_CONFIG_FILE_PATH) - - end = EmptyOperator(task_id="end", trigger_rule="all_done") - - if source_config_file_path.exists(): - with open(source_config_file_path, "r") as config_file: - tasks_groups = {} - steps = yaml.safe_load(config_file) - for step in steps: - print(step["id"]) - - @task_group( - group_id=step["id"], - prefix_group_id=True, - ) - def tgroup(step: dict) -> None: - """Task group for step. - - Args: - step (dict): Dictionary describing step. - """ - cluster_name = ( - f"workflow-otg-cluster-{step['id'].replace('_', '-')}" - ) - create_cluster = DataprocCreateClusterOperator( - task_id=f"create_cluster_{step['id']}", - project_id=project_id, - cluster_config=cluster_generator_config, - region="europe-west1", - cluster_name=cluster_name, - trigger_rule=TriggerRule.ALL_SUCCESS, - ) - install_dependencies = DataprocSubmitJobOperator( - task_id=f"install_dependencies_{step['id']}", - region="europe-west1", - project_id=project_id, - job={ - "job_uuid": "airflow-install-dependencies", - "reference": {"project_id": project_id}, - "placement": {"cluster_name": cluster_name}, - "pig_job": { - "jar_file_uris": [ - f"gs://genetics_etl_python_playground/initialisation/{otg_version}/install_dependencies_on_cluster.sh" - ], - "query_list": { - "queries": [ - "sh chmod 750 ${PWD}/install_dependencies_on_cluster.sh", - "sh ${PWD}/install_dependencies_on_cluster.sh", - ] - }, - }, - }, - ) - task = generate_pyspark_job_from_dict( - step, - cluster_config_dir=cluster_config_dir, - config_name=config_name, - cluster_name=cluster_name, - ) - delete_cluster = DataprocDeleteClusterOperator( - task_id=f"delete_cluster_{step['id']}", - project_id=project_id, - cluster_name=cluster_name, - region="europe-west1", - trigger_rule=TriggerRule.ALL_DONE, - deferrable=True, - ) - create_cluster >> install_dependencies >> task >> delete_cluster - - thisgroup = tgroup(step) - tasks_groups[step["id"]] = thisgroup - if "prerequisites" in step: - for prerequisite in step["prerequisites"]: - print(f"|- {prerequisite}") - thisgroup.set_upstream(tasks_groups[prerequisite]) - - start >> thisgroup >> end - - -dag = create_dag() diff --git a/src/airflow/dags/gwas_catalog_harmonisation.py b/src/airflow/dags/gwas_catalog_harmonisation.py new file mode 100644 index 000000000..180c7048a --- /dev/null +++ b/src/airflow/dags/gwas_catalog_harmonisation.py @@ -0,0 +1,117 @@ +"""Airflow DAG for the harmonisation part of the pipeline.""" +from __future__ import annotations + +import re +import time +from pathlib import Path +from typing import Any + +import common_airflow as common +from airflow.decorators import task +from airflow.models.dag import DAG +from airflow.providers.google.cloud.operators.gcs import GCSListObjectsOperator + +CLUSTER_NAME = "otg-gwascatalog-harmonisation" +AUTOSCALING = "gwascatalog-harmonisation" + +SUMMARY_STATS_BUCKET_NAME = "open-targets-gwas-summary-stats" + +with DAG( + dag_id=Path(__file__).stem, + description="Open Targets Genetics — GWAS Catalog harmonisation", + default_args=common.shared_dag_args, + **common.shared_dag_kwargs, +): + # List raw harmonised files from GWAS Catalog + list_inputs = GCSListObjectsOperator( + task_id="list_raw_harmonised", + bucket=SUMMARY_STATS_BUCKET_NAME, + prefix="raw-harmonised", + match_glob="**/*.h.tsv.gz", + ) + # List parquet files that have been previously processed + list_outputs = GCSListObjectsOperator( + task_id="list_harmonised_parquet", + bucket=SUMMARY_STATS_BUCKET_NAME, + prefix="harmonised", + match_glob="**/_SUCCESS", + ) + + # Create list of pending jobs + @task(task_id="create_to_do_list") + def create_to_do_list(**kwargs: Any) -> Any: + """Create the to-do list of studies. + + Args: + **kwargs (Any): Keyword arguments. + + Returns: + Any: To-do list. + """ + ti = kwargs["ti"] + raw_harmonised = ti.xcom_pull( + task_ids="list_raw_harmonised", key="return_value" + ) + print("Number of raw harmonised files: ", len(raw_harmonised)) # noqa: T201 + to_do_list = [] + # Remove the ones that have been processed + parquets = ti.xcom_pull(task_ids="list_harmonised_parquet", key="return_value") + print("Number of parquet files: ", len(parquets)) # noqa: T201 + for path in raw_harmonised: + match_result = re.search( + r"raw-harmonised/(.*)/(GCST\d+)/harmonised/(.*)\.h\.tsv\.gz", path + ) + if match_result: + study_id = match_result.group(2) + if f"harmonised/{study_id}.parquet/_SUCCESS" not in parquets: + to_do_list.append(path) + print("Number of jobs to submit: ", len(to_do_list)) # noqa: T201 + ti.xcom_push(key="to_do_list", value=to_do_list) + + # Submit jobs to dataproc + @task(task_id="submit_jobs") + def submit_jobs(**kwargs: Any) -> None: + """Submit jobs to dataproc. + + Args: + **kwargs (Any): Keyword arguments. + """ + ti = kwargs["ti"] + todo = ti.xcom_pull(task_ids="create_to_do_list", key="to_do_list") + print("Number of jobs to submit: ", len(todo)) # noqa: T201 + for i in range(len(todo)): + # Not to exceed default quota 400 jobs per minute + if i > 0 and i % 399 == 0: + time.sleep(60) + input_path = todo[i] + match_result = re.search( + r"raw-harmonised/(.*)/(GCST\d+)/harmonised/(.*)\.h\.tsv\.gz", input_path + ) + if match_result: + study_id = match_result.group(2) + print("Submitting job for study: ", study_id) # noqa: T201 + common.submit_pyspark_job_no_operator( + cluster_name=CLUSTER_NAME, + step_id="gwas_catalog_sumstat_preprocess", + other_args=[ + f"step.raw_sumstats_path=gs://{SUMMARY_STATS_BUCKET_NAME}/{input_path}", + f"step.out_sumstats_path=gs://{SUMMARY_STATS_BUCKET_NAME}/harmonised/{study_id}.parquet", + ], + ) + + # list_inputs >> + ( + [list_inputs, list_outputs] + >> create_to_do_list() + >> common.create_cluster( + CLUSTER_NAME, + autoscaling_policy=AUTOSCALING, + num_workers=8, + num_preemptible_workers=8, + master_machine_type="n1-highmem-64", + worker_machine_type="n1-standard-2", + ) + >> common.install_dependencies(CLUSTER_NAME) + >> submit_jobs() + # >> common.delete_cluster(CLUSTER_NAME) + ) diff --git a/src/airflow/dags/gwas_catalog_preprocess.py b/src/airflow/dags/gwas_catalog_preprocess.py new file mode 100644 index 000000000..e21dcd9bd --- /dev/null +++ b/src/airflow/dags/gwas_catalog_preprocess.py @@ -0,0 +1,96 @@ +"""Airflow DAG for the preprocessing of GWAS Catalog's harmonised summary statistics and curated associations.""" +from __future__ import annotations + +from pathlib import Path + +import common_airflow as common +from airflow.models.dag import DAG +from airflow.utils.task_group import TaskGroup +from airflow.utils.trigger_rule import TriggerRule + +CLUSTER_NAME = "otg-preprocess-gwascatalog" +AUTOSCALING = "otg-preprocess-gwascatalog" + +SUMSTATS = "gs://open-targets-gwas-summary-stats/harmonised" +RELEASEBUCKET = "gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX" + +with DAG( + dag_id=Path(__file__).stem, + description="Open Targets Genetics — GWAS Catalog preprocess", + default_args=common.shared_dag_args, + **common.shared_dag_kwargs, +): + with TaskGroup(group_id="summary_stats_preprocessing") as summary_stats_group: + summary_stats_window_clumping = common.submit_step( + cluster_name=CLUSTER_NAME, + step_id="clump", + task_id="catalog_sumstats_window_clumping", + other_args=[ + f"step.input_path={SUMSTATS}", + f"step.clumped_study_locus_path={RELEASEBUCKET}/study_locus/window_clumped/from_sumstats/catalog", + ], + ) + summary_stats_ld_clumping = common.submit_step( + cluster_name=CLUSTER_NAME, + step_id="clump", + task_id="catalog_sumstats_ld_clumping", + other_args=[ + f"step.input_path={RELEASEBUCKET}/study_locus/window_clumped/from_sumstats/catalog", + "step.ld_index_path={RELEASEBUCKET}/ld_index", + "step.study_index_path={RELEASEBUCKET}/study_index/catalog", + "step.clumped_study_locus_path={RELEASEBUCKET}/study_locus/ld_clumped/from_sumstats/catalog", + ], + trigger_rule=TriggerRule.ALL_DONE, + ) + summary_stats_pics = common.submit_step( + cluster_name=CLUSTER_NAME, + step_id="pics", + task_id="catalog_sumstats_pics", + other_args=[ + "step.study_locus_ld_annotated_in={RELEASEBUCKET}/study_locus/ld_clumped/from_sumstats/catalog", + "step.picsed_study_locus_out={RELEASEBUCKET}/credible_set/from_sumstats/catalog", + ], + trigger_rule=TriggerRule.ALL_DONE, + ) + summary_stats_window_clumping >> summary_stats_ld_clumping >> summary_stats_pics + + with TaskGroup(group_id="curation_preprocessing") as curation_group: + parse_study_and_curated_assocs = common.submit_step( + cluster_name=CLUSTER_NAME, + step_id="gwas_catalog_ingestion", + task_id="catalog_ingestion", + ) + + curation_ld_clumping = common.submit_step( + cluster_name=CLUSTER_NAME, + step_id="clump", + task_id="catalog_curation_ld_clumping", + other_args=[ + "step.input_path={RELEASEBUCKET}/study_locus/catalog_curated", + "step.ld_index_path={RELEASEBUCKET}/ld_index", + "step.study_index_path={RELEASEBUCKET}/study_index/catalog", + "step.clumped_study_locus_path={RELEASEBUCKET}/study_locus/ld_clumped/catalog_curated", + ], + trigger_rule=TriggerRule.ALL_DONE, + ) + + curation_pics = common.submit_step( + cluster_name=CLUSTER_NAME, + step_id="pics", + task_id="catalog_curation_pics", + other_args=[ + "step.study_locus_ld_annotated_in={RELEASEBUCKET}/study_locus/ld_clumped/catalog_curated", + "step.picsed_study_locus_out={RELEASEBUCKET}/credible_set/catalog_curated", + ], + trigger_rule=TriggerRule.ALL_DONE, + ) + parse_study_and_curated_assocs >> curation_ld_clumping >> curation_pics + + ( + common.create_cluster( + CLUSTER_NAME, autoscaling_policy=AUTOSCALING, num_workers=5 + ) + >> common.install_dependencies(CLUSTER_NAME) + >> [summary_stats_group, curation_group] + >> common.delete_cluster(CLUSTER_NAME) + ) diff --git a/src/airflow/docker-compose.yaml b/src/airflow/docker-compose.yaml index 32c50f23d..8e8523490 100644 --- a/src/airflow/docker-compose.yaml +++ b/src/airflow/docker-compose.yaml @@ -16,7 +16,7 @@ # under the License. # -# Basic Airflow cluster configuration for CeleryExecutor with Redis and PostgreSQL. +# Basic Airflow cluster configuration for LocalExecutor with PostgreSQL. # # WARNING: This configuration is for local development. Do not use it in a production deployment. # @@ -24,7 +24,7 @@ # The following variables are supported: # # AIRFLOW_IMAGE_NAME - Docker image name used to run Airflow. -# Default: apache/airflow:2.7.1 +# Default: apache/airflow:slim-2.7.2-python3.10 # AIRFLOW_UID - User ID in Airflow containers # Default: 50000 # AIRFLOW_PROJ_DIR - Base path to which all the files will be volumed. @@ -43,39 +43,35 @@ # Default: '' # # Feel free to modify this file to suit your needs. ---- -version: '3.8' -x-airflow-common: - &airflow-common +version: "3.8" +x-airflow-common: &airflow-common # In order to add custom dependencies or upgrade provider packages you can use your extended image. # Comment the image line, place your Dockerfile in the directory where you placed the docker-compose.yaml # and uncomment the "build" line below, Then run `docker-compose build` to build the images. - image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.7.1} + image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:slim-2.7.2-python3.10} # build: . - environment: - &airflow-common-env + environment: &airflow-common-env AIRFLOW__CORE__EXECUTOR: LocalExecutor AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow # For backward compatibility, with Airflow <2.3 AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow - AIRFLOW__CORE__FERNET_KEY: '' - AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: 'true' - AIRFLOW__CORE__LOAD_EXAMPLES: 'false' - AIRFLOW__API__AUTH_BACKENDS: 'airflow.api.auth.backend.basic_auth,airflow.api.auth.backend.session' + AIRFLOW__CORE__FERNET_KEY: "" + AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: "true" + AIRFLOW__CORE__LOAD_EXAMPLES: "false" + AIRFLOW__API__AUTH_BACKENDS: "airflow.api.auth.backend.basic_auth,airflow.api.auth.backend.session" # yamllint disable rule:line-length # Use simple http server on scheduler for health checks # See https://airflow.apache.org/docs/apache-airflow/stable/administration-and-deployment/logging-monitoring/check-health.html#scheduler-health-check-server # yamllint enable rule:line-length - AIRFLOW__SCHEDULER__ENABLE_HEALTH_CHECK: 'true' + AIRFLOW__SCHEDULER__ENABLE_HEALTH_CHECK: "true" # WARNING: Use _PIP_ADDITIONAL_REQUIREMENTS option ONLY for a quick checks # for other purpose (development, test and especially production usage) build/extend Airflow image. _PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:-} # GCLOUD Authentication - GOOGLE_APPLICATION_CREDENTIALS: /.google/credentials/google_credentials.json - AIRFLOW_CONN_GOOGLE_CLOUD_DEFAULT: 'google-cloud-platform://?extra__google_cloud_platform__key_path=/.google/credentials/google_credentials.json' - # Nice to have, Not necessary - GCP_PROJECT_ID: 'open-targets-genetics-dev' - GCP_GCS_BUCKET: 'gs://genetics_etl_python_playground/' + GOOGLE_APPLICATION_CREDENTIALS: ${GOOGLE_APPLICATION_CREDENTIALS:-} + AIRFLOW_CONN_GOOGLE_CLOUD_DEFAULT: ${AIRFLOW_CONN_GOOGLE_CLOUD_DEFAULT:-} + GCP_PROJECT_ID: ${GCP_PROJECT_ID:-} + GCP_GCS_BUCKET: ${GCP_GCS_BUCKET:-} volumes: - ${AIRFLOW_PROJ_DIR:-.}/dags:/opt/airflow/dags @@ -83,17 +79,12 @@ x-airflow-common: - ${AIRFLOW_PROJ_DIR:-.}/config:/opt/airflow/config - ${AIRFLOW_PROJ_DIR:-.}/plugins:/opt/airflow/plugins # GCLOUD Authentication - - ~/.google/credentials/:/.google/credentials:ro + - ${GOOGLE_LOCAL_CREDENTIALS_PATH}:/${GOOGLE_DOCKER_CREDENTIALS_PATH}:ro user: "${AIRFLOW_UID:-50000}:0" - depends_on: - &airflow-common-depends-on - redis: - condition: service_healthy + depends_on: &airflow-common-depends-on postgres: condition: service_healthy - - services: postgres: image: postgres:13 @@ -110,33 +101,6 @@ services: start_period: 5s restart: always - redis: - image: redis:latest - expose: - - 6379 - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 10s - timeout: 30s - retries: 50 - start_period: 30s - restart: always - - airflow-scheduler: - <<: *airflow-common - command: scheduler - healthcheck: - test: ["CMD", "curl", "--fail", "http://localhost:8974/health"] - interval: 30s - timeout: 10s - retries: 5 - start_period: 30s - restart: always - depends_on: - <<: *airflow-common-depends-on - airflow-init: - condition: service_completed_successfully - airflow-webserver: <<: *airflow-common command: webserver @@ -154,11 +118,11 @@ services: airflow-init: condition: service_completed_successfully - airflow-triggerer: + airflow-scheduler: <<: *airflow-common - command: triggerer + command: scheduler healthcheck: - test: ["CMD-SHELL", 'airflow jobs check --job-type TriggererJob --hostname "$${HOSTNAME}"'] + test: ["CMD", "curl", "--fail", "http://localhost:8974/health"] interval: 30s timeout: 10s retries: 5 @@ -238,14 +202,27 @@ services: # yamllint enable rule:line-length environment: <<: *airflow-common-env - _AIRFLOW_DB_MIGRATE: 'true' - _AIRFLOW_WWW_USER_CREATE: 'true' + _AIRFLOW_DB_MIGRATE: "true" + _AIRFLOW_WWW_USER_CREATE: "true" _AIRFLOW_WWW_USER_USERNAME: ${_AIRFLOW_WWW_USER_USERNAME:-airflow} _AIRFLOW_WWW_USER_PASSWORD: ${_AIRFLOW_WWW_USER_PASSWORD:-airflow} - _PIP_ADDITIONAL_REQUIREMENTS: '' + _PIP_ADDITIONAL_REQUIREMENTS: "" user: "0:0" volumes: - ${AIRFLOW_PROJ_DIR:-.}:/sources + airflow-cli: + <<: *airflow-common + profiles: + - debug + environment: + <<: *airflow-common-env + CONNECTION_CHECK_MAX_COUNT: "0" + # Workaround for entrypoint issue. See: https://github.com/apache/airflow/issues/16252 + command: + - bash + - -c + - airflow + volumes: postgres-db-volume: diff --git a/src/airflow/logs/.gitkeep b/src/airflow/logs/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/airflow/plugins/.gitkeep b/src/airflow/plugins/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/airflow/requirements.txt b/src/airflow/requirements.txt index 185ee6d67..e9fd45142 100644 --- a/src/airflow/requirements.txt +++ b/src/airflow/requirements.txt @@ -1 +1,2 @@ -apache-airflow-providers-google +apache-airflow-providers-google==10.10.1 +psycopg2-binary==2.9.9 diff --git a/src/conftest.py b/src/conftest.py index 03b82efb8..fd8c0ad07 100644 --- a/src/conftest.py +++ b/src/conftest.py @@ -6,48 +6,31 @@ import pytest from pyspark.sql import SparkSession +from utils.spark import get_spark_testing_conf + @pytest.fixture(scope="session", autouse=True) -def spark(doctest_namespace: dict[str, Any], tmp_path_factory: Any) -> SparkSession: +def spark( + doctest_namespace: dict[str, Any], tmp_path_factory: pytest.TempPathFactory +) -> SparkSession: """Local spark session for testing purposes. It returns a session and make it available to doctests through the `spark` namespace. Args: - doctest_namespace (Dict[str, Any]): pytest namespace for doctests + doctest_namespace (dict[str, Any]): pytest namespace for doctests + tmp_path_factory (pytest.TempPathFactory): pytest tmp_path_factory Returns: SparkSession: local spark session """ - # init spark session + # Restart new session: spark = ( - SparkSession.builder.master("local[1]") - .config("spark.driver.bindAddress", "127.0.0.1") - .config("spark.executor.cores", "1") - .config("spark.executor.instances", "1") - # no shuffling - .config("spark.sql.shuffle.partitions", "1") - # ui settings - .config("spark.ui.showConsoleProgress", "false") - .config("spark.ui.enabled", "false") - .config("spark.ui.dagGraph.retainedRootRDDs", "1") - .config("spark.ui.retainedJobs", "1") - .config("spark.ui.retainedStages", "1") - .config("spark.ui.retainedTasks", "1") - .config("spark.sql.ui.retainedExecutions", "1") - .config("spark.worker.ui.retainedExecutors", "1") - .config("spark.worker.ui.retainedDrivers", "1") - # fixed memory - .config("spark.driver.memory", "2g") - .config("spark.sql.warehouse.dir", tmp_path_factory.mktemp("warehouse")) - .config( - "spark.driver.extraJavaOptions", - "-Dderby.system.home={tmp_path_factory.mktemp('derby')}", - ) + SparkSession.builder.config(conf=get_spark_testing_conf()) + .master("local[1]") .appName("test") .getOrCreate() ) - doctest_namespace["spark"] = spark return spark diff --git a/src/otg/__init__.py b/src/otg/__init__.py index 9a6eccd24..f54d16b97 100644 --- a/src/otg/__init__.py +++ b/src/otg/__init__.py @@ -1,3 +1,5 @@ """Modules supporting Genetics Portal analysis.""" from __future__ import annotations + +__version__ = "0.0.0" diff --git a/src/otg/assets/schemas/gene_index.json b/src/otg/assets/schemas/gene_index.json index cd901a995..c8139c20d 100644 --- a/src/otg/assets/schemas/gene_index.json +++ b/src/otg/assets/schemas/gene_index.json @@ -32,30 +32,14 @@ "metadata": {} }, { + "metadata": {}, "name": "obsoleteSymbols", - "type": { - "type": "array", - "elementType": { - "type": "struct", - "fields": [ - { - "name": "label", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "source", - "type": "string", - "nullable": true, - "metadata": {} - } - ] - }, - "containsNull": true - }, "nullable": true, - "metadata": {} + "type": { + "containsNull": true, + "elementType": "string", + "type": "array" + } }, { "name": "tss", diff --git a/src/otg/assets/schemas/l2g_feature.json b/src/otg/assets/schemas/l2g_feature.json new file mode 100644 index 000000000..3139a57e4 --- /dev/null +++ b/src/otg/assets/schemas/l2g_feature.json @@ -0,0 +1,29 @@ +{ + "type": "struct", + "fields": [ + { + "name": "studyLocusId", + "type": "long", + "nullable": false, + "metadata": {} + }, + { + "name": "geneId", + "type": "string", + "nullable": false, + "metadata": {} + }, + { + "name": "featureName", + "type": "string", + "nullable": false, + "metadata": {} + }, + { + "name": "featureValue", + "type": "float", + "nullable": false, + "metadata": {} + } + ] +} diff --git a/src/otg/assets/schemas/l2g_feature_matrix.json b/src/otg/assets/schemas/l2g_feature_matrix.json new file mode 100644 index 000000000..c88bc21af --- /dev/null +++ b/src/otg/assets/schemas/l2g_feature_matrix.json @@ -0,0 +1,119 @@ +{ + "fields": [ + { + "metadata": {}, + "name": "studyLocusId", + "nullable": false, + "type": "long" + }, + { + "metadata": {}, + "name": "geneId", + "nullable": false, + "type": "string" + }, + { + "metadata": {}, + "name": "goldStandardSet", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "distanceTssMean", + "nullable": true, + "type": "float" + }, + { + "metadata": {}, + "name": "distanceTssMinimum", + "nullable": true, + "type": "float" + }, + { + "metadata": {}, + "name": "vepMaximumNeighborhood", + "nullable": true, + "type": "float" + }, + { + "metadata": {}, + "name": "vepMaximum", + "nullable": true, + "type": "float" + }, + { + "metadata": {}, + "name": "eqtlColocClppLocalMaximum", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "eqtlColocClppNeighborhoodMaximum", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "eqtlColocLlrLocalMaximum", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "eqtlColocLlrNeighborhoodMaximum", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "pqtlColocClppLocalMaximum", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "pqtlColocClppNeighborhoodMaximum", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "pqtlColocLlrLocalMaximum", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "pqtlColocLlrNeighborhoodMaximum", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "sqtlColocClppLocalMaximum", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "sqtlColocClppNeighborhoodMaximum", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "sqtlColocLlrLocalMaximum", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "sqtlColocLlrNeighborhoodMaximum", + "nullable": true, + "type": "double" + } + ], + "type": "struct" +} diff --git a/src/otg/assets/schemas/l2g_gold_standard.json b/src/otg/assets/schemas/l2g_gold_standard.json new file mode 100644 index 000000000..cf19d6b52 --- /dev/null +++ b/src/otg/assets/schemas/l2g_gold_standard.json @@ -0,0 +1,45 @@ +{ + "type": "struct", + "fields": [ + { + "name": "studyLocusId", + "type": "long", + "nullable": false, + "metadata": {} + }, + { + "name": "variantId", + "type": "string", + "nullable": false, + "metadata": {} + }, + { + "name": "studyId", + "type": "string", + "nullable": false, + "metadata": {} + }, + { + "name": "geneId", + "type": "string", + "nullable": false, + "metadata": {} + }, + { + "name": "goldStandardSet", + "type": "string", + "nullable": false, + "metadata": {} + }, + { + "metadata": {}, + "name": "sources", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "string", + "type": "array" + } + } + ] +} diff --git a/src/otg/assets/schemas/l2g_predictions.json b/src/otg/assets/schemas/l2g_predictions.json new file mode 100644 index 000000000..16b274207 --- /dev/null +++ b/src/otg/assets/schemas/l2g_predictions.json @@ -0,0 +1,23 @@ +{ + "type": "struct", + "fields": [ + { + "name": "studyLocusId", + "type": "long", + "nullable": false, + "metadata": {} + }, + { + "name": "geneId", + "type": "string", + "nullable": false, + "metadata": {} + }, + { + "name": "score", + "type": "double", + "nullable": false, + "metadata": {} + } + ] +} diff --git a/src/otg/assets/schemas/study_index.json b/src/otg/assets/schemas/study_index.json index 282b2e156..f7e577921 100644 --- a/src/otg/assets/schemas/study_index.json +++ b/src/otg/assets/schemas/study_index.json @@ -35,6 +35,12 @@ "nullable": true, "metadata": {} }, + { + "name": "geneId", + "type": "string", + "nullable": true, + "metadata": {} + }, { "name": "pubmedId", "type": "string", @@ -83,19 +89,29 @@ }, { "name": "nCases", - "type": "long", + "type": "integer", "nullable": true, "metadata": {} }, { "name": "nControls", - "type": "long", + "type": "integer", "nullable": true, "metadata": {} }, { "name": "nSamples", - "type": "long", + "type": "integer", + "nullable": true, + "metadata": {} + }, + { + "name": "cohorts", + "type": { + "type": "array", + "elementType": "string", + "containsNull": true + }, "nullable": true, "metadata": {} }, @@ -134,7 +150,7 @@ "fields": [ { "name": "sampleSize", - "type": "long", + "type": "integer", "nullable": true, "metadata": {} }, @@ -160,7 +176,7 @@ "fields": [ { "name": "sampleSize", - "type": "long", + "type": "integer", "nullable": true, "metadata": {} }, diff --git a/src/otg/assets/schemas/study_locus.json b/src/otg/assets/schemas/study_locus.json index a67b58b8a..97f9da3bf 100644 --- a/src/otg/assets/schemas/study_locus.json +++ b/src/otg/assets/schemas/study_locus.json @@ -36,36 +36,6 @@ "nullable": true, "type": "double" }, - { - "metadata": {}, - "name": "oddsRatio", - "nullable": true, - "type": "double" - }, - { - "metadata": {}, - "name": "oddsRatioConfidenceIntervalLower", - "nullable": true, - "type": "double" - }, - { - "metadata": {}, - "name": "oddsRatioConfidenceIntervalUpper", - "nullable": true, - "type": "double" - }, - { - "metadata": {}, - "name": "betaConfidenceIntervalLower", - "nullable": true, - "type": "double" - }, - { - "metadata": {}, - "name": "betaConfidenceIntervalUpper", - "nullable": true, - "type": "double" - }, { "metadata": {}, "name": "pValueMantissa", @@ -112,6 +82,12 @@ "nullable": true, "type": "string" }, + { + "metadata": {}, + "name": "sampleSize", + "nullable": true, + "type": "integer" + }, { "metadata": {}, "name": "ldSet", diff --git a/src/otg/assets/schemas/study_locus_overlap.json b/src/otg/assets/schemas/study_locus_overlap.json index 962a1186d..103321f79 100644 --- a/src/otg/assets/schemas/study_locus_overlap.json +++ b/src/otg/assets/schemas/study_locus_overlap.json @@ -15,7 +15,7 @@ { "metadata": {}, "name": "chromosome", - "nullable": false, + "nullable": true, "type": "string" }, { @@ -27,7 +27,7 @@ { "metadata": {}, "name": "statistics", - "nullable": false, + "nullable": true, "type": { "fields": [ { diff --git a/src/otg/assets/schemas/summary_statistics.json b/src/otg/assets/schemas/summary_statistics.json index 4b2f47ea6..7e41cc99e 100644 --- a/src/otg/assets/schemas/summary_statistics.json +++ b/src/otg/assets/schemas/summary_statistics.json @@ -32,15 +32,9 @@ }, { "metadata": {}, - "name": "betaConfidenceIntervalLower", + "name": "sampleSize", "nullable": true, - "type": "double" - }, - { - "metadata": {}, - "name": "betaConfidenceIntervalUpper", - "nullable": true, - "type": "double" + "type": "integer" }, { "metadata": {}, diff --git a/src/otg/assets/schemas/v2g.json b/src/otg/assets/schemas/v2g.json index 2ce41b2c6..afbe401dd 100644 --- a/src/otg/assets/schemas/v2g.json +++ b/src/otg/assets/schemas/v2g.json @@ -61,18 +61,6 @@ "nullable": true, "metadata": {} }, - { - "name": "position", - "type": "integer", - "nullable": false, - "metadata": {} - }, - { - "name": "label", - "type": "string", - "nullable": true, - "metadata": {} - }, { "name": "variantFunctionalConsequenceId", "type": "string", diff --git a/src/otg/assets/schemas/variant_annotation.json b/src/otg/assets/schemas/variant_annotation.json index a5e914d68..826eabaf9 100644 --- a/src/otg/assets/schemas/variant_annotation.json +++ b/src/otg/assets/schemas/variant_annotation.json @@ -20,7 +20,7 @@ "metadata": {} }, { - "name": "gnomad3VariantId", + "name": "gnomadVariantId", "type": "string", "nullable": false, "metadata": {} @@ -92,26 +92,72 @@ "metadata": {} }, { - "name": "cadd", + "name": "inSilicoPredictors", + "nullable": false, + "metadata": {}, "type": { "type": "struct", "fields": [ { - "name": "phred", - "type": "float", + "name": "cadd", + "nullable": true, + "metadata": {}, + "type": { + "type": "struct", + "fields": [ + { + "name": "raw", + "type": "float", + "nullable": true, + "metadata": {} + }, + { + "name": "phred", + "type": "float", + "nullable": true, + "metadata": {} + } + ] + } + }, + { + "name": "revelMax", + "type": "double", "nullable": true, "metadata": {} }, { - "name": "raw", + "name": "spliceaiDsMax", "type": "float", "nullable": true, "metadata": {} + }, + { + "name": "pangolinLargestDs", + "type": "double", + "nullable": true, + "metadata": {} + }, + { + "name": "phylop", + "type": "double", + "nullable": true, + "metadata": {} + }, + { + "name": "siftMax", + "type": "double", + "nullable": true, + "metadata": {} + }, + { + "name": "polyphenMax", + "type": "double", + "nullable": true, + "metadata": {} } ] - }, - "nullable": true, - "metadata": {} + } }, { "name": "vep", @@ -158,30 +204,6 @@ "type": "string", "nullable": true, "metadata": {} - }, - { - "name": "polyphenScore", - "type": "double", - "nullable": true, - "metadata": {} - }, - { - "name": "polyphenPrediction", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "siftScore", - "type": "double", - "nullable": true, - "metadata": {} - }, - { - "name": "siftPrediction", - "type": "string", - "nullable": true, - "metadata": {} } ] }, diff --git a/src/otg/assets/schemas/variant_index.json b/src/otg/assets/schemas/variant_index.json index e4f41caa7..c6a3702c9 100644 --- a/src/otg/assets/schemas/variant_index.json +++ b/src/otg/assets/schemas/variant_index.json @@ -76,26 +76,72 @@ "metadata": {} }, { - "name": "cadd", + "name": "inSilicoPredictors", + "nullable": false, + "metadata": {}, "type": { "type": "struct", "fields": [ { - "name": "phred", - "type": "float", + "name": "cadd", + "nullable": true, + "metadata": {}, + "type": { + "type": "struct", + "fields": [ + { + "name": "raw", + "type": "float", + "nullable": true, + "metadata": {} + }, + { + "name": "phred", + "type": "float", + "nullable": true, + "metadata": {} + } + ] + } + }, + { + "name": "revelMax", + "type": "double", "nullable": true, "metadata": {} }, { - "name": "raw", + "name": "spliceaiDsMax", "type": "float", "nullable": true, "metadata": {} + }, + { + "name": "pangolinLargestDs", + "type": "double", + "nullable": true, + "metadata": {} + }, + { + "name": "phylop", + "type": "double", + "nullable": true, + "metadata": {} + }, + { + "name": "siftMax", + "type": "double", + "nullable": true, + "metadata": {} + }, + { + "name": "polyphenMax", + "type": "double", + "nullable": true, + "metadata": {} } ] - }, - "nullable": true, - "metadata": {} + } }, { "name": "mostSevereConsequence", diff --git a/src/otg/cli.py b/src/otg/cli.py index 9c2faa05d..e30d587a6 100644 --- a/src/otg/cli.py +++ b/src/otg/cli.py @@ -3,27 +3,19 @@ import hydra from hydra.utils import instantiate -from omegaconf import OmegaConf +from omegaconf import DictConfig, OmegaConf -from otg.config import Config, register_configs -register_configs() - - -@hydra.main(version_base="1.1", config_path=None, config_name="config") -def main(cfg: Config) -> None: +@hydra.main(version_base="1.3", config_path=None, config_name="config") +def main(cfg: DictConfig) -> None: """OTG ETL CLI. Args: - cfg (Config): hydra configuration object + cfg (DictConfig): hydra configuration object """ - # Print config - print(OmegaConf.to_yaml(cfg)) - # Instantiate ETL session - session = instantiate(cfg.session) + print(OmegaConf.to_yaml(cfg)) # noqa: T201 # Initialise and run step - step = instantiate(cfg.step, session=session) - step.run() + instantiate(cfg.step) if __name__ == "__main__": diff --git a/src/otg/clump.py b/src/otg/clump.py new file mode 100644 index 000000000..6ace21076 --- /dev/null +++ b/src/otg/clump.py @@ -0,0 +1,73 @@ +"""Step to run clump associations from summary statistics or study locus.""" +from __future__ import annotations + +from dataclasses import dataclass, field + +from omegaconf import MISSING + +from otg.common.session import Session +from otg.dataset.ld_index import LDIndex +from otg.dataset.study_index import StudyIndex +from otg.dataset.study_locus import StudyLocus +from otg.dataset.summary_statistics import SummaryStatistics + + +@dataclass +class ClumpStep: + """Perform clumping of an association dataset to identify independent signals. + + Two types of clumping are supported and are applied based on the input dataset: + - Clumping of summary statistics based on a window-based approach. + - Clumping of study locus based on LD. + + Both approaches yield a StudyLocus dataset. + + Attributes: + session (Session): Session object. + input_path (str): Input path for the study locus or summary statistics files. + study_index_path (str): Path to study index. + ld_index_path (str): Path to LD index. + locus_collect_distance (int | None): The distance to collect locus around semi-indices. + clumped_study_locus_path (str): Output path for the clumped study locus dataset. + """ + + session: Session = MISSING + input_path: str = MISSING + clumped_study_locus_path: str = MISSING + study_index_path: str | None = field(default=None) + ld_index_path: str | None = field(default=None) + + locus_collect_distance: int | None = field(default=None) + + def __post_init__(self: ClumpStep) -> None: + """Run the clumping step. + + Raises: + ValueError: If study index and LD index paths are not provided for study locus. + """ + input_cols = self.session.spark.read.parquet( + self.input_path, recursiveFileLookup=True + ).columns + if "studyLocusId" in input_cols: + if self.study_index_path is None or self.ld_index_path is None: + raise ValueError( + "Study index and LD index paths are required for clumping study locus." + ) + study_locus = StudyLocus.from_parquet(self.session, self.input_path) + ld_index = LDIndex.from_parquet(self.session, self.ld_index_path) + study_index = StudyIndex.from_parquet(self.session, self.study_index_path) + + clumped_study_locus = study_locus.annotate_ld( + study_index=study_index, ld_index=ld_index + ).clump() + else: + sumstats = SummaryStatistics.from_parquet( + self.session, self.input_path, recursiveFileLookup=True + ).coalesce(4000) + clumped_study_locus = sumstats.window_based_clumping( + locus_collect_distance=self.locus_collect_distance + ) + + clumped_study_locus.df.write.mode(self.session.write_mode).parquet( + self.clumped_study_locus_path + ) diff --git a/src/otg/colocalisation.py b/src/otg/colocalisation.py index c5a35c717..4a0a7bacc 100644 --- a/src/otg/colocalisation.py +++ b/src/otg/colocalisation.py @@ -3,30 +3,45 @@ from dataclasses import dataclass +from omegaconf import MISSING + from otg.common.session import Session -from otg.config import ColocalisationStepConfig from otg.dataset.study_index import StudyIndex from otg.dataset.study_locus import CredibleInterval, StudyLocus from otg.method.colocalisation import Coloc, ECaviar @dataclass -class ColocalisationStep(ColocalisationStepConfig): +class ColocalisationStep: """Colocalisation step. This workflow runs colocalization analyses that assess the degree to which independent signals of the association share the same causal variant in a region of the genome, typically limited by linkage disequilibrium (LD). + + Attributes: + session (Session): Session object. + study_locus_path (DictConfig): Input Study-locus path. + coloc_path (DictConfig): Output Colocalisation path. + priorc1 (float): Prior on variant being causal for trait 1. + priorc2 (float): Prior on variant being causal for trait 2. + priorc12 (float): Prior on variant being causal for traits 1 and 2. """ - session: Session = Session() + session: Session = MISSING + study_locus_path: str = MISSING + study_index_path: str = MISSING + coloc_path: str = MISSING + priorc1: float = 1e-4 + priorc2: float = 1e-4 + priorc12: float = 1e-5 - def run(self: ColocalisationStep) -> None: - """Run colocalisation step.""" + def __post_init__(self: ColocalisationStep) -> None: + """Run step.""" # Study-locus information sl = StudyLocus.from_parquet(self.session, self.study_locus_path) si = StudyIndex.from_parquet(self.session, self.study_index_path) # Study-locus overlaps for 95% credible sets - sl_overlaps = sl.credible_set(CredibleInterval.IS95).overlaps(si) + sl_overlaps = sl.filter_credible_set(CredibleInterval.IS95).find_overlaps(si) coloc_results = Coloc.colocalise( sl_overlaps, self.priorc1, self.priorc2, self.priorc12 diff --git a/src/otg/common/Liftover.py b/src/otg/common/Liftover.py index 2b28783c6..e0ac577c9 100644 --- a/src/otg/common/Liftover.py +++ b/src/otg/common/Liftover.py @@ -1,10 +1,12 @@ """LiftOver support.""" from __future__ import annotations +import tempfile from typing import TYPE_CHECKING import pyspark.sql.functions as f import pyspark.sql.types as t +from google.cloud import storage from pyliftover import LiftOver if TYPE_CHECKING: @@ -24,22 +26,29 @@ class LiftOverSpark: - If regions are provided, the mapping is dropped if the new region is reversed (mapped_start > mapped_end). - If regions are provided, the mapping is dropped if the difference of the lenght of the mapped region and original is larger than a threshold. - When lifting over intervals, only unique coordinates are lifted, they joined back to the original dataframe. + + Args: + chain_file (str): Path to the chain file + max_difference (int): Maximum difference between the length of the mapped region and the original region. Defaults to 100. """ - def __init__( + def __init__( # noqa: D107 self: LiftOverSpark, chain_file: str, max_difference: int = 100 ) -> None: - """Intialise LiftOverSpark object. - - Args: - chain_file (str): Path to the chain file - max_difference (int): Maximum difference between the length of the mapped region and the original region. Defaults to 100. - """ self.chain_file = chain_file self.max_difference = max_difference - # Initializing liftover object by opening the chain file: - self.lo = LiftOver(chain_file) + # Initializing liftover object by opening the chain file - LiftOver only supports local files: + if chain_file.startswith("gs://"): + bucket_name = chain_file.split("/")[2] + blob_name = "/".join(chain_file.split("/")[3:]) + with tempfile.NamedTemporaryFile(delete=True) as temp_file: + storage.Client().bucket(bucket_name).blob( + blob_name + ).download_to_filename(temp_file.name) + self.lo = LiftOver(temp_file.name) + else: + self.lo = LiftOver(chain_file) # UDF to do map genomic coordinates to liftover coordinates: self.liftover_udf = f.udf( diff --git a/src/otg/common/schemas.py b/src/otg/common/schemas.py index c45d8b42c..11ea852f6 100644 --- a/src/otg/common/schemas.py +++ b/src/otg/common/schemas.py @@ -4,36 +4,37 @@ import importlib.resources as pkg_resources import json from collections import namedtuple +from typing import Any -from pyspark.sql.types import ArrayType, StructType +import pyspark.sql.types as t from otg.assets import schemas -def parse_spark_schema(schema_json: str) -> StructType: +def parse_spark_schema(schema_json: str) -> t.StructType: """Parse Spark schema from JSON. Args: schema_json (str): JSON filename containing spark schema in the schemas package Returns: - StructType: Spark schema + t.StructType: Spark schema """ core_schema = json.loads( pkg_resources.read_text(schemas, schema_json, encoding="utf-8") ) - return StructType.fromJson(core_schema) + return t.StructType.fromJson(core_schema) -def flatten_schema(schema: StructType, prefix: str = "") -> list: +def flatten_schema(schema: t.StructType, prefix: str = "") -> list[Any]: """It takes a Spark schema and returns a list of all fields in the schema once flattened. Args: - schema: The schema of the dataframe - prefix: The prefix to prepend to the field names. + schema (t.StructType): The schema of the dataframe + prefix (str): The prefix to prepend to the field names. Defaults to "". Returns: - list: A list of all the columns in the dataframe. + list[Any]: A list of all the columns in the dataframe. Examples: >>> from pyspark.sql.types import ArrayType, StringType, StructField, StructType @@ -52,11 +53,13 @@ def flatten_schema(schema: StructType, prefix: str = "") -> list: for field in schema.fields: name = f"{prefix}.{field.name}" if prefix else field.name dtype = field.dataType - if isinstance(dtype, StructType): - fields.append(Field(name, ArrayType(StructType()))) + if isinstance(dtype, t.StructType): + fields.append(Field(name, t.ArrayType(t.StructType()))) fields += flatten_schema(dtype, prefix=name) - elif isinstance(dtype, ArrayType) and isinstance(dtype.elementType, StructType): - fields.append(Field(name, ArrayType(StructType()))) + elif isinstance(dtype, t.ArrayType) and isinstance( + dtype.elementType, t.StructType + ): + fields.append(Field(name, t.ArrayType(t.StructType()))) fields += flatten_schema(dtype.elementType, prefix=name) else: fields.append(Field(name, dtype)) diff --git a/src/otg/common/session.py b/src/otg/common/session.py index c2ba59a6c..a985d4dcd 100644 --- a/src/otg/common/session.py +++ b/src/otg/common/session.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Dict +from typing import TYPE_CHECKING from pyspark.conf import SparkConf from pyspark.sql import SparkSession @@ -13,25 +13,51 @@ class Session: - """Spark session class.""" + """This class provides a Spark session and logger.""" - def __init__( + def __init__( # noqa: D107 self: Session, spark_uri: str = "local[*]", write_mode: str = "errorifexists", app_name: str = "otgenetics", hail_home: str | None = None, + start_hail: bool = False, + extended_spark_conf: dict[str, str] | None = None, ) -> None: """Initialises spark session and logger. Args: - spark_uri (str): spark uri - app_name (str): spark application name - write_mode (str): spark write mode - hail_home (str | None): path to hail installation + spark_uri (str): Spark URI. Defaults to "local[*]". + write_mode (str): Spark write mode. Defaults to "errorifexists". + app_name (str): Spark application name. Defaults to "otgenetics". + hail_home (str | None): Path to Hail installation. Defaults to None. + start_hail (bool): Whether to start Hail. Defaults to False. + extended_spark_conf (dict[str, str] | None): Extended Spark configuration. Defaults to None. """ - # create executors based on resources - default_spark_conf = ( + merged_conf = self._create_merged_config( + start_hail, hail_home, extended_spark_conf + ) + + self.spark = ( + SparkSession.builder.config(conf=merged_conf) + .master(spark_uri) + .appName(app_name) + .getOrCreate() + ) + self.logger = Log4j(self.spark) + + self.write_mode = write_mode + + self.hail_home = hail_home + self.start_hail = start_hail + + def _default_config(self: Session) -> SparkConf: + """Default spark configuration. + + Returns: + SparkConf: Default spark configuration. + """ + return ( SparkConf() # Dynamic allocation .set("spark.dynamicAllocation.enabled", "true") @@ -41,65 +67,94 @@ def __init__( "spark.shuffle.service.enabled", "true" ) # required for dynamic allocation ) - spark_config = ( - ( - default_spark_conf.set( - "spark.jars", - f"{hail_home}/backend/hail-all-spark.jar", - ) - .set( - "spark.driver.extraClassPath", - f"{hail_home}/backend/hail-all-spark.jar", - ) - .set("spark.executor.extraClassPath", "./hail-all-spark.jar") - .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") - .set("spark.kryo.registrator", "is.hail.kryo.HailKryoRegistrator") - .set("spark.sql.files.openCostInBytes", "50gb") - .set("spark.sql.files.maxPartitionBytes", "50gb") - # .set("spark.kryoserializer.buffer", "512m") + + def _hail_config( + self: Session, start_hail: bool, hail_home: str | None + ) -> SparkConf: + """Returns the Hail specific Spark configuration. + + Args: + start_hail (bool): Whether to start Hail. + hail_home (str | None): Path to Hail installation. + + Returns: + SparkConf: Hail specific Spark configuration. + + Raises: + ValueError: If Hail home is not specified but Hail is requested. + """ + if not start_hail: + return SparkConf() + if not hail_home: + raise ValueError("Hail home must be specified to start Hail.") + return ( + SparkConf() + .set("spark.jars", f"{hail_home}/backend/hail-all-spark.jar") + .set( + "spark.driver.extraClassPath", f"{hail_home}/backend/hail-all-spark.jar" ) - if hail_home is not None - else default_spark_conf + .set("spark.executor.extraClassPath", "./hail-all-spark.jar") + .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") + .set("spark.kryo.registrator", "is.hail.kryo.HailKryoRegistrator") ) - self.spark = ( - SparkSession.builder.config(conf=spark_config) - .master(spark_uri) - .appName(app_name) - .getOrCreate() + + def _create_merged_config( + self: Session, + start_hail: bool, + hail_home: str | None, + extended_spark_conf: dict[str, str] | None, + ) -> SparkConf: + """Merges the default, and optionally the Hail and extended configurations if provided. + + Args: + start_hail (bool): Whether to start Hail. + hail_home (str | None): Path to Hail installation. Defaults to None. + extended_spark_conf (dict[str, str] | None): Extended Spark configuration. + + Returns: + SparkConf: Merged Spark configuration. + """ + all_settings = ( + self._default_config().getAll() + + self._hail_config(start_hail, hail_home).getAll() ) - self.logger = Log4j(self.spark) - self.write_mode = write_mode + if extended_spark_conf: + all_settings += list(extended_spark_conf.items()) + return SparkConf().setAll(all_settings) def read_parquet( - self: Session, path: str, schema: StructType, **kwargs: Dict[str, Any] + self: Session, + path: str, + schema: StructType, + **kwargs: bool | float | int | str | None, ) -> DataFrame: """Reads parquet dataset with a provided schema. Args: path (str): parquet dataset path schema (StructType): Spark schema - **kwargs: Additional arguments to pass to spark.read.parquet + **kwargs (bool | float | int | str | None): Additional arguments to pass to spark.read.parquet Returns: DataFrame: Dataframe with provided schema """ - return self.spark.read.schema(schema).parquet(path, **kwargs, inferSchema=False) # type: ignore + return self.spark.read.schema(schema).parquet(path, **kwargs) class Log4j: """Log4j logger class.""" - def __init__(self: Log4j, spark: SparkSession) -> None: - """Initialise logger. + def __init__(self, spark: SparkSession) -> None: + """Log4j logger class. This class provides a wrapper around the Log4j logging system. Args: - spark (SparkSession): Available spark session + spark (SparkSession): The Spark session used to access Spark context and Log4j logging. """ # get spark app details with which to prefix all messages - log4j = spark.sparkContext._jvm.org.apache.log4j # type: ignore + log4j = spark.sparkContext._jvm.org.apache.log4j # type: ignore[assignment, unused-ignore] self.logger = log4j.Logger.getLogger(__name__) - log4j_logger = spark.sparkContext._jvm.org.apache.log4j # type: ignore + log4j_logger = spark.sparkContext._jvm.org.apache.log4j # type: ignore[assignment, unused-ignore] self.logger = log4j_logger.LogManager.getLogger(__name__) def error(self: Log4j, message: str) -> None: @@ -107,33 +162,21 @@ def error(self: Log4j, message: str) -> None: Args: message (str): Error message to write to log - - Returns: - _type_: None """ self.logger.error(message) - return None def warn(self: Log4j, message: str) -> None: """Log a warning. Args: message (str): Warning messsage to write to log - - Returns: - _type_: None """ - self.logger.warn(message) - return None + self.logger.warning(message) def info(self: Log4j, message: str) -> None: """Log information. Args: message (str): Information message to write to log - - Returns: - _type_: None """ self.logger.info(message) - return None diff --git a/src/otg/common/spark_helpers.py b/src/otg/common/spark_helpers.py index 0c6a28934..bd22d91c9 100644 --- a/src/otg/common/spark_helpers.py +++ b/src/otg/common/spark_helpers.py @@ -3,20 +3,98 @@ import re import sys -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any, Iterable, Optional import pyspark.sql.functions as f import pyspark.sql.types as t from pyspark.ml import Pipeline from pyspark.ml.feature import MinMaxScaler, VectorAssembler from pyspark.ml.functions import vector_to_array -from pyspark.sql import Window +from pyspark.sql import Row, Window +from pyspark.sql.types import FloatType from scipy.stats import norm if TYPE_CHECKING: from pyspark.sql import Column, DataFrame, WindowSpec +def convert_from_wide_to_long( + df: DataFrame, + id_vars: Iterable[str], + var_name: str, + value_name: str, + value_vars: Optional[Iterable[str]] = None, +) -> DataFrame: + """Converts a dataframe from wide to long format. + + Args: + df (DataFrame): Dataframe to melt + id_vars (Iterable[str]): List of fixed columns to keep + var_name (str): Name of the column containing the variable names + value_name (str): Name of the column containing the values + value_vars (Optional[Iterable[str]]): List of columns to melt. Defaults to None. + + Returns: + DataFrame: Melted dataframe + + Examples: + >>> df = spark.createDataFrame([("a", 1, 2)], ["id", "feature_1", "feature_2"]) + >>> convert_from_wide_to_long(df, ["id"], "feature", "value").show() + +---+---------+-----+ + | id| feature|value| + +---+---------+-----+ + | a|feature_1| 1.0| + | a|feature_2| 2.0| + +---+---------+-----+ + + """ + if not value_vars: + value_vars = [c for c in df.columns if c not in id_vars] + _vars_and_vals = f.array( + *( + f.struct( + f.lit(c).alias(var_name), f.col(c).cast(FloatType()).alias(value_name) + ) + for c in value_vars + ) + ) + + # Add to the DataFrame and explode to convert into rows + _tmp = df.withColumn("_vars_and_vals", f.explode(_vars_and_vals)) + + cols = list(id_vars) + [ + f.col("_vars_and_vals")[x].alias(x) for x in [var_name, value_name] + ] + return _tmp.select(*cols) + + +def convert_from_long_to_wide( + df: DataFrame, id_vars: list[str], var_name: str, value_name: str +) -> DataFrame: + """Converts a dataframe from long to wide format using Spark pivot built-in function. + + Args: + df (DataFrame): Dataframe to pivot + id_vars (list[str]): List of fixed columns to keep + var_name (str): Name of the column to pivot on + value_name (str): Name of the column containing the values + + Returns: + DataFrame: Pivoted dataframe + + Examples: + >>> df = spark.createDataFrame([("a", "feature_1", 1), ("a", "feature_2", 2)], ["id", "featureName", "featureValue"]) + >>> convert_from_long_to_wide(df, ["id"], "featureName", "featureValue").show() + +---+---------+---------+ + | id|feature_1|feature_2| + +---+---------+---------+ + | a| 1| 2| + +---+---------+---------+ + + """ + return df.groupBy(id_vars).pivot(var_name).agg(f.first(value_name)) + + def pvalue_to_zscore(pval_col: Column) -> Column: """Convert p-value column to z-score column. @@ -77,7 +155,15 @@ def nullify_empty_array(column: Column) -> Column: def get_top_ranked_in_window(df: DataFrame, w: WindowSpec) -> DataFrame: - """Returns the record with the top rank within each group of the window.""" + """Returns the record with the top rank within each group of the window. + + Args: + df (DataFrame): The DataFrame to be processed. + w (WindowSpec): The window to be used for ranking. + + Returns: + DataFrame: The DataFrame with the record with the top rank within each group of the window. + """ return ( df.withColumn("row_number", f.row_number().over(w)) .filter(f.col("row_number") == 1) @@ -94,7 +180,7 @@ def get_record_with_minimum_value( Args: df (DataFrame): The DataFrame to be processed. - grouping_col (str): The column name(s) to group the DataFrame by. + grouping_col (Column | str | list[Column | str]): The column(s) to group the DataFrame by. sorting_col (str): The column name to sort the DataFrame by. Returns: @@ -106,14 +192,14 @@ def get_record_with_minimum_value( def get_record_with_maximum_value( df: DataFrame, - grouping_col: Column | str | list[Column | str], + grouping_col: str | list[str], sorting_col: str, ) -> DataFrame: """Returns the record with the maximum value of the sorting column within each group of the grouping column. Args: df (DataFrame): The DataFrame to be processed. - grouping_col (str): The column name(s) to group the DataFrame by. + grouping_col (str | list[str]): The column(s) to group the DataFrame by. sorting_col (str): The column name to sort the DataFrame by. Returns: @@ -164,6 +250,38 @@ def normalise_column( ) +def neglog_pvalue_to_mantissa_and_exponent(p_value: Column) -> tuple[Column, Column]: + """Computing p-value mantissa and exponent based on the negative 10 based logarithm of the p-value. + + Args: + p_value (Column): Neg-log p-value (string) + + Returns: + tuple[Column, Column]: mantissa and exponent of the p-value + + Examples: + >>> ( + ... spark.createDataFrame([(4.56, 'a'),(2109.23, 'b')], ['negLogPv', 'label']) + ... .select('negLogPv',*neglog_pvalue_to_mantissa_and_exponent(f.col('negLogPv'))) + ... .show() + ... ) + +--------+------------------+--------------+ + |negLogPv| pValueMantissa|pValueExponent| + +--------+------------------+--------------+ + | 4.56| 3.63078054770101| -5| + | 2109.23|1.6982436524618154| -2110| + +--------+------------------+--------------+ + + """ + exponent: Column = f.ceil(p_value) + mantissa: Column = f.pow(f.lit(10), (p_value - exponent + f.lit(1))) + + return ( + mantissa.cast(t.DoubleType()).alias("pValueMantissa"), + (-1 * exponent).cast(t.IntegerType()).alias("pValueExponent"), + ) + + def calculate_neglog_pvalue( p_value_mantissa: Column, p_value_exponent: Column ) -> Column: @@ -231,7 +349,15 @@ def column2camel_case(col_name: str) -> str: def order_array_of_structs_by_field(column_name: str, field_name: str) -> Column: - """Sort a column of array of structs by a field in descending order, nulls last.""" + """Sort a column of array of structs by a field in descending order, nulls last. + + Args: + column_name (str): Column name + field_name (str): Field name + + Returns: + Column: Sorted column + """ return f.expr( f""" array_sort( @@ -245,3 +371,63 @@ def order_array_of_structs_by_field(column_name: str, field_name: str) -> Column end) """ ) + + +def pivot_df( + df: DataFrame, + pivot_col: str, + value_col: str, + grouping_cols: list[Column], +) -> DataFrame: + """Pivot a dataframe. + + Args: + df (DataFrame): Dataframe to pivot + pivot_col (str): Column to pivot on + value_col (str): Column to pivot + grouping_cols (list[Column]): Columns to group by + + Returns: + DataFrame: Pivoted dataframe + """ + pivot_values = df.select(pivot_col).distinct().rdd.flatMap(lambda x: x).collect() + return ( + df.groupBy(grouping_cols) + .pivot(pivot_col) + .agg({value_col: "first"}) + .select( + grouping_cols + + [ + f.when(f.col(x).isNull(), None) + .otherwise(f.col(x)) + .alias(f"{x}_{value_col}") + for x in pivot_values + ], + ) + ) + + +def get_value_from_row(row: Row, column: str) -> Any: + """Extract index value from a row if exists. + + Args: + row (Row): One row from a dataframe + column (str): column label we want to extract. + + Returns: + Any: value of the column in the row + + Raises: + ValueError: if the column is not in the row + + Examples: + >>> get_value_from_row(Row(geneName="AR", chromosome="X"), "chromosome") + 'X' + >>> get_value_from_row(Row(geneName="AR", chromosome="X"), "disease") + Traceback (most recent call last): + ... + ValueError: Column disease not found in row Row(geneName='AR', chromosome='X') + """ + if column not in row: + raise ValueError(f"Column {column} not found in row {row}") + return row[column] diff --git a/src/otg/common/utils.py b/src/otg/common/utils.py index d91cab45d..d05810670 100644 --- a/src/otg/common/utils.py +++ b/src/otg/common/utils.py @@ -3,7 +3,7 @@ import sys from math import floor, log10 -from typing import TYPE_CHECKING, List, Tuple +from typing import TYPE_CHECKING, Tuple import hail as hl from pyspark.sql import functions as f @@ -22,13 +22,11 @@ def parse_region(region: str) -> Tuple[str, int, int]: Args: region (str): Genomic region expected to follow chr##:#,###-#,### format or ##:####-#####. - Raises: - ValueError: If the end and start positions cannot be casted to integer or not all - three values value error is raised. - Returns: Tuple[str, int, int]: Chromosome, start position, end position + Raises: + ValueError: If the end and start positions cannot be casted to integer or not all three values value error is raised. Examples: >>> parse_region('chr6:28,510,120-33,480,577') @@ -63,7 +61,7 @@ def calculate_confidence_interval( pvalue_exponent: Column, beta: Column, standard_error: Column, -) -> tuple: +) -> tuple[Column, Column]: """Calculate the confidence interval for the effect based on the p-value and the effect size. If the standard error already available, don't re-calculate from p-value. @@ -75,7 +73,7 @@ def calculate_confidence_interval( standard_error (Column): standard error. Returns: - tuple: betaConfidenceIntervalLower (float), betaConfidenceIntervalUpper (float) + tuple[Column, Column]: betaConfidenceIntervalLower (float), betaConfidenceIntervalUpper (float) Examples: >>> df = spark.createDataFrame([ @@ -88,9 +86,9 @@ def calculate_confidence_interval( +---------------+---------------+----+--------------+---------------------------+---------------------------+ |pvalue_mantissa|pvalue_exponent|beta|standard_error|betaConfidenceIntervalLower|betaConfidenceIntervalUpper| +---------------+---------------+----+--------------+---------------------------+---------------------------+ - | 2.5| -10| 0.5| 0.2| 0.3| 0.7| - | 3.0| -5| 1.0| null| 0.7603910153486024| 1.2396089846513976| - | 1.5| -8|-0.2| 0.1| -0.30000000000000004| -0.1| + | 2.5| -10| 0.5| 0.2| 0.10799999999999998| 0.892| + | 3.0| -5| 1.0| null| 0.5303663900832607| 1.4696336099167393| + | 1.5| -8|-0.2| 0.1| -0.396| -0.00400000000000...| +---------------+---------------+----+--------------+---------------------------+---------------------------+ """ @@ -106,15 +104,20 @@ def calculate_confidence_interval( ).otherwise(standard_error) # Calculate upper and lower confidence interval: - ci_lower = (beta - standard_error).alias("betaConfidenceIntervalLower") - ci_upper = (beta + standard_error).alias("betaConfidenceIntervalUpper") + z_score_095 = 1.96 + ci_lower = (beta - z_score_095 * standard_error).alias( + "betaConfidenceIntervalLower" + ) + ci_upper = (beta + z_score_095 * standard_error).alias( + "betaConfidenceIntervalUpper" + ) return (ci_lower, ci_upper) def convert_odds_ratio_to_beta( beta: Column, odds_ratio: Column, standard_error: Column -) -> List[Column]: +) -> list[Column]: """Harmonizes effect and standard error to beta. Args: @@ -123,7 +126,7 @@ def convert_odds_ratio_to_beta( standard_error (Column): Standard error of the effect Returns: - tuple: beta, standard error + list[Column]: beta, standard error Examples: >>> df = spark.createDataFrame([{"beta": 0.1, "oddsRatio": 1.1, "standardError": 0.1}, {"beta": None, "oddsRatio": 1.1, "standardError": 0.1}, {"beta": 0.1, "oddsRatio": None, "standardError": 0.1}, {"beta": 0.1, "oddsRatio": 1.1, "standardError": None}]) @@ -154,15 +157,14 @@ def convert_odds_ratio_to_beta( return [beta, standard_error] -def parse_pvalue(pv: Column) -> List[Column]: +def parse_pvalue(pv: Column) -> list[Column]: """This function takes a p-value string and returns two columns mantissa (float), exponent (integer). Args: pv (Column): P-value as string Returns: - Column: p-value mantissa (float) - Column: p-value exponent (integer) + list[Column]: pValueMantissa (float), pValueExponent (integer) Examples: >>> d = [("0.01",),("4.2E-45",),("43.2E5",),("0",),("1",)] @@ -213,12 +215,12 @@ def convert_gnomad_position_to_ensembl( the position is unchanged. More info about the problem: https://www.biostars.org/p/84686/ Args: - position (Column): Column - reference (Column): The reference allele. - alternate (Column): The alternate allele + position (Column): Position of the variant in GnomAD's coordinates system. + reference (Column): The reference allele in GnomAD's coordinates system. + alternate (Column): The alternate allele in GnomAD's coordinates system. Returns: - The position of the variant in the Ensembl genome. + Column: The position of the variant in the Ensembl genome. Examples: >>> d = [(1, "A", "C"), (2, "AA", "C"), (3, "A", "AA")] @@ -277,6 +279,9 @@ def split_pvalue(pvalue: float) -> tuple[float, int]: Returns: tuple[float, int]: Tuple with mantissa and exponent + Raises: + ValueError: If p-value is not between 0 and 1 + Examples: >>> split_pvalue(0.00001234) (1.234, -5) @@ -318,5 +323,5 @@ def parse_efos(efo_uri: Column) -> Column: """ - colname = efo_uri._jc.toString() # type: ignore + colname = efo_uri._jc.toString() return f.array_sort(f.expr(f"regexp_extract_all(`{colname}`, '([A-Z]+_[0-9]+)')")) diff --git a/src/otg/config.py b/src/otg/config.py deleted file mode 100644 index 163a6bd34..000000000 --- a/src/otg/config.py +++ /dev/null @@ -1,322 +0,0 @@ -"""Config management for OTG.""" - -from __future__ import annotations - -from dataclasses import dataclass, field -from typing import Any, Dict, List, Optional - -from hydra.core.config_store import ConfigStore -from omegaconf import MISSING - - -@dataclass -class Config: - """Configuration for otg.""" - - defaults: List[Dict[str, str]] = field( - default_factory=lambda: [{"step": "???"}, {"session": "session_config"}] - ) - - step: Any = MISSING - session: Any = MISSING - - -@dataclass -class SessionConfig: - """ETL config.""" - - _target_: str = "otg.common.session.Session" - app_name: str = "otgenetics" - spark_uri: str = "local[*]" - write_mode: str = "overwrite" - hail_home: Optional[str] = None - - -@dataclass -class LDIndexStepConfig: - """LD matrix step requirements. - - Attributes: - ld_matrix_template (str): Template path for LD matrix from gnomAD. - ld_index_raw_template (str): Template path for the variant indices correspondance in the LD Matrix from gnomAD. - min_r2 (float): Minimum r2 to consider when considering variants within a window. - grch37_to_grch38_chain_path (str): Path to GRCh37 to GRCh38 chain file. - ld_populations (List[str]): List of population-specific LD matrices to process. - ld_index_out (str): Output LD index path. - """ - - _target_: str = "otg.ld_index.LDIndexStep" - ld_matrix_template: str = "gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.adj.ld.bm" - ld_index_raw_template: str = "gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.ld.variant_indices.ht" - min_r2: float = 0.5 - grch37_to_grch38_chain_path: str = ( - "gs://hail-common/references/grch37_to_grch38.over.chain.gz" - ) - ld_populations: List[str] = field( - default_factory=lambda: [ - "afr", # African-American - "amr", # American Admixed/Latino - "asj", # Ashkenazi Jewish - "eas", # East Asian - "fin", # Finnish - "nfe", # Non-Finnish European - "nwe", # Northwestern European - "seu", # Southeastern European - ] - ) - ld_index_out: str = MISSING - - -@dataclass -class VariantIndexStepConfig: - """Variant index step requirements. - - Attributes: - variant_annotation_path (str): Input variant annotation path. - study_locus_path (str): Input study-locus path. - variant_index_path (str): Output variant index path. - """ - - _target_: str = "otg.variant_index.VariantIndexStep" - variant_annotation_path: str = MISSING - study_locus_path: str = MISSING - variant_index_path: str = MISSING - - -@dataclass -class ColocalisationStepConfig: - """Colocalisation step requirements. - - Attributes: - study_locus_path (DictConfig): Input Study-locus path. - coloc_path (DictConfig): Output Colocalisation path. - priorc1 (float): Prior on variant being causal for trait 1. - priorc2 (float): Prior on variant being causal for trait 2. - priorc12 (float): Prior on variant being causal for traits 1 and 2. - """ - - _target_: str = "otg.colocalisation.ColocalisationStep" - study_locus_path: str = MISSING - study_index_path: str = MISSING - coloc_path: str = MISSING - priorc1: float = 1e-4 - priorc2: float = 1e-4 - priorc12: float = 1e-5 - - -@dataclass -class VariantAnnotationStepConfig: - """Variant annotation step requirements. - - Attributes: - gnomad_genomes (str): Path to gnomAD genomes hail table. - chain_38_to_37 (str): Path to GRCh38 to GRCh37 chain file. - variant_annotation_path (str): Output variant annotation path. - populations (List[str]): List of populations to include. - """ - - _target_: str = "otg.variant_annotation.VariantAnnotationStep" - gnomad_genomes: str = MISSING - chain_38_to_37: str = MISSING - variant_annotation_path: str = MISSING - populations: List[str] = field( - default_factory=lambda: [ - "afr", # African-American - "amr", # American Admixed/Latino - "ami", # Amish ancestry - "asj", # Ashkenazi Jewish - "eas", # East Asian - "fin", # Finnish - "nfe", # Non-Finnish European - "mid", # Middle Eastern - "sas", # South Asian - "oth", # Other - ] - ) - - -@dataclass -class V2GStepConfig: - """Variant to gene (V2G) step requirements. - - Attributes: - variant_index_path (str): Input variant index path. - variant_annotation_path (str): Input variant annotation path. - gene_index_path (str): Input gene index path. - vep_consequences_path (str): Input VEP consequences path. - lift_over_chain_file_path (str): Path to GRCh37 to GRCh38 chain file. - approved_biotypes (list[str]): List of approved biotypes. - anderson_path (str): Anderson intervals path. - javierre_path (str): Javierre intervals path. - jung_path (str): Jung intervals path. - thurnman_path (str): Thurnman intervals path. - liftover_max_length_difference (int): Maximum length difference for liftover. - max_distance (int): Maximum distance to consider. - output_path (str): Output V2G path. - """ - - _target_: str = "otg.v2g.V2GStep" - variant_index_path: str = MISSING - variant_annotation_path: str = MISSING - gene_index_path: str = MISSING - vep_consequences_path: str = MISSING - liftover_chain_file_path: str = MISSING - anderson_path: str = MISSING - javierre_path: str = MISSING - jung_path: str = MISSING - thurnman_path: str = MISSING - liftover_max_length_difference: int = 100 - max_distance: int = 500_000 - v2g_path: str = MISSING - approved_biotypes: List[str] = field( - default_factory=lambda: [ - "protein_coding", - "3prime_overlapping_ncRNA", - "antisense", - "bidirectional_promoter_lncRNA", - "IG_C_gene", - "IG_D_gene", - "IG_J_gene", - "IG_V_gene", - "lincRNA", - "macro_lncRNA", - "non_coding", - "sense_intronic", - "sense_overlapping", - ] - ) - - -@dataclass -class GWASCatalogStepConfig: - """GWAS Catalog step requirements. - - Attributes: - catalog_studies_file (str): Raw GWAS catalog studies file. - catalog_ancestry_file (str): Ancestry annotations file from GWAS Catalog. - catalog_sumstats_lut (str): GWAS Catalog summary statistics lookup table. - catalog_associations_file (str): Raw GWAS catalog associations file. - variant_annotation_path (str): Input variant annotation path. - ld_populations (list): List of populations to include. - min_r2 (float): Minimum r2 to consider when considering variants within a window. - catalog_studies_out (str): Output GWAS catalog studies path. - catalog_associations_out (str): Output GWAS catalog associations path. - """ - - _target_: str = "otg.gwas_catalog.GWASCatalogStep" - catalog_studies_file: str = MISSING - catalog_ancestry_file: str = MISSING - catalog_sumstats_lut: str = MISSING - catalog_associations_file: str = MISSING - variant_annotation_path: str = MISSING - ld_index_path: str = MISSING - min_r2: float = 0.5 - catalog_studies_out: str = MISSING - catalog_associations_out: str = MISSING - - -@dataclass -class StudyLocusOverlapStepConfig: - """StudyLocus overlaps index step requirements. - - Attributes: - study_locus_path (str): Input study-locus path. - study_index_path (str): Input study index path to extract the type of study. - overlaps_index_out (str): Output overlaps index path. - """ - - _target_: str = "otg.overlaps.OverlapsIndexStep" - study_locus_path: str = MISSING - study_index_path: str = MISSING - overlaps_index_out: str = MISSING - - -@dataclass -class GeneIndexStepConfig: - """Gene index step requirements. - - Attributes: - target_path (str): Open targets Platform target dataset path. - gene_index_path (str): Output gene index path. - """ - - _target_: str = "otg.gene_index.GeneIndexStep" - target_path: str = MISSING - gene_index_path: str = MISSING - - -@dataclass -class GWASCatalogSumstatsPreprocessConfig: - """GWAS Catalog Sumstats Preprocessing step requirements. - - Attributes: - raw_sumstats_path (str): Input raw GWAS Catalog summary statistics path. - out_sumstats_path (str): Output GWAS Catalog summary statistics path. - study_id (str): GWAS Catalog study identifier. - """ - - _target_: str = ( - "otg.gwas_catalog_sumstat_preprocess.GWASCatalogSumstatsPreprocessStep" - ) - raw_sumstats_path: str = MISSING - out_sumstats_path: str = MISSING - study_id: str = MISSING - - -@dataclass -class FinnGenStepConfig: - """FinnGen study table ingestion step requirements. - - Attributes: - finngen_phenotype_table_url (str): FinnGen API for fetching the list of studies. - finngen_release_prefix (str): Release prefix pattern. - finngen_sumstat_url_prefix (str): URL prefix for summary statistics location. - finngen_sumstat_url_suffix (str): URL prefix suffix for summary statistics location. - finngen_study_index_out (str): Output path for the FinnGen study index dataset. - finngen_summary_stats_out (str): Output path for the FinnGen summary statistics. - """ - - _target_: str = "otg.finngen.FinnGenStep" - finngen_phenotype_table_url: str = MISSING - finngen_release_prefix: str = MISSING - finngen_sumstat_url_prefix: str = MISSING - finngen_sumstat_url_suffix: str = MISSING - finngen_study_index_out: str = MISSING - finngen_summary_stats_out: str = MISSING - - -@dataclass -class UKBiobankStepConfig: - """UKBiobank study table ingestion step requirements. - - Attributes: - ukbiobank_manifest (str): UKBiobank manifest of studies. - ukbiobank_study_index_out (str): Output path for the UKBiobank study index dataset. - """ - - _target_: str = "otg.ukbiobank.UKBiobankStep" - ukbiobank_manifest: str = MISSING - ukbiobank_study_index_out: str = MISSING - - -# Register all configs -def register_configs() -> None: - """Register configs.""" - cs = ConfigStore.instance() - cs.store(name="config", node=Config) - cs.store(name="session_config", group="session", node=SessionConfig) - cs.store(name="gene_index", group="step", node=GeneIndexStepConfig) - cs.store(name="ld_index", group="step", node=LDIndexStepConfig) - cs.store(name="variant_index", group="step", node=VariantIndexStepConfig) - cs.store(name="variant_annotation", group="step", node=VariantAnnotationStepConfig) - cs.store(name="v2g", group="step", node=V2GStepConfig) - cs.store(name="colocalisation", group="step", node=ColocalisationStepConfig) - cs.store(name="gwas_catalog", group="step", node=GWASCatalogStepConfig) - cs.store(name="finngen", group="step", node=FinnGenStepConfig) - cs.store(name="ukbiobank", group="step", node=UKBiobankStepConfig) - cs.store( - name="gwas_catalog_sumstats_preprocess", - group="step", - node=GWASCatalogSumstatsPreprocessConfig, - ) - cs.store(name="study_locus_overlap", group="step", node=StudyLocusOverlapStepConfig) diff --git a/src/otg/dataset/colocalisation.py b/src/otg/dataset/colocalisation.py index c3c650885..b67b10374 100644 --- a/src/otg/dataset/colocalisation.py +++ b/src/otg/dataset/colocalisation.py @@ -1,4 +1,4 @@ -"""Variant index dataset.""" +"""Colocalisation dataset.""" from __future__ import annotations from dataclasses import dataclass @@ -17,5 +17,9 @@ class Colocalisation(Dataset): @classmethod def get_schema(cls: type[Colocalisation]) -> StructType: - """Provides the schema for the Colocalisation dataset.""" + """Provides the schema for the Colocalisation dataset. + + Returns: + StructType: Schema for the Colocalisation dataset + """ return parse_spark_schema("colocalisation.json") diff --git a/src/otg/dataset/dataset.py b/src/otg/dataset/dataset.py index ad92eb80b..0d04a2779 100644 --- a/src/otg/dataset/dataset.py +++ b/src/otg/dataset/dataset.py @@ -3,7 +3,9 @@ from abc import ABC, abstractmethod from dataclasses import dataclass -from typing import TYPE_CHECKING, Any, Dict +from typing import TYPE_CHECKING, Any + +from typing_extensions import Self from otg.common.schemas import flatten_schema @@ -18,7 +20,7 @@ class Dataset(ABC): """Open Targets Genetics Dataset. - `Dataset` is a wrapper around a Spark DataFrame with a predefined schema. Schemas for each child dataset are described in the `json.schemas` module. + `Dataset` is a wrapper around a Spark DataFrame with a predefined schema. Schemas for each child dataset are described in the `schemas` module. """ _df: DataFrame @@ -30,36 +32,69 @@ def __post_init__(self: Dataset) -> None: @property def df(self: Dataset) -> DataFrame: - """Dataframe included in the Dataset.""" + """Dataframe included in the Dataset. + + Returns: + DataFrame: Dataframe included in the Dataset + """ return self._df @df.setter def df(self: Dataset, new_df: DataFrame) -> None: # noqa: CCE001 - """Dataframe setter.""" + """Dataframe setter. + + Args: + new_df (DataFrame): New dataframe to be included in the Dataset + """ self._df: DataFrame = new_df self.validate_schema() @property def schema(self: Dataset) -> StructType: - """Dataframe expected schema.""" + """Dataframe expected schema. + + Returns: + StructType: Dataframe expected schema + """ return self._schema @classmethod @abstractmethod - def get_schema(cls: type[Dataset]) -> StructType: - """Abstract method to get the schema. Must be implemented by child classes.""" + def get_schema(cls: type[Self]) -> StructType: + """Abstract method to get the schema. Must be implemented by child classes. + + Returns: + StructType: Schema for the Dataset + """ pass @classmethod def from_parquet( - cls: type[Dataset], session: Session, path: str, **kwargs: Dict[str, Any] - ) -> Dataset: - """Reads a parquet file into a Dataset with a given schema.""" + cls: type[Self], + session: Session, + path: str, + **kwargs: bool | float | int | str | None, + ) -> Self: + """Reads a parquet file into a Dataset with a given schema. + + Args: + session (Session): Spark session + path (str): Path to the parquet file + **kwargs (bool | float | int | str | None): Additional arguments to pass to spark.read.parquet + + Returns: + Self: Dataset with the parquet file contents + + Raises: + ValueError: Parquet file is empty + """ schema = cls.get_schema() df = session.read_parquet(path=path, schema=schema, **kwargs) + if df.isEmpty(): + raise ValueError(f"Parquet file is empty: {path}") return cls(_df=df, _schema=schema) - def validate_schema(self: Dataset) -> None: # sourcery skip: invert-any-all + def validate_schema(self: Dataset) -> None: """Validate DataFrame schema against expected class schema. Raises: @@ -116,12 +151,50 @@ def validate_schema(self: Dataset) -> None: # sourcery skip: invert-any-all f"The following fields present differences in their datatypes: {fields_with_different_observed_datatype}." ) - def persist(self: Dataset) -> Dataset: - """Persist in memory the DataFrame included in the Dataset.""" + def persist(self: Self) -> Self: + """Persist in memory the DataFrame included in the Dataset. + + Returns: + Self: Persisted Dataset + """ self.df = self._df.persist() return self - def unpersist(self: Dataset) -> Dataset: - """Remove the persisted DataFrame from memory.""" + def unpersist(self: Self) -> Self: + """Remove the persisted DataFrame from memory. + + Returns: + Self: Unpersisted Dataset + """ self.df = self._df.unpersist() return self + + def coalesce(self: Self, num_partitions: int, **kwargs: Any) -> Self: + """Coalesce the DataFrame included in the Dataset. + + Coalescing is efficient for decreasing the number of partitions because it avoids a full shuffle of the data. + + Args: + num_partitions (int): Number of partitions to coalesce to + **kwargs (Any): Arguments to pass to the coalesce method + + Returns: + Self: Coalesced Dataset + """ + self.df = self._df.coalesce(num_partitions, **kwargs) + return self + + def repartition(self: Self, num_partitions: int, **kwargs: Any) -> Self: + """Repartition the DataFrame included in the Dataset. + + Repartitioning creates new partitions with data that is distributed evenly. + + Args: + num_partitions (int): Number of partitions to repartition to + **kwargs (Any): Arguments to pass to the repartition method + + Returns: + Self: Repartitioned Dataset + """ + self.df = self._df.repartition(num_partitions, **kwargs) + return self diff --git a/src/otg/dataset/gene_index.py b/src/otg/dataset/gene_index.py index 3b67560da..fd93d6506 100644 --- a/src/otg/dataset/gene_index.py +++ b/src/otg/dataset/gene_index.py @@ -23,14 +23,18 @@ class GeneIndex(Dataset): @classmethod def get_schema(cls: type[GeneIndex]) -> StructType: - """Provides the schema for the GeneIndex dataset.""" + """Provides the schema for the GeneIndex dataset. + + Returns: + StructType: Schema for the GeneIndex dataset + """ return parse_spark_schema("gene_index.json") - def filter_by_biotypes(self: GeneIndex, biotypes: list) -> GeneIndex: + def filter_by_biotypes(self: GeneIndex, biotypes: list[str]) -> GeneIndex: """Filter by approved biotypes. Args: - biotypes (list): List of Ensembl biotypes to keep. + biotypes (list[str]): List of Ensembl biotypes to keep. Returns: GeneIndex: Gene index dataset filtered by biotypes. @@ -64,7 +68,7 @@ def symbols_lut(self: GeneIndex) -> DataFrame: """ return self.df.select( f.explode( - f.array_union(f.array("approvedSymbol"), f.col("obsoleteSymbols.label")) + f.array_union(f.array("approvedSymbol"), f.col("obsoleteSymbols")) ).alias("geneSymbol"), "*", ) diff --git a/src/otg/dataset/intervals.py b/src/otg/dataset/intervals.py index 526650569..4b2844adc 100644 --- a/src/otg/dataset/intervals.py +++ b/src/otg/dataset/intervals.py @@ -6,11 +6,14 @@ import pyspark.sql.functions as f +from otg.common.Liftover import LiftOverSpark from otg.common.schemas import parse_spark_schema from otg.dataset.dataset import Dataset +from otg.dataset.gene_index import GeneIndex from otg.dataset.v2g import V2G if TYPE_CHECKING: + from pyspark.sql import SparkSession from pyspark.sql.types import StructType from otg.dataset.variant_index import VariantIndex @@ -22,9 +25,56 @@ class Intervals(Dataset): @classmethod def get_schema(cls: type[Intervals]) -> StructType: - """Provides the schema for the Intervals dataset.""" + """Provides the schema for the Intervals dataset. + + Returns: + StructType: Schema for the Intervals dataset + """ return parse_spark_schema("intervals.json") + @classmethod + def from_source( + cls: type[Intervals], + spark: SparkSession, + source_name: str, + source_path: str, + gene_index: GeneIndex, + lift: LiftOverSpark, + ) -> Intervals: + """Collect interval data for a particular source. + + Args: + spark (SparkSession): Spark session + source_name (str): Name of the interval source + source_path (str): Path to the interval source file + gene_index (GeneIndex): Gene index + lift (LiftOverSpark): LiftOverSpark instance to convert coordinats from hg37 to hg38 + + Returns: + Intervals: Intervals dataset + + Raises: + ValueError: If the source name is not recognised + """ + from otg.datasource.intervals.andersson import IntervalsAndersson + from otg.datasource.intervals.javierre import IntervalsJavierre + from otg.datasource.intervals.jung import IntervalsJung + from otg.datasource.intervals.thurman import IntervalsThurman + + source_to_class = { + "andersson": IntervalsAndersson, + "javierre": IntervalsJavierre, + "jung": IntervalsJung, + "thurman": IntervalsThurman, + } + + if source_name not in source_to_class: + raise ValueError(f"Unknown interval source: {source_name}") + + source_class = source_to_class[source_name] + data = source_class.read(spark, source_path) # type: ignore + return source_class.parse(data, gene_index, lift) # type: ignore + def v2g(self: Intervals, variant_index: VariantIndex) -> V2G: """Convert intervals into V2G by intersecting with a variant index. @@ -36,7 +86,6 @@ def v2g(self: Intervals, variant_index: VariantIndex) -> V2G: """ return V2G( _df=( - # TODO: We can include the start and end position as part of the `on` clause in the join self.df.alias("interval") .join( variant_index.df.selectExpr( @@ -50,7 +99,7 @@ def v2g(self: Intervals, variant_index: VariantIndex) -> V2G: ], how="inner", ) - .drop("start", "end", "vi_chromosome") + .drop("start", "end", "vi_chromosome", "position") ), _schema=V2G.get_schema(), ) diff --git a/src/otg/dataset/l2g_feature.py b/src/otg/dataset/l2g_feature.py new file mode 100644 index 000000000..44d6dddd5 --- /dev/null +++ b/src/otg/dataset/l2g_feature.py @@ -0,0 +1,25 @@ +"""L2G Feature Dataset.""" +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING + +from otg.common.schemas import parse_spark_schema +from otg.dataset.dataset import Dataset + +if TYPE_CHECKING: + from pyspark.sql.types import StructType + + +@dataclass +class L2GFeature(Dataset): + """Locus-to-gene feature dataset.""" + + @classmethod + def get_schema(cls: type[L2GFeature]) -> StructType: + """Provides the schema for the L2GFeature dataset. + + Returns: + StructType: Schema for the L2GFeature dataset + """ + return parse_spark_schema("l2g_feature.json") diff --git a/src/otg/dataset/l2g_feature_matrix.py b/src/otg/dataset/l2g_feature_matrix.py new file mode 100644 index 000000000..7952a1b37 --- /dev/null +++ b/src/otg/dataset/l2g_feature_matrix.py @@ -0,0 +1,170 @@ +"""Feature matrix of study locus pairs annotated with their functional genomics features.""" +from __future__ import annotations + +from dataclasses import dataclass +from functools import reduce +from typing import TYPE_CHECKING, Type + +from otg.common.schemas import parse_spark_schema +from otg.common.spark_helpers import convert_from_long_to_wide +from otg.dataset.dataset import Dataset +from otg.method.l2g.feature_factory import StudyLocusFactory + +if TYPE_CHECKING: + from pyspark.sql.types import StructType + + # from otg.dataset.colocalisation import Colocalisation + from otg.dataset.study_index import StudyIndex + from otg.dataset.study_locus import StudyLocus + from otg.dataset.v2g import V2G + + +@dataclass +class L2GFeatureMatrix(Dataset): + """Dataset with features for Locus to Gene prediction. + + Attributes: + features_list (list[str] | None): List of features to use. If None, all possible features are used. + """ + + features_list: list[str] | None = None + + def __post_init__(self: L2GFeatureMatrix) -> None: + """Post-initialisation to set the features list. If not provided, all columns except the fixed ones are used.""" + fixed_cols = ["studyLocusId", "geneId", "goldStandardSet"] + self.features_list = self.features_list or [ + col for col in self._df.columns if col not in fixed_cols + ] + + @classmethod + def generate_features( + cls: Type[L2GFeatureMatrix], + features_list: list[str], + study_locus: StudyLocus, + study_index: StudyIndex, + variant_gene: V2G, + # colocalisation: Colocalisation, + ) -> L2GFeatureMatrix: + """Generate features from the OTG datasets. + + Args: + features_list (list[str]): List of features to generate + study_locus (StudyLocus): Study locus dataset + study_index (StudyIndex): Study index dataset + variant_gene (V2G): Variant to gene dataset + + Returns: + L2GFeatureMatrix: L2G feature matrix dataset + + Raises: + ValueError: If the feature matrix is empty + """ + if features_dfs := [ + # Extract features + # ColocalisationFactory._get_coloc_features( + # study_locus, study_index, colocalisation + # ).df, + StudyLocusFactory._get_tss_distance_features(study_locus, variant_gene).df, + StudyLocusFactory._get_vep_features(study_locus, variant_gene).df, + ]: + fm = reduce( + lambda x, y: x.unionByName(y), + features_dfs, + ) + else: + raise ValueError("No features found") + + # raise error if the feature matrix is empty + if fm.limit(1).count() != 0: + return cls( + _df=convert_from_long_to_wide( + fm, ["studyLocusId", "geneId"], "featureName", "featureValue" + ), + _schema=cls.get_schema(), + features_list=features_list, + ) + raise ValueError("L2G Feature matrix is empty") + + @classmethod + def get_schema(cls: type[L2GFeatureMatrix]) -> StructType: + """Provides the schema for the L2gFeatureMatrix dataset. + + Returns: + StructType: Schema for the L2gFeatureMatrix dataset + """ + return parse_spark_schema("l2g_feature_matrix.json") + + def calculate_feature_missingness_rate( + self: L2GFeatureMatrix, + ) -> dict[str, float]: + """Calculate the proportion of missing values in each feature. + + Returns: + dict[str, float]: Dictionary of feature names and their missingness rate. + + Raises: + ValueError: If no features are found. + """ + total_count = self._df.count() + if not self.features_list: + raise ValueError("No features found") + + return { + feature: ( + self._df.filter( + (self._df[feature].isNull()) | (self._df[feature] == 0) + ).count() + / total_count + ) + for feature in self.features_list + } + + def fill_na( + self: L2GFeatureMatrix, value: float = 0.0, subset: list[str] | None = None + ) -> L2GFeatureMatrix: + """Fill missing values in a column with a given value. + + Args: + value (float): Value to replace missing values with. Defaults to 0.0. + subset (list[str] | None): Subset of columns to consider. Defaults to None. + + Returns: + L2GFeatureMatrix: L2G feature matrix dataset + """ + self.df = self._df.fillna(value, subset=subset) + return self + + def select_features( + self: L2GFeatureMatrix, features_list: list[str] | None + ) -> L2GFeatureMatrix: + """Select a subset of features from the feature matrix. + + Args: + features_list (list[str] | None): List of features to select + + Returns: + L2GFeatureMatrix: L2G feature matrix dataset + """ + features_list = features_list or self.features_list + fixed_cols = ["studyLocusId", "geneId", "goldStandardSet"] + self.df = self._df.select(fixed_cols + features_list) # type: ignore + return self + + def train_test_split( + self: L2GFeatureMatrix, fraction: float + ) -> tuple[L2GFeatureMatrix, L2GFeatureMatrix]: + """Split the dataset into training and test sets. + + Args: + fraction (float): Fraction of the dataset to use for training + + Returns: + tuple[L2GFeatureMatrix, L2GFeatureMatrix]: Training and test datasets + """ + train, test = self._df.randomSplit([fraction, 1 - fraction], seed=42) + return ( + L2GFeatureMatrix( + _df=train, _schema=L2GFeatureMatrix.get_schema() + ).persist(), + L2GFeatureMatrix(_df=test, _schema=L2GFeatureMatrix.get_schema()).persist(), + ) diff --git a/src/otg/dataset/l2g_gold_standard.py b/src/otg/dataset/l2g_gold_standard.py new file mode 100644 index 000000000..27d7321f3 --- /dev/null +++ b/src/otg/dataset/l2g_gold_standard.py @@ -0,0 +1,199 @@ +"""L2G gold standard dataset.""" +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING, Type + +import pyspark.sql.functions as f +from pyspark.sql import Window + +from otg.common.schemas import parse_spark_schema +from otg.common.spark_helpers import get_record_with_maximum_value +from otg.dataset.dataset import Dataset + +if TYPE_CHECKING: + from pyspark.sql import DataFrame + from pyspark.sql.types import StructType + + from otg.dataset.study_locus_overlap import StudyLocusOverlap + from otg.dataset.v2g import V2G + + +@dataclass +class L2GGoldStandard(Dataset): + """L2G gold standard dataset.""" + + INTERACTION_THRESHOLD = 0.7 + GS_POSITIVE_LABEL = "positive" + GS_NEGATIVE_LABEL = "negative" + + @classmethod + def from_otg_curation( + cls: type[L2GGoldStandard], + gold_standard_curation: DataFrame, + v2g: V2G, + study_locus_overlap: StudyLocusOverlap, + interactions: DataFrame, + ) -> L2GGoldStandard: + """Initialise L2GGoldStandard from source dataset. + + Args: + gold_standard_curation (DataFrame): Gold standard curation dataframe, extracted from + v2g (V2G): Variant to gene dataset to bring distance between a variant and a gene's TSS + study_locus_overlap (StudyLocusOverlap): Study locus overlap dataset to remove duplicated loci + interactions (DataFrame): Gene-gene interactions dataset to remove negative cases where the gene interacts with a positive gene + + Returns: + L2GGoldStandard: L2G Gold Standard dataset + """ + from otg.datasource.open_targets.l2g_gold_standard import ( + OpenTargetsL2GGoldStandard, + ) + + interactions_df = cls.process_gene_interactions(interactions) + + return ( + OpenTargetsL2GGoldStandard.as_l2g_gold_standard(gold_standard_curation, v2g) + # .filter_unique_associations(study_locus_overlap) + .remove_false_negatives(interactions_df) + ) + + @classmethod + def get_schema(cls: type[L2GGoldStandard]) -> StructType: + """Provides the schema for the L2GGoldStandard dataset. + + Returns: + StructType: Spark schema for the L2GGoldStandard dataset + """ + return parse_spark_schema("l2g_gold_standard.json") + + @classmethod + def process_gene_interactions( + cls: Type[L2GGoldStandard], interactions: DataFrame + ) -> DataFrame: + """Extract top scoring gene-gene interaction from the interactions dataset of the Platform. + + Args: + interactions (DataFrame): Gene-gene interactions dataset from the Open Targets Platform + + Returns: + DataFrame: Top scoring gene-gene interaction per pair of genes + + Examples: + >>> interactions = spark.createDataFrame([("gene1", "gene2", 0.8), ("gene1", "gene2", 0.5), ("gene2", "gene3", 0.7)], ["targetA", "targetB", "scoring"]) + >>> L2GGoldStandard.process_gene_interactions(interactions).show() + +-------+-------+-----+ + |geneIdA|geneIdB|score| + +-------+-------+-----+ + | gene1| gene2| 0.8| + | gene2| gene3| 0.7| + +-------+-------+-----+ + + """ + return get_record_with_maximum_value( + interactions, + ["targetA", "targetB"], + "scoring", + ).selectExpr( + "targetA as geneIdA", + "targetB as geneIdB", + "scoring as score", + ) + + def filter_unique_associations( + self: L2GGoldStandard, + study_locus_overlap: StudyLocusOverlap, + ) -> L2GGoldStandard: + """Refines the gold standard to filter out loci that are not independent. + + Rules: + - If two loci point to the same gene, one positive and one negative, and have overlapping variants, we keep the positive one. + - If two loci point to the same gene, both positive or negative, and have overlapping variants, we drop one. + - If two loci point to different genes, and have overlapping variants, we keep both. + + Args: + study_locus_overlap (StudyLocusOverlap): A dataset detailing variants that overlap between StudyLocus. + + Returns: + L2GGoldStandard: L2GGoldStandard updated to exclude false negatives and redundant positives. + """ + squared_overlaps = study_locus_overlap._convert_to_square_matrix() + unique_associations = ( + self.df.alias("left") + # identify all the study loci that point to the same gene + .withColumn( + "sl_same_gene", + f.collect_set("studyLocusId").over(Window.partitionBy("geneId")), + ) + # identify all the study loci that have an overlapping variant + .join( + squared_overlaps.df.alias("right"), + (f.col("left.studyLocusId") == f.col("right.leftStudyLocusId")) + & (f.col("left.variantId") == f.col("right.tagVariantId")), + "left", + ) + .withColumn( + "overlaps", + f.when(f.col("right.tagVariantId").isNotNull(), f.lit(True)).otherwise( + f.lit(False) + ), + ) + # drop redundant rows: where the variantid overlaps and the gene is "explained" by more than one study locus + .filter(~((f.size("sl_same_gene") > 1) & (f.col("overlaps") == 1))) + .select(*self.df.columns) + ) + return L2GGoldStandard(_df=unique_associations, _schema=self.get_schema()) + + def remove_false_negatives( + self: L2GGoldStandard, + interactions_df: DataFrame, + ) -> L2GGoldStandard: + """Refines the gold standard to remove negative gold standard instances where the gene interacts with a positive gene. + + Args: + interactions_df (DataFrame): Top scoring gene-gene interaction per pair of genes + + Returns: + L2GGoldStandard: A refined set of locus-to-gene associations with increased reliability, having excluded loci that were likely false negatives due to gene-gene interaction confounding. + """ + squared_interactions = interactions_df.unionByName( + interactions_df.selectExpr( + "geneIdB as geneIdA", "geneIdA as geneIdB", "score" + ) + ).filter(f.col("score") > self.INTERACTION_THRESHOLD) + df = ( + self.df.alias("left") + .join( + # bring gene partners + squared_interactions.alias("right"), + f.col("left.geneId") == f.col("right.geneIdA"), + "left", + ) + .withColumnRenamed("geneIdB", "interactorGeneId") + .join( + # bring gold standard status for gene partners + self.df.selectExpr( + "geneId as interactorGeneId", + "goldStandardSet as interactorGeneIdGoldStandardSet", + ), + "interactorGeneId", + "left", + ) + # remove self-interactions + .filter( + (f.col("geneId") != f.col("interactorGeneId")) + | (f.col("interactorGeneId").isNull()) + ) + # remove false negatives + .filter( + # drop rows where the GS gene is negative but the interactor is a GS positive + ~(f.col("goldStandardSet") == "negative") + & (f.col("interactorGeneIdGoldStandardSet") == "positive") + | + # keep rows where the gene does not interact + (f.col("interactorGeneId").isNull()) + ) + .select(*self.df.columns) + .distinct() + ) + return L2GGoldStandard(_df=df, _schema=self.get_schema()) diff --git a/src/otg/dataset/l2g_prediction.py b/src/otg/dataset/l2g_prediction.py new file mode 100644 index 000000000..67e522756 --- /dev/null +++ b/src/otg/dataset/l2g_prediction.py @@ -0,0 +1,89 @@ +"""Dataset that contains the Locus to Gene predictions.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING, Type + +import pyspark.sql.functions as f +from pyspark.ml.functions import vector_to_array + +from otg.common.schemas import parse_spark_schema + +# from otg.dataset.colocalisation import Colocalisation +from otg.dataset.dataset import Dataset +from otg.dataset.l2g_feature_matrix import L2GFeatureMatrix +from otg.dataset.study_index import StudyIndex +from otg.dataset.study_locus import StudyLocus +from otg.dataset.v2g import V2G +from otg.method.l2g.model import LocusToGeneModel + +if TYPE_CHECKING: + from pyspark.sql.types import StructType + + +@dataclass +class L2GPrediction(Dataset): + """Dataset that contains the Locus to Gene predictions. + + It is the result of applying the L2G model on a feature matrix, which contains all + the study/locus pairs and their functional annotations. The score column informs the + confidence of the prediction that a gene is causal to an association. + """ + + @classmethod + def get_schema(cls: type[L2GPrediction]) -> StructType: + """Provides the schema for the L2GPrediction dataset. + + Returns: + StructType: Schema for the L2GPrediction dataset + """ + return parse_spark_schema("l2g_predictions.json") + + @classmethod + def from_credible_set( + cls: Type[L2GPrediction], + model_path: str, + features_list: list[str], + study_locus: StudyLocus, + study_index: StudyIndex, + v2g: V2G, + # coloc: Colocalisation, + ) -> L2GPrediction: + """Initialise L2G from feature matrix. + + Args: + model_path (str): Path to the fitted model + features_list (list[str]): List of features to use for the model + study_locus (StudyLocus): Study locus dataset + study_index (StudyIndex): Study index dataset + v2g (V2G): Variant to gene dataset + + Returns: + L2GPrediction: L2G dataset + """ + fm = L2GFeatureMatrix.generate_features( + features_list=features_list, + study_locus=study_locus, + study_index=study_index, + variant_gene=v2g, + # colocalisation=coloc, + ).fill_na() + return L2GPrediction( + # Load and apply fitted model + _df=( + LocusToGeneModel.load_from_disk( + model_path, + features_list=features_list, + ) + .predict(fm) + # the probability of the positive class is the second element inside the probability array + # - this is selected as the L2G probability + .select( + "studyLocusId", + "geneId", + vector_to_array(f.col("probability"))[1].alias("score"), + ) + ), + _schema=cls.get_schema(), + ) diff --git a/src/otg/dataset/ld_index.py b/src/otg/dataset/ld_index.py index 477d6ccc3..ff43662e0 100644 --- a/src/otg/dataset/ld_index.py +++ b/src/otg/dataset/ld_index.py @@ -17,5 +17,9 @@ class LDIndex(Dataset): @classmethod def get_schema(cls: type[LDIndex]) -> StructType: - """Provides the schema for the LDIndex dataset.""" + """Provides the schema for the LDIndex dataset. + + Returns: + StructType: Schema for the LDIndex dataset + """ return parse_spark_schema("ld_index.json") diff --git a/src/otg/dataset/study_index.py b/src/otg/dataset/study_index.py index 9af6d075a..f928e84b5 100644 --- a/src/otg/dataset/study_index.py +++ b/src/otg/dataset/study_index.py @@ -1,4 +1,4 @@ -"""Variant index dataset.""" +"""Study index dataset.""" from __future__ import annotations import importlib.resources as pkg_resources @@ -35,7 +35,7 @@ def _aggregate_samples_by_ancestry(merged: Column, ancestry: Column) -> Column: sample. (a struct) Returns: - the modified "merged" column after aggregating the samples by ancestry. + Column: the modified "merged" column after aggregating the samples by ancestry. """ # Iterating over the list of ancestries and adding the sample size if label matches: return f.transform( @@ -79,7 +79,11 @@ def _map_ancestries_to_ld_population(gwas_ancestry_label: Column) -> Column: @classmethod def get_schema(cls: type[StudyIndex]) -> StructType: - """Provide the schema for the StudyIndex dataset.""" + """Provide the schema for the StudyIndex dataset. + + Returns: + StructType: The schema of the StudyIndex dataset. + """ return parse_spark_schema("study_index.json") @classmethod @@ -92,7 +96,7 @@ def aggregate_and_map_ancestries( discovery_samples (Column): A list of struct column. Has an `ancestry` column and a `sampleSize` columns Returns: - A list of struct with mapped LD population and their relative sample size. + Column: A list of struct with mapped LD population and their relative sample size. """ # Map ancestry categories to population labels of the LD index: mapped_ancestries = f.transform( diff --git a/src/otg/dataset/study_locus.py b/src/otg/dataset/study_locus.py index 8969a0391..d84f40e55 100644 --- a/src/otg/dataset/study_locus.py +++ b/src/otg/dataset/study_locus.py @@ -1,4 +1,4 @@ -"""Variant index dataset.""" +"""Study locus dataset.""" from __future__ import annotations from dataclasses import dataclass @@ -20,6 +20,7 @@ from pyspark.sql import Column, DataFrame from pyspark.sql.types import StructType + from otg.dataset.ld_index import LDIndex from otg.dataset.study_index import StudyIndex @@ -36,6 +37,7 @@ class StudyLocusQualityCheck(Enum): AMBIGUOUS_STUDY (str): Association with ambiguous study UNRESOLVED_LD (str): Variant not found in LD reference LD_CLUMPED (str): Explained by a more significant variant in high LD (clumped) + UNPICSABLE (str): Unable to calculate PIPs with the provided data """ SUBSIGNIFICANT_FLAG = "Subsignificant p-value" @@ -48,6 +50,7 @@ class StudyLocusQualityCheck(Enum): UNRESOLVED_LD = "Variant not found in LD reference" LD_CLUMPED = "Explained by a more significant variant in high LD (clumped)" NO_POPULATION = "Study does not have population annotation to resolve LD" + NOT_QUALIFYING_LD_BLOCK = "LD block does not contain variants at the required R^2 threshold" class CredibleInterval(Enum): @@ -117,7 +120,7 @@ def _align_overlapping_tags( Args: loci_to_overlap (DataFrame): containing `studyLocusId`, `studyType`, `chromosome`, `tagVariantId`, `logABF` and `posteriorProbability` columns. - peak_overlaps (DataFrame): containing `left_studyLocusId`, `right_studyLocusId` and `chromosome` columns. + peak_overlaps (DataFrame): containing `leftStudyLocusId`, `rightStudyLocusId` and `chromosome` columns. Returns: StudyLocusOverlap: Pairs of overlapping study-locus with aligned tags. @@ -170,7 +173,7 @@ def _align_overlapping_tags( ) @staticmethod - def _update_quality_flag( + def update_quality_flag( qc: Column, flag_condition: Column, flag_text: StudyLocusQualityCheck ) -> Column: """Update the provided quality control list with a new flag if condition is met. @@ -202,20 +205,25 @@ def assign_study_locus_id(study_id_col: Column, variant_id_col: Column) -> Colum Examples: >>> df = spark.createDataFrame([("GCST000001", "1_1000_A_C"), ("GCST000002", "1_1000_A_C")]).toDF("studyId", "variantId") - >>> df.withColumn("study_locus_id", StudyLocus.assign_study_locus_id(*[f.col("variantId"), f.col("studyId")])).show() - +----------+----------+--------------------+ - | studyId| variantId| study_locus_id| - +----------+----------+--------------------+ - |GCST000001|1_1000_A_C| 7437284926964690765| - |GCST000002|1_1000_A_C|-7653912547667845377| - +----------+----------+--------------------+ + >>> df.withColumn("study_locus_id", StudyLocus.assign_study_locus_id(f.col("studyId"), f.col("variantId"))).show() + +----------+----------+-------------------+ + | studyId| variantId| study_locus_id| + +----------+----------+-------------------+ + |GCST000001|1_1000_A_C|1553357789130151995| + |GCST000002|1_1000_A_C|-415050894682709184| + +----------+----------+-------------------+ """ - return f.xxhash64(*[study_id_col, variant_id_col]).alias("studyLocusId") + variant_id_col = f.coalesce(variant_id_col, f.rand().cast("string")) + return f.xxhash64(study_id_col, variant_id_col).alias("studyLocusId") @classmethod def get_schema(cls: type[StudyLocus]) -> StructType: - """Provides the schema for the StudyLocus dataset.""" + """Provides the schema for the StudyLocus dataset. + + Returns: + StructType: schema for the StudyLocus dataset. + """ return parse_spark_schema("study_locus.json") def filter_credible_set( @@ -232,7 +240,10 @@ def filter_credible_set( """ self.df = self._df.withColumn( "locus", - f.expr(f"filter(locus, tag -> (tag.{credible_interval.value}))"), + f.filter( + f.col("locus"), + lambda tag: (tag[credible_interval.value]), + ), ) return self @@ -271,25 +282,25 @@ def find_overlaps(self: StudyLocus, study_index: StudyIndex) -> StudyLocusOverla # study-locus overlap by aligning overlapping variants return self._align_overlapping_tags(loci_to_overlap, peak_overlaps) - def unique_lead_tag_variants(self: StudyLocus) -> DataFrame: - """All unique lead and tag variants contained in the `StudyLocus` dataframe. + def unique_variants_in_locus(self: StudyLocus) -> DataFrame: + """All unique variants collected in a `StudyLocus` dataframe. Returns: DataFrame: A dataframe containing `variantId` and `chromosome` columns. """ - lead_tags = ( - self.df.select( - f.col("variantId"), - f.col("chromosome"), - f.explode("ldSet.tagVariantId").alias("tagVariantId"), - ) - .repartition("chromosome") - .persist() - ) return ( - lead_tags.select("variantId", "chromosome") - .union( - lead_tags.select(f.col("tagVariantId").alias("variantId"), "chromosome") + self.df.withColumn( + "variantId", + # Joint array of variants in that studylocus. Locus can be null + f.explode( + f.array_union( + f.array(f.col("variantId")), + f.coalesce(f.col("locus.variantId"), f.array()), + ) + ), + ) + .select( + "variantId", f.split(f.col("variantId"), "_")[0].alias("chromosome") ) .distinct() ) @@ -314,6 +325,9 @@ def annotate_credible_sets(self: StudyLocus) -> StudyLocus: Returns: StudyLocus: including annotation on `is95CredibleSet` and `is99CredibleSet`. + + Raises: + ValueError: If `locus` column is not available. """ if "locus" not in self.df.columns: raise ValueError("Locus column not available.") @@ -357,6 +371,22 @@ def annotate_credible_sets(self: StudyLocus) -> StudyLocus: ) return self + def annotate_ld( + self: StudyLocus, study_index: StudyIndex, ld_index: LDIndex + ) -> StudyLocus: + """Annotate LD information to study-locus. + + Args: + study_index (StudyIndex): Study index to resolve ancestries. + ld_index (LDIndex): LD index to resolve LD information. + + Returns: + StudyLocus: Study locus annotated with ld information from LD index. + """ + from otg.method.ld import LDAnnotator + + return LDAnnotator.ld_annotate(self, study_index, ld_index) + def clump(self: StudyLocus) -> StudyLocus: """Perform LD clumping of the studyLocus. @@ -382,7 +412,7 @@ def clump(self: StudyLocus) -> StudyLocus: ) .withColumn( "qualityControls", - StudyLocus._update_quality_flag( + StudyLocus.update_quality_flag( f.col("qualityControls"), f.col("is_lead_linked"), StudyLocusQualityCheck.LD_CLUMPED, @@ -398,11 +428,11 @@ def _qc_unresolved_ld( """Flag associations with variants that are not found in the LD reference. Returns: - StudyLocusGWASCatalog | StudyLocus: Updated study locus. + StudyLocus: Updated study locus. """ self.df = self.df.withColumn( "qualityControls", - self._update_quality_flag( + self.update_quality_flag( f.col("qualityControls"), f.col("ldSet").isNull(), StudyLocusQualityCheck.UNRESOLVED_LD, @@ -414,7 +444,7 @@ def _qc_no_population(self: StudyLocus) -> StudyLocus: """Flag associations where the study doesn't have population information to resolve LD. Returns: - StudyLocusGWASCatalog | StudyLocus: Updated study locus. + StudyLocus: Updated study locus. """ # If the tested column is not present, return self unchanged: if "ldPopulationStructure" not in self.df.columns: @@ -422,7 +452,7 @@ def _qc_no_population(self: StudyLocus) -> StudyLocus: self.df = self.df.withColumn( "qualityControls", - self._update_quality_flag( + self.update_quality_flag( f.col("qualityControls"), f.col("ldPopulationStructure").isNull(), StudyLocusQualityCheck.NO_POPULATION, diff --git a/src/otg/dataset/study_locus_overlap.py b/src/otg/dataset/study_locus_overlap.py index 430abfed9..d0730d723 100644 --- a/src/otg/dataset/study_locus_overlap.py +++ b/src/otg/dataset/study_locus_overlap.py @@ -1,4 +1,4 @@ -"""Variant index dataset.""" +"""Study locus overlap index dataset.""" from __future__ import annotations from dataclasses import dataclass @@ -26,7 +26,11 @@ class StudyLocusOverlap(Dataset): @classmethod def get_schema(cls: type[StudyLocusOverlap]) -> StructType: - """Provides the schema for the StudyLocusOverlap dataset.""" + """Provides the schema for the StudyLocusOverlap dataset. + + Returns: + StructType: Schema for the StudyLocusOverlap dataset + """ return parse_spark_schema("study_locus_overlap.json") @classmethod @@ -43,3 +47,20 @@ def from_associations( StudyLocusOverlap: Study-locus overlap dataset """ return study_locus.find_overlaps(study_index) + + def _convert_to_square_matrix(self: StudyLocusOverlap) -> StudyLocusOverlap: + """Convert the dataset to a square matrix. + + Returns: + StudyLocusOverlap: Square matrix of the dataset + """ + return StudyLocusOverlap( + _df=self.df.unionByName( + self.df.selectExpr( + "leftStudyLocusId as rightStudyLocusId", + "rightStudyLocusId as leftStudyLocusId", + "tagVariantId", + ) + ).distinct(), + _schema=self.get_schema(), + ) diff --git a/src/otg/dataset/summary_statistics.py b/src/otg/dataset/summary_statistics.py index 64f2fcc1b..4ee82e7eb 100644 --- a/src/otg/dataset/summary_statistics.py +++ b/src/otg/dataset/summary_statistics.py @@ -26,7 +26,11 @@ class SummaryStatistics(Dataset): @classmethod def get_schema(cls: type[SummaryStatistics]) -> StructType: - """Provides the schema for the SummaryStatistics dataset.""" + """Provides the schema for the SummaryStatistics dataset. + + Returns: + StructType: Schema for the SummaryStatistics dataset + """ return parse_spark_schema("summary_statistics.json") def pvalue_filter(self: SummaryStatistics, pvalue: float) -> SummaryStatistics: @@ -53,40 +57,37 @@ def pvalue_filter(self: SummaryStatistics, pvalue: float) -> SummaryStatistics: def window_based_clumping( self: SummaryStatistics, - distance: int, + distance: int = 500_000, gwas_significance: float = 5e-8, - with_locus: bool = False, baseline_significance: float = 0.05, locus_collect_distance: int | None = None, ) -> StudyLocus: """Generate study-locus from summary statistics by distance based clumping + collect locus. Args: - distance (int): Distance in base pairs to be used for clumping. + distance (int): Distance in base pairs to be used for clumping. Defaults to 500_000. gwas_significance (float, optional): GWAS significance threshold. Defaults to 5e-8. baseline_significance (float, optional): Baseline significance threshold for inclusion in the locus. Defaults to 0.05. - locus_collect_distance (int, optional): The distance to collect locus around semi-indices. If not provided, defaults to `distance`. + locus_collect_distance (int | None): The distance to collect locus around semi-indices. If not provided, locus is not collected. Returns: StudyLocus: Clumped study-locus containing variants based on window. """ - if locus_collect_distance is None: - locus_collect_distance = distance - # Based on if we want to get the locus different clumping function is called: - if with_locus: - clumped_df = WindowBasedClumping.clump_with_locus( + return ( + WindowBasedClumping.clump_with_locus( self, window_length=distance, p_value_significance=gwas_significance, p_value_baseline=baseline_significance, locus_window_length=locus_collect_distance, ) - else: - clumped_df = WindowBasedClumping.clump( - self, window_length=distance, p_value_significance=gwas_significance + if locus_collect_distance + else WindowBasedClumping.clump( + self, + window_length=distance, + p_value_significance=gwas_significance, ) - - return clumped_df + ) def exclude_region(self: SummaryStatistics, region: str) -> SummaryStatistics: """Exclude a region from the summary stats dataset. diff --git a/src/otg/dataset/v2g.py b/src/otg/dataset/v2g.py index 2985f3e6a..b13608f8e 100644 --- a/src/otg/dataset/v2g.py +++ b/src/otg/dataset/v2g.py @@ -4,6 +4,8 @@ from dataclasses import dataclass from typing import TYPE_CHECKING +import pyspark.sql.functions as f + from otg.common.schemas import parse_spark_schema from otg.dataset.dataset import Dataset @@ -22,11 +24,15 @@ class V2G(Dataset): @classmethod def get_schema(cls: type[V2G]) -> StructType: - """Provides the schema for the V2G dataset.""" + """Provides the schema for the V2G dataset. + + Returns: + StructType: Schema for the V2G dataset + """ return parse_spark_schema("v2g.json") def filter_by_genes(self: V2G, genes: GeneIndex) -> V2G: - """Filter by V2G dataset by genes. + """Filter V2G dataset by genes. Args: genes (GeneIndex): Gene index dataset to filter by @@ -36,3 +42,10 @@ def filter_by_genes(self: V2G, genes: GeneIndex) -> V2G: """ self.df = self._df.join(genes.df.select("geneId"), on="geneId", how="inner") return self + + def extract_distance_tss_minimum(self: V2G) -> None: + """Extract minimum distance to TSS.""" + self.df = self._df.filter(f.col("distance")).withColumn( + "distanceTssMinimum", + f.expr("min(distTss) OVER (PARTITION BY studyLocusId)"), + ) diff --git a/src/otg/dataset/variant_annotation.py b/src/otg/dataset/variant_annotation.py index 16e9573e3..0515621fa 100644 --- a/src/otg/dataset/variant_annotation.py +++ b/src/otg/dataset/variant_annotation.py @@ -2,7 +2,7 @@ from __future__ import annotations from dataclasses import dataclass -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING import pyspark.sql.functions as f @@ -24,7 +24,11 @@ class VariantAnnotation(Dataset): @classmethod def get_schema(cls: type[VariantAnnotation]) -> StructType: - """Provides the schema for the VariantAnnotation dataset.""" + """Provides the schema for the VariantAnnotation dataset. + + Returns: + StructType: Schema for the VariantAnnotation dataset + """ return parse_spark_schema("variant_annotation.json") def max_maf(self: VariantAnnotation) -> Column: @@ -43,29 +47,32 @@ def max_maf(self: VariantAnnotation) -> Column: ) def filter_by_variant_df( - self: VariantAnnotation, df: DataFrame, cols: list[str] + self: VariantAnnotation, df: DataFrame ) -> VariantAnnotation: """Filter variant annotation dataset by a variant dataframe. Args: df (DataFrame): A dataframe of variants - cols (List[str]): A list of columns to join on Returns: VariantAnnotation: A filtered variant annotation dataset """ - self.df = self._df.join(f.broadcast(df.select(cols)), on=cols, how="inner") + self.df = self._df.join( + f.broadcast(df.select("variantId", "chromosome")), + on=["variantId", "chromosome"], + how="inner", + ) return self def get_transcript_consequence_df( - self: VariantAnnotation, filter_by: Optional[GeneIndex] = None + self: VariantAnnotation, gene_index: GeneIndex | None = None ) -> DataFrame: """Dataframe of exploded transcript consequences. Optionally the trancript consequences can be reduced to the universe of a gene index. Args: - filter_by (GeneIndex): A gene index. Defaults to None. + gene_index (GeneIndex | None): A gene index. Defaults to None. Returns: DataFrame: A dataframe exploded by transcript consequences with the columns variantId, chromosome, transcriptConsequence @@ -80,9 +87,9 @@ def get_transcript_consequence_df( "transcriptConsequence", f.col("transcriptConsequence.geneId").alias("geneId"), ) - if filter_by: + if gene_index: transript_consequences = transript_consequences.join( - f.broadcast(filter_by.df), + f.broadcast(gene_index.df), on=["chromosome", "geneId"], ) return transript_consequences.persist() @@ -90,44 +97,37 @@ def get_transcript_consequence_df( def get_most_severe_vep_v2g( self: VariantAnnotation, vep_consequences: DataFrame, - filter_by: GeneIndex, + gene_index: GeneIndex, ) -> V2G: - """Creates a dataset with variant to gene assignments based on VEP's predicted consequence on the transcript. + """Creates a dataset with variant to gene assignments based on VEP's predicted consequence of the transcript. Optionally the trancript consequences can be reduced to the universe of a gene index. Args: vep_consequences (DataFrame): A dataframe of VEP consequences - filter_by (GeneIndex): A gene index to filter by. Defaults to None. + gene_index (GeneIndex): A gene index to filter by. Defaults to None. Returns: V2G: High and medium severity variant to gene assignments """ - vep_lut = vep_consequences.select( - f.element_at(f.split("Accession", r"/"), -1).alias( - "variantFunctionalConsequenceId" - ), - f.col("Term").alias("label"), - f.col("v2g_score").cast("double").alias("score"), - ) - return V2G( - _df=self.get_transcript_consequence_df(filter_by).select( + _df=self.get_transcript_consequence_df(gene_index) + .select( "variantId", "chromosome", - "position", f.col("transcriptConsequence.geneId").alias("geneId"), f.explode("transcriptConsequence.consequenceTerms").alias("label"), f.lit("vep").alias("datatypeId"), f.lit("variantConsequence").alias("datasourceId"), ) - # A variant can have multiple predicted consequences on a transcript, the most severe one is selected .join( - f.broadcast(vep_lut), + f.broadcast(vep_consequences), on="label", how="inner", ) + .drop("label") .filter(f.col("score") != 0) + # A variant can have multiple predicted consequences on a transcript, the most severe one is selected .transform( lambda df: get_record_with_maximum_value( df, ["variantId", "geneId"], "score" @@ -136,81 +136,20 @@ def get_most_severe_vep_v2g( _schema=V2G.get_schema(), ) - def get_polyphen_v2g( - self: VariantAnnotation, filter_by: Optional[GeneIndex] = None - ) -> V2G: - """Creates a dataset with variant to gene assignments with a PolyPhen's predicted score on the transcript. - - Polyphen informs about the probability that a substitution is damaging. Optionally the trancript consequences can be reduced to the universe of a gene index. - - Args: - filter_by (GeneIndex): A gene index to filter by. Defaults to None. - - Returns: - V2G: variant to gene assignments with their polyphen scores - """ - return V2G( - _df=( - self.get_transcript_consequence_df(filter_by) - .filter(f.col("transcriptConsequence.polyphenScore").isNotNull()) - .select( - "variantId", - "chromosome", - "position", - "geneId", - f.col("transcriptConsequence.polyphenScore").alias("score"), - f.col("transcriptConsequence.polyphenPrediction").alias("label"), - f.lit("vep").alias("datatypeId"), - f.lit("polyphen").alias("datasourceId"), - ) - ), - _schema=V2G.get_schema(), - ) - - def get_sift_v2g(self: VariantAnnotation, filter_by: GeneIndex) -> V2G: - """Creates a dataset with variant to gene assignments with a SIFT's predicted score on the transcript. - - SIFT informs about the probability that a substitution is tolerated so scores nearer zero are more likely to be deleterious. - Optionally the trancript consequences can be reduced to the universe of a gene index. - - Args: - filter_by (GeneIndex): A gene index to filter by. - - Returns: - V2G: variant to gene assignments with their SIFT scores - """ - return V2G( - _df=( - self.get_transcript_consequence_df(filter_by) - .filter(f.col("transcriptConsequence.siftScore").isNotNull()) - .select( - "variantId", - "chromosome", - "position", - "geneId", - f.expr("1 - transcriptConsequence.siftScore").alias("score"), - f.col("transcriptConsequence.siftPrediction").alias("label"), - f.lit("vep").alias("datatypeId"), - f.lit("sift").alias("datasourceId"), - ) - ), - _schema=V2G.get_schema(), - ) - - def get_plof_v2g(self: VariantAnnotation, filter_by: GeneIndex) -> V2G: + def get_plof_v2g(self: VariantAnnotation, gene_index: GeneIndex) -> V2G: """Creates a dataset with variant to gene assignments with a flag indicating if the variant is predicted to be a loss-of-function variant by the LOFTEE algorithm. Optionally the trancript consequences can be reduced to the universe of a gene index. Args: - filter_by (GeneIndex): A gene index to filter by. + gene_index (GeneIndex): A gene index to filter by. Returns: V2G: variant to gene assignments from the LOFTEE algorithm """ return V2G( _df=( - self.get_transcript_consequence_df(filter_by) + self.get_transcript_consequence_df(gene_index) .filter(f.col("transcriptConsequence.lof").isNotNull()) .withColumn( "isHighQualityPlof", @@ -227,7 +166,6 @@ def get_plof_v2g(self: VariantAnnotation, filter_by: GeneIndex) -> V2G: .select( "variantId", "chromosome", - "position", "geneId", "isHighQualityPlof", f.col("score"), @@ -240,13 +178,13 @@ def get_plof_v2g(self: VariantAnnotation, filter_by: GeneIndex) -> V2G: def get_distance_to_tss( self: VariantAnnotation, - filter_by: GeneIndex, + gene_index: GeneIndex, max_distance: int = 500_000, ) -> V2G: """Extracts variant to gene assignments for variants falling within a window of a gene's TSS. Args: - filter_by (GeneIndex): A gene index to filter by. + gene_index (GeneIndex): A gene index to filter by. max_distance (int): The maximum distance from the TSS to consider. Defaults to 500_000. Returns: @@ -256,7 +194,7 @@ def get_distance_to_tss( _df=( self.df.alias("variant") .join( - f.broadcast(filter_by.locations_lut()).alias("gene"), + f.broadcast(gene_index.locations_lut()).alias("gene"), on=[ f.col("variant.chromosome") == f.col("gene.chromosome"), f.abs(f.col("variant.position") - f.col("gene.tss")) @@ -264,15 +202,18 @@ def get_distance_to_tss( ], how="inner", ) + .withColumn( + "distance", f.abs(f.col("variant.position") - f.col("gene.tss")) + ) .withColumn( "inverse_distance", - max_distance - f.abs(f.col("variant.position") - f.col("gene.tss")), + max_distance - f.col("distance"), ) .transform(lambda df: normalise_column(df, "inverse_distance", "score")) .select( "variantId", f.col("variant.chromosome").alias("chromosome"), - "position", + "distance", "geneId", "score", f.lit("distance").alias("datatypeId"), diff --git a/src/otg/dataset/variant_index.py b/src/otg/dataset/variant_index.py index 38a0052d4..647584f98 100644 --- a/src/otg/dataset/variant_index.py +++ b/src/otg/dataset/variant_index.py @@ -9,6 +9,7 @@ from otg.common.schemas import parse_spark_schema from otg.common.spark_helpers import nullify_empty_array from otg.dataset.dataset import Dataset +from otg.dataset.study_locus import StudyLocus if TYPE_CHECKING: from pyspark.sql.types import StructType @@ -25,15 +26,28 @@ class VariantIndex(Dataset): @classmethod def get_schema(cls: type[VariantIndex]) -> StructType: - """Provides the schema for the VariantIndex dataset.""" + """Provides the schema for the VariantIndex dataset. + + Returns: + StructType: Schema for the VariantIndex dataset + """ return parse_spark_schema("variant_index.json") @classmethod def from_variant_annotation( cls: type[VariantIndex], variant_annotation: VariantAnnotation, + study_locus: StudyLocus, ) -> VariantIndex: - """Initialise VariantIndex from pre-existing variant annotation dataset.""" + """Initialise VariantIndex from pre-existing variant annotation dataset. + + Args: + variant_annotation (VariantAnnotation): Variant annotation dataset + study_locus (StudyLocus): Study locus dataset with the variants to intersect with the variant annotation dataset + + Returns: + VariantIndex: Variant index dataset + """ unchanged_cols = [ "variantId", "chromosome", @@ -44,11 +58,14 @@ def from_variant_annotation( "positionB37", "alleleType", "alleleFrequencies", - "cadd", + "inSilicoPredictors", ] + va_slimmed = variant_annotation.filter_by_variant_df( + study_locus.unique_variants_in_locus() + ) return cls( _df=( - variant_annotation.df.select( + va_slimmed.df.select( *unchanged_cols, f.col("vep.mostSevereConsequence").alias("mostSevereConsequence"), # filters/rsid are arrays that can be empty, in this case we convert them to null diff --git a/src/otg/datasource/eqtl_catalogue/__init__.py b/src/otg/datasource/eqtl_catalogue/__init__.py new file mode 100644 index 000000000..9632698b0 --- /dev/null +++ b/src/otg/datasource/eqtl_catalogue/__init__.py @@ -0,0 +1,3 @@ +"""eQTL Catalogue datasource classes.""" + +from __future__ import annotations diff --git a/src/otg/datasource/eqtl_catalogue/study_index.py b/src/otg/datasource/eqtl_catalogue/study_index.py new file mode 100644 index 000000000..760cb3a74 --- /dev/null +++ b/src/otg/datasource/eqtl_catalogue/study_index.py @@ -0,0 +1,151 @@ +"""Study Index for eQTL Catalogue data source.""" +from __future__ import annotations + +from typing import TYPE_CHECKING, List + +import pyspark.sql.functions as f + +from otg.dataset.study_index import StudyIndex + +if TYPE_CHECKING: + from pyspark.sql import DataFrame + from pyspark.sql.column import Column + + +class EqtlCatalogueStudyIndex: + """Study index dataset from eQTL Catalogue.""" + + @staticmethod + def _all_attributes() -> List[Column]: + """A helper function to return all study index attribute expressions. + + Returns: + List[Column]: all study index attribute expressions. + """ + study_attributes = [ + # Project ID, example: "GTEx_V8". + f.col("study").alias("projectId"), + # Partial study ID, example: "GTEx_V8_Adipose_Subcutaneous". This ID will be converted to final only when + # summary statistics are parsed, because it must also include a gene ID. + f.concat(f.col("study"), f.lit("_"), f.col("qtl_group")).alias("studyId"), + # Summary stats location. + f.col("ftp_path").alias("summarystatsLocation"), + # Constant value fields. + f.lit(True).alias("hasSumstats"), + f.lit("eqtl").alias("studyType"), + ] + tissue_attributes = [ + # Human readable tissue label, example: "Adipose - Subcutaneous". + f.col("tissue_label").alias("traitFromSource"), + # Ontology identifier for the tissue, for example: "UBERON:0001157". + f.array( + f.regexp_replace( + f.regexp_replace( + f.col("tissue_ontology_id"), + "UBER_", + "UBERON_", + ), + "_", + ":", + ) + ).alias("traitFromSourceMappedIds"), + ] + sample_attributes = [ + f.lit(838).cast("integer").alias("nSamples"), + f.lit("838 (281 females and 557 males)").alias("initialSampleSize"), + f.array( + f.struct( + f.lit(715).cast("integer").alias("sampleSize"), + f.lit("European American").alias("ancestry"), + ), + f.struct( + f.lit(103).cast("integer").alias("sampleSize"), + f.lit("African American").alias("ancestry"), + ), + f.struct( + f.lit(12).cast("integer").alias("sampleSize"), + f.lit("Asian American").alias("ancestry"), + ), + f.struct( + f.lit(16).cast("integer").alias("sampleSize"), + f.lit("Hispanic or Latino").alias("ancestry"), + ), + ).alias("discoverySamples"), + ] + publication_attributes = [ + f.lit("32913098").alias("pubmedId"), + f.lit( + "The GTEx Consortium atlas of genetic regulatory effects across human tissues" + ).alias("publicationTitle"), + f.lit("GTEx Consortium").alias("publicationFirstAuthor"), + f.lit("2020-09-11").alias("publicationDate"), + f.lit("Science").alias("publicationJournal"), + ] + return ( + study_attributes + + tissue_attributes + + sample_attributes + + publication_attributes + ) + + @classmethod + def from_source( + cls: type[EqtlCatalogueStudyIndex], + eqtl_studies: DataFrame, + ) -> StudyIndex: + """Ingest study level metadata from eQTL Catalogue. + + Args: + eqtl_studies (DataFrame): ingested but unprocessed eQTL Catalogue studies. + + Returns: + StudyIndex: preliminary processed study index for eQTL Catalogue studies. + """ + return StudyIndex( + _df=eqtl_studies.select(*cls._all_attributes()).withColumn( + "ldPopulationStructure", + StudyIndex.aggregate_and_map_ancestries(f.col("discoverySamples")), + ), + _schema=StudyIndex.get_schema(), + ) + + @classmethod + def add_gene_id_column( + cls: type[EqtlCatalogueStudyIndex], + study_index_df: DataFrame, + summary_stats_df: DataFrame, + ) -> StudyIndex: + """Add a geneId column to the study index and explode. + + While the original list contains one entry per tissue, what we consider as a single study is one mini-GWAS for + an expression of a _particular gene_ in a particular study. At this stage we have a study index with partial + study IDs like "PROJECT_QTLGROUP", and a summary statistics object with full study IDs like + "PROJECT_QTLGROUP_GENEID", so we need to perform a merge and explosion to obtain our final study index. + + Args: + study_index_df (DataFrame): preliminary study index for eQTL Catalogue studies. + summary_stats_df (DataFrame): summary statistics dataframe for eQTL Catalogue data. + + Returns: + StudyIndex: final study index for eQTL Catalogue studies. + """ + partial_to_full_study_id = ( + summary_stats_df.select(f.col("studyId")) + .distinct() + .select( + f.col("studyId").alias("fullStudyId"), # PROJECT_QTLGROUP_GENEID + f.regexp_extract(f.col("studyId"), r"(.*)_[\_]+", 1).alias( + "studyId" + ), # PROJECT_QTLGROUP + ) + .groupBy("studyId") + .agg(f.collect_list("fullStudyId").alias("fullStudyIdList")) + ) + study_index_df = ( + study_index_df.join(partial_to_full_study_id, "studyId", "inner") + .withColumn("fullStudyId", f.explode("fullStudyIdList")) + .drop("fullStudyIdList") + .withColumn("geneId", f.regexp_extract(f.col("studyId"), r".*_([\_]+)", 1)) + .drop("fullStudyId") + ) + return StudyIndex(_df=study_index_df, _schema=StudyIndex.get_schema()) diff --git a/src/otg/datasource/eqtl_catalogue/summary_stats.py b/src/otg/datasource/eqtl_catalogue/summary_stats.py new file mode 100644 index 000000000..51d15f622 --- /dev/null +++ b/src/otg/datasource/eqtl_catalogue/summary_stats.py @@ -0,0 +1,93 @@ +"""Summary statistics ingestion for eQTL Catalogue.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING + +import pyspark.sql.functions as f +import pyspark.sql.types as t + +from otg.common.utils import parse_pvalue +from otg.dataset.summary_statistics import SummaryStatistics + +if TYPE_CHECKING: + from pyspark.sql import DataFrame + from pyspark.sql.column import Column + + +@dataclass +class EqtlCatalogueSummaryStats: + """Summary statistics dataset for eQTL Catalogue.""" + + @staticmethod + def _full_study_id_regexp() -> Column: + """Constructs a full study ID from the URI. + + Returns: + Column: expression to extract a full study ID from the URI. + """ + # Example of a URI which is used for parsing: + # "gs://genetics_etl_python_playground/input/preprocess/eqtl_catalogue/imported/GTEx_V8/ge/Adipose_Subcutaneous.tsv.gz". + + # Regular expession to extract project ID from URI. Example: "GTEx_V8". + _project_id = f.regexp_extract( + f.input_file_name(), + r"imported/([^/]+)/.*", + 1, + ) + # Regular expression to extract QTL group from URI. Example: "Adipose_Subcutaneous". + _qtl_group = f.regexp_extract(f.input_file_name(), r"([^/]+)\.tsv\.gz", 1) + # Extracting gene ID from the column. Example: "ENSG00000225630". + _gene_id = f.col("gene_id") + + # We can now construct the full study ID based on all fields. + # Example: "GTEx_V8_Adipose_Subcutaneous_ENSG00000225630". + return f.concat(_project_id, f.lit("_"), _qtl_group, f.lit("_"), _gene_id) + + @classmethod + def from_source( + cls: type[EqtlCatalogueSummaryStats], + summary_stats_df: DataFrame, + ) -> SummaryStatistics: + """Ingests all summary stats for all eQTL Catalogue studies. + + Args: + summary_stats_df (DataFrame): an ingested but unprocessed summary statistics dataframe from eQTL Catalogue. + + Returns: + SummaryStatistics: a processed summary statistics dataframe for eQTL Catalogue. + """ + processed_summary_stats_df = ( + summary_stats_df.select( + # Construct study ID from the appropriate columns. + cls._full_study_id_regexp().alias("studyId"), + # Add variant information. + f.concat_ws( + "_", + f.col("chromosome"), + f.col("position"), + f.col("ref"), + f.col("alt"), + ).alias("variantId"), + f.col("chromosome"), + f.col("position").cast(t.IntegerType()), + # Parse p-value into mantissa and exponent. + *parse_pvalue(f.col("pvalue")), + # Add beta, standard error, and allele frequency information. + f.col("beta").cast("double"), + f.col("se").cast("double").alias("standardError"), + f.col("maf").cast("float").alias("effectAlleleFrequencyFromSource"), + ) + # Drop rows which don't have proper position or beta value. + .filter( + f.col("position").cast(t.IntegerType()).isNotNull() + & (f.col("beta") != 0) + ) + ) + + # Initialise a summary statistics object. + return SummaryStatistics( + _df=processed_summary_stats_df, + _schema=SummaryStatistics.get_schema(), + ) diff --git a/src/otg/datasource/finngen/__init__.py b/src/otg/datasource/finngen/__init__.py index 544779b18..56e902233 100644 --- a/src/otg/datasource/finngen/__init__.py +++ b/src/otg/datasource/finngen/__init__.py @@ -1,3 +1,3 @@ -"""GWAS Catalog Data Source.""" +"""FinnGen datasource classes.""" from __future__ import annotations diff --git a/src/otg/datasource/finngen/study_index.py b/src/otg/datasource/finngen/study_index.py index 48829a267..b542ac655 100644 --- a/src/otg/datasource/finngen/study_index.py +++ b/src/otg/datasource/finngen/study_index.py @@ -1,22 +1,20 @@ """Study Index for Finngen data source.""" from __future__ import annotations -from typing import TYPE_CHECKING +from urllib.request import urlopen import pyspark.sql.functions as f +from pyspark.sql import SparkSession from otg.dataset.study_index import StudyIndex -if TYPE_CHECKING: - from pyspark.sql import DataFrame - -class FinnGenStudyIndex(StudyIndex): +class FinnGenStudyIndex: """Study index dataset from FinnGen. The following information is aggregated/extracted: - - Study ID in the special format (FINNGEN_R9_*) + - Study ID in the special format (e.g. FINNGEN_R10_*) - Trait name (for example, Amoebiasis) - Number of cases and controls - Link to the summary statistics location @@ -24,35 +22,41 @@ class FinnGenStudyIndex(StudyIndex): Some fields are also populated as constants, such as study type and the initial sample size. """ + finngen_phenotype_table_url: str = "https://r10.finngen.fi/api/phenos" + finngen_release_prefix: str = "FINNGEN_R10" + finngen_summary_stats_url_prefix: str = ( + "gs://finngen-public-data-r10/summary_stats/finngen_R10_" + ) + finngen_summary_stats_url_suffix: str = ".gz" + @classmethod def from_source( cls: type[FinnGenStudyIndex], - finngen_studies: DataFrame, - finngen_release_prefix: str, - finngen_summary_stats_url_prefix: str, - finngen_summary_stats_url_suffix: str, - ) -> FinnGenStudyIndex: + spark: SparkSession, + ) -> StudyIndex: """This function ingests study level metadata from FinnGen. Args: - finngen_studies (DataFrame): FinnGen raw study table - finngen_release_prefix (str): Release prefix pattern. - finngen_sumstat_url_prefix (str): URL prefix for summary statistics location. - finngen_sumstat_url_suffix (str): URL prefix suffix for summary statistics location. + spark (SparkSession): Spark session object. Returns: - FinnGenStudyIndex: Parsed and annotated FinnGen study table. + StudyIndex: Parsed and annotated FinnGen study table. """ - return FinnGenStudyIndex( - _df=finngen_studies.select( - f.concat(f.lit(f"{finngen_release_prefix}_"), f.col("phenocode")).alias( - "studyId" - ), + json_data = urlopen(cls.finngen_phenotype_table_url).read().decode("utf-8") + rdd = spark.sparkContext.parallelize([json_data]) + raw_df = spark.read.json(rdd) + return StudyIndex( + _df=raw_df.select( + f.concat( + f.lit(f"{cls.finngen_release_prefix}_"), f.col("phenocode") + ).alias("studyId"), f.col("phenostring").alias("traitFromSource"), - f.col("num_cases").alias("nCases"), - f.col("num_controls").alias("nControls"), - (f.col("num_cases") + f.col("num_controls")).alias("nSamples"), - f.lit(finngen_release_prefix).alias("projectId"), + f.col("num_cases").cast("integer").alias("nCases"), + f.col("num_controls").cast("integer").alias("nControls"), + (f.col("num_cases") + f.col("num_controls")) + .cast("integer") + .alias("nSamples"), + f.lit(cls.finngen_release_prefix).alias("projectId"), f.lit("gwas").alias("studyType"), f.lit(True).alias("hasSumstats"), f.lit("377,277 (210,870 females and 166,407 males)").alias( @@ -60,18 +64,20 @@ def from_source( ), f.array( f.struct( - f.lit(377277).cast("long").alias("sampleSize"), + f.lit(377277).cast("integer").alias("sampleSize"), f.lit("Finnish").alias("ancestry"), ) ).alias("discoverySamples"), + # Cohort label is consistent with GWAS Catalog curation. + f.array(f.lit("FinnGen")).alias("cohorts"), f.concat( - f.lit(finngen_summary_stats_url_prefix), + f.lit(cls.finngen_summary_stats_url_prefix), f.col("phenocode"), - f.lit(finngen_summary_stats_url_suffix), + f.lit(cls.finngen_summary_stats_url_suffix), ).alias("summarystatsLocation"), ).withColumn( "ldPopulationStructure", - cls.aggregate_and_map_ancestries(f.col("discoverySamples")), + StudyIndex.aggregate_and_map_ancestries(f.col("discoverySamples")), ), - _schema=cls.get_schema(), + _schema=StudyIndex.get_schema(), ) diff --git a/src/otg/datasource/finngen/summary_stats.py b/src/otg/datasource/finngen/summary_stats.py index e2b4807a9..8fc966c5b 100644 --- a/src/otg/datasource/finngen/summary_stats.py +++ b/src/otg/datasource/finngen/summary_stats.py @@ -3,36 +3,63 @@ from __future__ import annotations from dataclasses import dataclass -from typing import TYPE_CHECKING import pyspark.sql.functions as f import pyspark.sql.types as t +from pyspark.sql import SparkSession +from pyspark.sql.types import StringType, StructField, StructType -from otg.common.utils import calculate_confidence_interval, parse_pvalue +from otg.common.utils import parse_pvalue from otg.dataset.summary_statistics import SummaryStatistics -if TYPE_CHECKING: - from pyspark.sql import DataFrame - @dataclass -class FinnGenSummaryStats(SummaryStatistics): +class FinnGenSummaryStats: """Summary statistics dataset for FinnGen.""" + raw_schema: t.StructType = StructType( + [ + StructField("#chrom", StringType(), True), + StructField("pos", StringType(), True), + StructField("ref", StringType(), True), + StructField("alt", StringType(), True), + StructField("rsids", StringType(), True), + StructField("nearest_genes", StringType(), True), + StructField("pval", StringType(), True), + StructField("mlogp", StringType(), True), + StructField("beta", StringType(), True), + StructField("sebeta", StringType(), True), + StructField("af_alt", StringType(), True), + StructField("af_alt_cases", StringType(), True), + StructField("af_alt_controls", StringType(), True), + ] + ) + @classmethod - def from_finngen_harmonized_summary_stats( + def from_source( cls: type[FinnGenSummaryStats], - summary_stats_df: DataFrame, - ) -> FinnGenSummaryStats: - """Ingests all summary statst for all FinnGen studies.""" + spark: SparkSession, + raw_file: str, + ) -> SummaryStatistics: + """Ingests all summary statst for all FinnGen studies. + + Args: + spark (SparkSession): Spark session object. + raw_file (str): Path to raw summary statistics .gz files. + + Returns: + SummaryStatistics: Processed summary statistics dataset + """ + study_id = raw_file.split("/")[-1].split(".")[0].upper() processed_summary_stats_df = ( - summary_stats_df + spark.read.schema(cls.raw_schema) + .option("delimiter", "\t") + .csv(raw_file, header=True) # Drop rows which don't have proper position. - .filter(f.col("pos").cast(t.IntegerType()).isNotNull()).select( + .filter(f.col("pos").cast(t.IntegerType()).isNotNull()) + .select( # From the full path, extracts just the filename, and converts to upper case to get the study ID. - f.upper(f.regexp_extract(f.input_file_name(), r"([^/]+)\.gz", 1)).alias( - "studyId" - ), + f.lit(study_id).alias("studyId"), # Add variant information. f.concat_ws( "_", @@ -51,19 +78,16 @@ def from_finngen_harmonized_summary_stats( f.col("af_alt").cast("float").alias("effectAlleleFrequencyFromSource"), ) # Calculating the confidence intervals. - .select( - "*", - *calculate_confidence_interval( - f.col("pValueMantissa"), - f.col("pValueExponent"), - f.col("beta"), - f.col("standardError"), - ), + .filter( + f.col("pos").cast(t.IntegerType()).isNotNull() & (f.col("beta") != 0) ) + # Average ~20Mb partitions with 30 partitions per study + .repartitionByRange(30, "chromosome", "position") + .sortWithinPartitions("chromosome", "position") ) # Initializing summary statistics object: - return cls( + return SummaryStatistics( _df=processed_summary_stats_df, - _schema=cls.get_schema(), + _schema=SummaryStatistics.get_schema(), ) diff --git a/src/otg/datasource/gnomad/ld.py b/src/otg/datasource/gnomad/ld.py index ea131203a..c6b5477cd 100644 --- a/src/otg/datasource/gnomad/ld.py +++ b/src/otg/datasource/gnomad/ld.py @@ -2,6 +2,7 @@ from __future__ import annotations import sys +from dataclasses import dataclass, field from functools import reduce from typing import TYPE_CHECKING @@ -10,6 +11,7 @@ from hail.linalg import BlockMatrix from pyspark.sql import Window +from otg.common.spark_helpers import get_top_ranked_in_window, get_value_from_row from otg.common.utils import _liftover_loci, convert_gnomad_position_to_ensembl from otg.dataset.ld_index import LDIndex @@ -17,18 +19,37 @@ from pyspark.sql import DataFrame +@dataclass class GnomADLDMatrix: - """Importer of LD information from GnomAD. + """Toolset ot interact with GnomAD LD dataset (version: r2.1.1). - The information comes from LD matrices [made available by GnomAD](https://gnomad.broadinstitute.org/downloads/#v2-linkage-disequilibrium) in Hail's native format. We aggregate the LD information across 8 ancestries. - The basic steps to generate the LDIndex are: - - 1. Convert a LD matrix to a Spark DataFrame. - 2. Resolve the matrix indices to variant IDs by lifting over the coordinates to GRCh38. - 3. Aggregate the LD information across populations. + Datasets are accessed in Hail's native format, as provided by the [GnomAD consortium](https://gnomad.broadinstitute.org/downloads/#v2-linkage-disequilibrium). + Attributes: + ld_matrix_template (str): Template for the LD matrix path. Defaults to "gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.adj.ld.bm". + ld_index_raw_template (str): Template for the LD index path. Defaults to "gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.ld.variant_indices.ht". + grch37_to_grch38_chain_path (str): Path to the chain file used to lift over the coordinates. Defaults to "gs://hail-common/references/grch37_to_grch38.over.chain.gz". + ld_populations (list[str]): List of populations to use to build the LDIndex. Defaults to ["afr", "amr", "asj", "eas", "fin", "nfe", "nwe", "seu"]. """ + ld_matrix_template: str = "gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.adj.ld.bm" + ld_index_raw_template: str = "gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.ld.variant_indices.ht" + grch37_to_grch38_chain_path: str = ( + "gs://hail-common/references/grch37_to_grch38.over.chain.gz" + ) + ld_populations: list[str] = field( + default_factory=lambda: [ + "afr", # African-American + "amr", # American Admixed/Latino + "asj", # Ashkenazi Jewish + "eas", # East Asian + "fin", # Finnish + "nfe", # Non-Finnish European + "nwe", # Northwestern European + "seu", # Southeastern European + ] + ) + @staticmethod def _aggregate_ld_index_across_populations( unaggregated_ld_index: DataFrame, @@ -79,7 +100,15 @@ def _aggregate_ld_index_across_populations( def _convert_ld_matrix_to_table( block_matrix: BlockMatrix, min_r2: float ) -> DataFrame: - """Convert LD matrix to table.""" + """Convert LD matrix to table. + + Args: + block_matrix (BlockMatrix): LD matrix + min_r2 (float): Minimum r2 value to keep in the table + + Returns: + DataFrame: LD matrix as a Spark DataFrame + """ table = block_matrix.entries(keyed=False) return ( table.filter(hl.abs(table.entry) >= min_r2**0.5) @@ -95,7 +124,18 @@ def _create_ldindex_for_population( grch37_to_grch38_chain_path: str, min_r2: float, ) -> DataFrame: - """Create LDIndex for a specific population.""" + """Create LDIndex for a specific population. + + Args: + population_id (str): Population ID + ld_matrix_path (str): Path to the LD matrix + ld_index_raw_path (str): Path to the LD index + grch37_to_grch38_chain_path (str): Path to the chain file used to lift over the coordinates + min_r2 (float): Minimum r2 value to keep in the table + + Returns: + DataFrame: LDIndex for a specific population + """ # Prepare LD Block matrix ld_matrix = GnomADLDMatrix._convert_ld_matrix_to_table( BlockMatrix.read(ld_matrix_path), min_r2 @@ -148,6 +188,7 @@ def _process_variant_indices( ) .select( "chromosome", + "position", f.concat_ws( "_", f.col("chromosome"), @@ -167,7 +208,15 @@ def _process_variant_indices( def _resolve_variant_indices( ld_index: DataFrame, ld_matrix: DataFrame ) -> DataFrame: - """Resolve the `i` and `j` indices of the block matrix to variant IDs (build 38).""" + """Resolve the `i` and `j` indices of the block matrix to variant IDs (build 38). + + Args: + ld_index (DataFrame): Dataframe with resolved variant indices + ld_matrix (DataFrame): Dataframe with the filtered LD matrix + + Returns: + DataFrame: Dataframe with variant IDs instead of `i` and `j` indices + """ ld_index_i = ld_index.selectExpr( "idx as i", "variantId as variantId_i", "chromosome" ) @@ -219,31 +268,39 @@ def _transpose_ld_matrix(ld_matrix: DataFrame) -> DataFrame: f.col("variantId_i") != f.col("variantId_j") ).unionByName(ld_matrix_transposed) - @classmethod def as_ld_index( - cls: type[GnomADLDMatrix], - ld_populations: list[str], - ld_matrix_template: str, - ld_index_raw_template: str, - grch37_to_grch38_chain_path: str, + self: GnomADLDMatrix, min_r2: float, ) -> LDIndex: - """Create LDIndex dataset aggregating the LD information across a set of populations.""" + """Create LDIndex dataset aggregating the LD information across a set of populations. + + **The basic steps to generate the LDIndex are:** + + 1. Convert LD matrix to a Spark DataFrame. + 2. Resolve the matrix indices to variant IDs by lifting over the coordinates to GRCh38. + 3. Aggregate the LD information across populations. + + Args: + min_r2 (float): Minimum r2 value to keep in the table + + Returns: + LDIndex: LDIndex dataset + """ ld_indices_unaggregated = [] - for pop in ld_populations: + for pop in self.ld_populations: try: - ld_matrix_path = ld_matrix_template.format(POP=pop) - ld_index_raw_path = ld_index_raw_template.format(POP=pop) - pop_ld_index = cls._create_ldindex_for_population( + ld_matrix_path = self.ld_matrix_template.format(POP=pop) + ld_index_raw_path = self.ld_index_raw_template.format(POP=pop) + pop_ld_index = self._create_ldindex_for_population( pop, ld_matrix_path, ld_index_raw_path.format(pop), - grch37_to_grch38_chain_path, + self.grch37_to_grch38_chain_path, min_r2, ) ld_indices_unaggregated.append(pop_ld_index) except Exception as e: - print(f"Failed to create LDIndex for population {pop}: {e}") + print(f"Failed to create LDIndex for population {pop}: {e}") # noqa: T201 sys.exit(1) ld_index_unaggregated = ( @@ -254,6 +311,140 @@ def as_ld_index( .withColumnRenamed("variantId_j", "tagVariantId") ) return LDIndex( - _df=cls._aggregate_ld_index_across_populations(ld_index_unaggregated), + _df=self._aggregate_ld_index_across_populations(ld_index_unaggregated), _schema=LDIndex.get_schema(), ) + + def get_ld_variants( + self: GnomADLDMatrix, + gnomad_ancestry: str, + chromosome: str, + start: int, + end: int, + ) -> DataFrame | None: + """Return melted LD table with resolved variant id based on ancestry and genomic location. + + Args: + gnomad_ancestry (str): GnomAD major ancestry label eg. `nfe` + chromosome (str): chromosome label + start (int): window upper bound + end (int): window lower bound + + Returns: + DataFrame | None: LD table with resolved variant id based on ancestry and genomic location + """ + # Extracting locus: + ld_index_df = ( + self._process_variant_indices( + hl.read_table(self.ld_index_raw_template.format(POP=gnomad_ancestry)), + self.grch37_to_grch38_chain_path, + ) + .filter( + (f.col("chromosome") == chromosome) + & (f.col("position") >= start) + & (f.col("position") <= end) + ) + .select("chromosome", "position", "variantId", "idx") + .persist() + ) + + if ld_index_df.limit(1).count() == 0: + # If the returned slice from the ld index is empty, return None + return None + + # Compute start and end indices + start_index = get_value_from_row( + get_top_ranked_in_window( + ld_index_df, Window.partitionBy().orderBy(f.col("position").asc()) + ).collect()[0], + "idx", + ) + end_index = get_value_from_row( + get_top_ranked_in_window( + ld_index_df, Window.partitionBy().orderBy(f.col("position").desc()) + ).collect()[0], + "idx", + ) + + return self._extract_square_matrix( + ld_index_df, gnomad_ancestry, start_index, end_index + ) + + def _extract_square_matrix( + self: GnomADLDMatrix, + ld_index_df: DataFrame, + gnomad_ancestry: str, + start_index: int, + end_index: int, + ) -> DataFrame: + """Return LD square matrix for a region where coordinates are normalised. + + Args: + ld_index_df (DataFrame): Look up table between a variantId and its index in the LD matrix + gnomad_ancestry (str): GnomAD major ancestry label eg. `nfe` + start_index (int): start index of the slice + end_index (int): end index of the slice + + Returns: + DataFrame: square LD matrix resolved to variants. + """ + return ( + self.get_ld_matrix_slice( + gnomad_ancestry, start_index=start_index, end_index=end_index + ) + .join( + ld_index_df.select( + f.col("idx").alias("idx_i"), + f.col("variantId").alias("variantId_i"), + ), + on="idx_i", + how="inner", + ) + .join( + ld_index_df.select( + f.col("idx").alias("idx_j"), + f.col("variantId").alias("variantId_j"), + ), + on="idx_j", + how="inner", + ) + .select("variantId_i", "variantId_j", "r") + ) + + def get_ld_matrix_slice( + self: GnomADLDMatrix, + gnomad_ancestry: str, + start_index: int, + end_index: int, + ) -> DataFrame: + """Extract a slice of the LD matrix based on the provided ancestry and stop and end indices. + + - The half matrix is completed into a full square. + - The returned indices are adjusted based on the start index. + + Args: + gnomad_ancestry (str): LD population label eg. `nfe` + start_index (int): start index of the slice + end_index (int): end index of the slice + + Returns: + DataFrame: square slice of the LD matrix melted as dataframe with idx_i, idx_j and r columns + """ + # Extracting block matrix slice: + half_matrix = BlockMatrix.read( + self.ld_matrix_template.format(POP=gnomad_ancestry) + ).filter(range(start_index, end_index + 1), range(start_index, end_index + 1)) + + # Return converted Dataframe: + return ( + (half_matrix + half_matrix.T) + .entries() + .to_spark() + .select( + (f.col("i") + start_index).alias("idx_i"), + (f.col("j") + start_index).alias("idx_j"), + f.when(f.col("i") == f.col("j"), f.col("entry") / 2) + .otherwise(f.col("entry")) + .alias("r"), + ) + ) diff --git a/src/otg/datasource/gnomad/variants.py b/src/otg/datasource/gnomad/variants.py index d9353a9e2..3c7716490 100644 --- a/src/otg/datasource/gnomad/variants.py +++ b/src/otg/datasource/gnomad/variants.py @@ -1,6 +1,7 @@ """Import gnomAD variants dataset.""" from __future__ import annotations +from dataclasses import dataclass, field from typing import TYPE_CHECKING import hail as hl @@ -11,8 +12,32 @@ from hail.expr.expressions import Int32Expression, StringExpression +@dataclass class GnomADVariants: - """GnomAD variants included in the GnomAD genomes dataset.""" + """GnomAD variants included in the GnomAD genomes dataset. + + Attributes: + gnomad_genomes (str): Path to gnomAD genomes hail table. Defaults to gnomAD's 4.0 release. + chain_hail_38_37 (str): Path to GRCh38 to GRCh37 chain file. Defaults to Hail's chain file. + populations (list[str]): List of populations to include. Defaults to all populations. + """ + + gnomad_genomes: str = "gs://gcp-public-data--gnomad/release/4.0/ht/genomes/gnomad.genomes.v4.0.sites.ht/" + chain_hail_38_37: str = "gs://hail-common/references/grch38_to_grch37.over.chain.gz" + populations: list[str] = field( + default_factory=lambda: [ + "afr", # African-American + "amr", # American Admixed/Latino + "ami", # Amish ancestry + "asj", # Ashkenazi Jewish + "eas", # East Asian + "fin", # Finnish + "nfe", # Non-Finnish European + "mid", # Middle Eastern + "sas", # South Asian + "remaining", # Other + ] + ) @staticmethod def _convert_gnomad_position_to_ensembl_hail( @@ -31,19 +56,13 @@ def _convert_gnomad_position_to_ensembl_hail( alternate (StringExpression): The alternate allele Returns: - The position of the variant according to Ensembl genome. + Int32Expression: The position of the variant according to Ensembl genome. """ return hl.if_else( (reference.length() > 1) | (alternate.length() > 1), position + 1, position ) - @classmethod - def as_variant_annotation( - cls: type[GnomADVariants], - gnomad_file: str, - grch38_to_grch37_chain: str, - populations: list, - ) -> VariantAnnotation: + def as_variant_annotation(self: GnomADVariants) -> VariantAnnotation: """Generate variant annotation dataset from gnomAD. Some relevant modifications to the original dataset are: @@ -52,24 +71,19 @@ def as_variant_annotation( 2. Genome coordinates are liftovered from GRCh38 to GRCh37 to keep as annotation. 3. Field names are converted to camel case to follow the convention. - Args: - gnomad_file (str): Path to `gnomad.genomes.vX.X.X.sites.ht` gnomAD dataset - grch38_to_grch37_chain (str): Path to chain file for liftover - populations (list): List of populations to include in the dataset - Returns: VariantAnnotation: Variant annotation dataset """ # Load variants dataset ht = hl.read_table( - gnomad_file, + self.gnomad_genomes, _load_refs=False, ) # Liftover grch37 = hl.get_reference("GRCh37") grch38 = hl.get_reference("GRCh38") - grch38.add_liftover(grch38_to_grch37_chain, grch37) + grch38.add_liftover(self.chain_hail_38_37, grch37) # Drop non biallelic variants ht = ht.filter(ht.alleles.length() == 2) @@ -79,7 +93,7 @@ def as_variant_annotation( return VariantAnnotation( _df=( ht.select( - gnomad3VariantId=hl.str("-").join( + gnomadVariantId=hl.str("-").join( [ ht.locus.contig.replace("chr", ""), hl.str(ht.locus.position), @@ -109,11 +123,9 @@ def as_variant_annotation( alternateAllele=ht.alleles[1], rsIds=ht.rsid, alleleType=ht.allele_info.allele_type, - cadd=hl.struct( - phred=ht.cadd.phred, - raw=ht.cadd.raw_score, - ), - alleleFrequencies=hl.set([f"{pop}-adj" for pop in populations]).map( + alleleFrequencies=hl.set( + [f"{pop}_adj" for pop in self.populations] + ).map( lambda p: hl.struct( populationName=p, alleleFrequency=ht.freq[ht.globals.freq_index_dict[p]].AF, @@ -127,10 +139,6 @@ def as_variant_annotation( consequenceTerms=x.consequence_terms, geneId=x.gene_id, lof=x.lof, - polyphenScore=x.polyphen_score, - polyphenPrediction=x.polyphen_prediction, - siftScore=x.sift_score, - siftPrediction=x.sift_prediction, ), # Only keeping canonical transcripts ht.vep.transcript_consequences.filter( @@ -139,6 +147,18 @@ def as_variant_annotation( ), ), ), + inSilicoPredictors=hl.struct( + cadd=hl.struct( + phred=ht.in_silico_predictors.cadd.phred, + raw=ht.in_silico_predictors.cadd.raw_score, + ), + revelMax=ht.in_silico_predictors.revel_max, + spliceaiDsMax=ht.in_silico_predictors.spliceai_ds_max, + pangolinLargestDs=ht.in_silico_predictors.pangolin_largest_ds, + phylop=ht.in_silico_predictors.phylop, + siftMax=ht.in_silico_predictors.sift_max, + polyphenMax=ht.in_silico_predictors.polyphen_max, + ), ) .key_by("chromosome", "position") .drop("locus", "alleles") diff --git a/src/otg/datasource/gwas_catalog/associations.py b/src/otg/datasource/gwas_catalog/associations.py index 4dc148a6a..9c3e6293f 100644 --- a/src/otg/datasource/gwas_catalog/associations.py +++ b/src/otg/datasource/gwas_catalog/associations.py @@ -28,8 +28,8 @@ @dataclass -class GWASCatalogAssociations(StudyLocus): - """Study-locus dataset derived from GWAS Catalog.""" +class GWASCatalogCuratedAssociationsParser: + """GWAS Catalog curated associations parser.""" @staticmethod def _parse_pvalue(pvalue: Column) -> tuple[Column, Column]: @@ -45,7 +45,7 @@ def _parse_pvalue(pvalue: Column) -> tuple[Column, Column]: >>> import pyspark.sql.types as t >>> d = [("1.0"), ("0.5"), ("1E-20"), ("3E-3"), ("1E-1000")] >>> df = spark.createDataFrame(d, t.StringType()) - >>> df.select('value',*GWASCatalogAssociations._parse_pvalue(f.col('value'))).show() + >>> df.select('value',*GWASCatalogCuratedAssociationsParser._parse_pvalue(f.col('value'))).show() +-------+--------------+--------------+ | value|pValueMantissa|pValueExponent| +-------+--------------+--------------+ @@ -79,7 +79,7 @@ def _normalise_pvaluetext(p_value_text: Column) -> Column: >>> import pyspark.sql.types as t >>> d = [("European Ancestry"), ("African ancestry"), ("Alzheimer’s Disease"), ("(progression)"), (""), (None)] >>> df = spark.createDataFrame(d, t.StringType()) - >>> df.withColumn('normalised', GWASCatalogAssociations._normalise_pvaluetext(f.col('value'))).show() + >>> df.withColumn('normalised', GWASCatalogCuratedAssociationsParser._normalise_pvaluetext(f.col('value'))).show() +-------------------+----------+ | value|normalised| +-------------------+----------+ @@ -121,7 +121,7 @@ def _normalise_risk_allele(risk_allele: Column) -> Column: >>> import pyspark.sql.types as t >>> d = [("rs1234-A-G"), ("rs1234-A"), ("rs1234-A; rs1235-G")] >>> df = spark.createDataFrame(d, t.StringType()) - >>> df.withColumn('normalised', GWASCatalogAssociations._normalise_risk_allele(f.col('value'))).show() + >>> df.withColumn('normalised', GWASCatalogCuratedAssociationsParser._normalise_risk_allele(f.col('value'))).show() +------------------+----------+ | value|normalised| +------------------+----------+ @@ -147,7 +147,7 @@ def _collect_rsids( risk_allele (Column): The risk allele for the SNP. Returns: - An array of distinct values. + Column: An array of distinct values. """ # The current snp id field is just a number at the moment (stored as a string). Adding 'rs' prefix if looks good. snp_id_current = f.when( @@ -180,12 +180,12 @@ def _map_to_variant_annotation_variants( f.col("CHR_ID").alias("chromosome"), f.col("CHR_POS").cast(IntegerType()).alias("position"), # List of all SNPs associated with the variant - GWASCatalogAssociations._collect_rsids( + GWASCatalogCuratedAssociationsParser._collect_rsids( f.split(f.col("SNPS"), "; ").getItem(0), f.col("SNP_ID_CURRENT"), f.split(f.col("STRONGEST SNP-RISK ALLELE"), "; ").getItem(0), ).alias("rsIdsGwasCatalog"), - GWASCatalogAssociations._normalise_risk_allele( + GWASCatalogCuratedAssociationsParser._normalise_risk_allele( f.col("STRONGEST SNP-RISK ALLELE") ).alias("riskAllele"), ) @@ -218,18 +218,18 @@ def _map_to_variant_annotation_variants( ) .withColumn( "rsIdFilter", - GWASCatalogAssociations._flag_mappings_to_retain( + GWASCatalogCuratedAssociationsParser._flag_mappings_to_retain( f.col("studyLocusId"), - GWASCatalogAssociations._compare_rsids( + GWASCatalogCuratedAssociationsParser._compare_rsids( f.col("rsIdsGnomad"), f.col("rsIdsGwasCatalog") ), ), ) .withColumn( "concordanceFilter", - GWASCatalogAssociations._flag_mappings_to_retain( + GWASCatalogCuratedAssociationsParser._flag_mappings_to_retain( f.col("studyLocusId"), - GWASCatalogAssociations._check_concordance( + GWASCatalogCuratedAssociationsParser._check_concordance( f.col("riskAllele"), f.col("referenceAllele"), f.col("alternateAllele"), @@ -271,7 +271,7 @@ def _compare_rsids(gnomad: Column, gwas: Column) -> Column: gwas (Column): rsids from the GWAS Catalog Returns: - A boolean column that is true if the GnomAD rsIDs can be found in the GWAS rsIDs. + Column: A boolean column that is true if the GnomAD rsIDs can be found in the GWAS rsIDs. Examples: >>> d = [ @@ -281,7 +281,7 @@ def _compare_rsids(gnomad: Column, gwas: Column) -> Column: ... (4, [], []), ... ] >>> df = spark.createDataFrame(d, ['associationId', 'gnomad', 'gwas']) - >>> df.withColumn("rsid_matches", GWASCatalogAssociations._compare_rsids(f.col("gnomad"),f.col('gwas'))).show() + >>> df.withColumn("rsid_matches", GWASCatalogCuratedAssociationsParser._compare_rsids(f.col("gnomad"),f.col('gwas'))).show() +-------------+--------------+-------+------------+ |associationId| gnomad| gwas|rsid_matches| +-------------+--------------+-------+------------+ @@ -312,7 +312,7 @@ def _flag_mappings_to_retain( filter_column (Column): boolean col indicating to keep a mapping Returns: - A column with a boolean value. + Column: A column with a boolean value. Examples: >>> d = [ @@ -324,7 +324,7 @@ def _flag_mappings_to_retain( ... (3, True), ... ] >>> df = spark.createDataFrame(d, ['associationId', 'filter']) - >>> df.withColumn("isConcordant", GWASCatalogAssociations._flag_mappings_to_retain(f.col("associationId"),f.col('filter'))).show() + >>> df.withColumn("isConcordant", GWASCatalogCuratedAssociationsParser._flag_mappings_to_retain(f.col("associationId"),f.col('filter'))).show() +-------------+------+------------+ |associationId|filter|isConcordant| +-------------+------+------------+ @@ -364,7 +364,7 @@ def _check_concordance( alternate_allele (Column): The alternate allele of the variant. Returns: - A boolean column that is True if the risk allele is the same as the reference or alternate allele, + Column: A boolean column that is True if the risk allele is the same as the reference or alternate allele, or if the reverse complement of the risk allele is the same as the reference or alternate allele. Examples: @@ -376,7 +376,7 @@ def _check_concordance( ... (None, None, 'A'), ... ] >>> df = spark.createDataFrame(d, ['riskAllele', 'referenceAllele', 'alternateAllele']) - >>> df.withColumn("isConcordant", GWASCatalogAssociations._check_concordance(f.col("riskAllele"),f.col('referenceAllele'), f.col('alternateAllele'))).show() + >>> df.withColumn("isConcordant", GWASCatalogCuratedAssociationsParser._check_concordance(f.col("riskAllele"),f.col('referenceAllele'), f.col('alternateAllele'))).show() +----------+---------------+---------------+------------+ |riskAllele|referenceAllele|alternateAllele|isConcordant| +----------+---------------+---------------+------------+ @@ -426,12 +426,12 @@ def _get_reverse_complement(allele_col: Column) -> Column: allele_col (Column): The column containing the allele to reverse complement. Returns: - A column that is the reverse complement of the allele column. + Column: A column that is the reverse complement of the allele column. Examples: >>> d = [{"allele": 'A'}, {"allele": 'T'},{"allele": 'G'}, {"allele": 'C'},{"allele": 'AC'}, {"allele": 'GTaatc'},{"allele": '?'}, {"allele": None}] >>> df = spark.createDataFrame(d) - >>> df.withColumn("revcom_allele", GWASCatalogAssociations._get_reverse_complement(f.col("allele"))).show() + >>> df.withColumn("revcom_allele", GWASCatalogCuratedAssociationsParser._get_reverse_complement(f.col("allele"))).show() +------+-------------+ |allele|revcom_allele| +------+-------------+ @@ -464,12 +464,12 @@ def _effect_needs_harmonisation( reference_allele (Column): Effect allele column Returns: - A boolean column indicating if the effect allele needs to be harmonised. + Column: A boolean column indicating if the effect allele needs to be harmonised. Examples: >>> d = [{"risk": 'A', "reference": 'A'}, {"risk": 'A', "reference": 'T'}, {"risk": 'AT', "reference": 'TA'}, {"risk": 'AT', "reference": 'AT'}] >>> df = spark.createDataFrame(d) - >>> df.withColumn("needs_harmonisation", GWASCatalogAssociations._effect_needs_harmonisation(f.col("risk"), f.col("reference"))).show() + >>> df.withColumn("needs_harmonisation", GWASCatalogCuratedAssociationsParser._effect_needs_harmonisation(f.col("risk"), f.col("reference"))).show() +---------+----+-------------------+ |reference|risk|needs_harmonisation| +---------+----+-------------------+ @@ -483,7 +483,9 @@ def _effect_needs_harmonisation( """ return (risk_allele == reference_allele) | ( risk_allele - == GWASCatalogAssociations._get_reverse_complement(reference_allele) + == GWASCatalogCuratedAssociationsParser._get_reverse_complement( + reference_allele + ) ) @staticmethod @@ -497,12 +499,12 @@ def _are_alleles_palindromic( alternate_allele (Column): Alternate allele column Returns: - A boolean column indicating if the alleles are palindromic. + Column: A boolean column indicating if the alleles are palindromic. Examples: >>> d = [{"reference": 'A', "alternate": 'T'}, {"reference": 'AT', "alternate": 'AG'}, {"reference": 'AT', "alternate": 'AT'}, {"reference": 'CATATG', "alternate": 'CATATG'}, {"reference": '-', "alternate": None}] >>> df = spark.createDataFrame(d) - >>> df.withColumn("is_palindromic", GWASCatalogAssociations._are_alleles_palindromic(f.col("reference"), f.col("alternate"))).show() + >>> df.withColumn("is_palindromic", GWASCatalogCuratedAssociationsParser._are_alleles_palindromic(f.col("reference"), f.col("alternate"))).show() +---------+---------+--------------+ |alternate|reference|is_palindromic| +---------+---------+--------------+ @@ -515,7 +517,9 @@ def _are_alleles_palindromic( """ - revcomp = GWASCatalogAssociations._get_reverse_complement(alternate_allele) + revcomp = GWASCatalogCuratedAssociationsParser._get_reverse_complement( + alternate_allele + ) return ( f.when(reference_allele == revcomp, True) .when(revcomp.isNull(), False) @@ -543,24 +547,24 @@ def _harmonise_beta( confidence_interval (Column): GWAS Catalog confidence interval column Returns: - A column containing the beta value. + Column: A column containing the beta value. """ return ( f.when( - GWASCatalogAssociations._are_alleles_palindromic( + GWASCatalogCuratedAssociationsParser._are_alleles_palindromic( reference_allele, alternate_allele ), None, ) .when( ( - GWASCatalogAssociations._effect_needs_harmonisation( + GWASCatalogCuratedAssociationsParser._effect_needs_harmonisation( risk_allele, reference_allele ) & confidence_interval.contains("increase") ) | ( - ~GWASCatalogAssociations._effect_needs_harmonisation( + ~GWASCatalogCuratedAssociationsParser._effect_needs_harmonisation( risk_allele, reference_allele ) & confidence_interval.contains("decrease") @@ -593,10 +597,10 @@ def _harmonise_beta_ci( direction (str): This is the direction of the confidence interval. It can be either "upper" or "lower". Returns: - The upper and lower bounds of the confidence interval for the beta coefficient. + Column: The upper and lower bounds of the confidence interval for the beta coefficient. """ zscore_95 = f.lit(1.96) - beta = GWASCatalogAssociations._harmonise_beta( + beta = GWASCatalogCuratedAssociationsParser._harmonise_beta( risk_allele, reference_allele, alternate_allele, @@ -628,18 +632,18 @@ def _harmonise_odds_ratio( confidence_interval (Column): GWAS Catalog confidence interval column Returns: - A column with the odds ratio, or 1/odds_ratio if harmonization required. + Column: A column with the odds ratio, or 1/odds_ratio if harmonization required. """ return ( f.when( - GWASCatalogAssociations._are_alleles_palindromic( + GWASCatalogCuratedAssociationsParser._are_alleles_palindromic( reference_allele, alternate_allele ), None, ) .when( ( - GWASCatalogAssociations._effect_needs_harmonisation( + GWASCatalogCuratedAssociationsParser._effect_needs_harmonisation( risk_allele, reference_allele ) & ~confidence_interval.rlike("|".join(["decrease", "increase"])) @@ -672,10 +676,10 @@ def _harmonise_odds_ratio_ci( direction (str): This is the direction of the confidence interval. It can be either "upper" or "lower". Returns: - The upper and lower bounds of the 95% confidence interval for the odds ratio. + Column: The upper and lower bounds of the 95% confidence interval for the odds ratio. """ zscore_95 = f.lit(1.96) - odds_ratio = GWASCatalogAssociations._harmonise_odds_ratio( + odds_ratio = GWASCatalogCuratedAssociationsParser._harmonise_odds_ratio( risk_allele, reference_allele, alternate_allele, @@ -705,7 +709,7 @@ def _concatenate_substudy_description( mapped_trait_uri (Column): GWAS Catalog mapped trait URI column Returns: - A column with the substudy description in the shape trait|pvaluetext1_pvaluetext2|EFO1_EFO2. + Column: A column with the substudy description in the shape trait|pvaluetext1_pvaluetext2|EFO1_EFO2. Examples: >>> df = spark.createDataFrame([ @@ -713,7 +717,7 @@ def _concatenate_substudy_description( ... ("Schizophrenia", "http://www.ebi.ac.uk/efo/MONDO_0005090", None)], ... ["association_trait", "mapped_trait_uri", "pvalue_text"] ... ) - >>> df.withColumn('substudy_description', GWASCatalogAssociations._concatenate_substudy_description(df.association_trait, df.pvalue_text, df.mapped_trait_uri)).show(truncate=False) + >>> df.withColumn('substudy_description', GWASCatalogCuratedAssociationsParser._concatenate_substudy_description(df.association_trait, df.pvalue_text, df.mapped_trait_uri)).show(truncate=False) +-----------------+-------------------------------------------------------------------------+-----------------+------------------------------------------+ |association_trait|mapped_trait_uri |pvalue_text |substudy_description | +-----------------+-------------------------------------------------------------------------+-----------------+------------------------------------------+ @@ -723,7 +727,7 @@ def _concatenate_substudy_description( """ p_value_text = f.coalesce( - GWASCatalogAssociations._normalise_pvaluetext(pvalue_text), + GWASCatalogCuratedAssociationsParser._normalise_pvaluetext(pvalue_text), f.array(f.lit("no_pvalue_text")), ) return f.concat_ws( @@ -767,18 +771,22 @@ def _qc_all( Returns: Column: Updated QC column with flag. """ - qc = GWASCatalogAssociations._qc_variant_interactions( + qc = GWASCatalogCuratedAssociationsParser._qc_variant_interactions( qc, strongest_snp_risk_allele ) - qc = GWASCatalogAssociations._qc_subsignificant_associations( + qc = GWASCatalogCuratedAssociationsParser._qc_subsignificant_associations( qc, p_value_mantissa, p_value_exponent, p_value_cutoff ) - qc = GWASCatalogAssociations._qc_genomic_location(qc, chromosome, position) - qc = GWASCatalogAssociations._qc_variant_inconsistencies( + qc = GWASCatalogCuratedAssociationsParser._qc_genomic_location( + qc, chromosome, position + ) + qc = GWASCatalogCuratedAssociationsParser._qc_variant_inconsistencies( qc, chromosome, position, strongest_snp_risk_allele ) - qc = GWASCatalogAssociations._qc_unmapped_variants(qc, alternate_allele) - qc = GWASCatalogAssociations._qc_palindromic_alleles( + qc = GWASCatalogCuratedAssociationsParser._qc_unmapped_variants( + qc, alternate_allele + ) + qc = GWASCatalogCuratedAssociationsParser._qc_palindromic_alleles( qc, reference_allele, alternate_allele ) return qc @@ -796,7 +804,7 @@ def _qc_variant_interactions( Returns: Column: Updated QC column with flag. """ - return GWASCatalogAssociations._update_quality_flag( + return StudyLocus.update_quality_flag( qc, strongest_snp_risk_allele.contains(";"), StudyLocusQualityCheck.COMPOSITE_FLAG, @@ -824,7 +832,7 @@ def _qc_subsignificant_associations( >>> import pyspark.sql.types as t >>> d = [{'qc': None, 'p_value_mantissa': 1, 'p_value_exponent': -7}, {'qc': None, 'p_value_mantissa': 1, 'p_value_exponent': -8}, {'qc': None, 'p_value_mantissa': 5, 'p_value_exponent': -8}, {'qc': None, 'p_value_mantissa': 1, 'p_value_exponent': -9}] >>> df = spark.createDataFrame(d, t.StructType([t.StructField('qc', t.ArrayType(t.StringType()), True), t.StructField('p_value_mantissa', t.IntegerType()), t.StructField('p_value_exponent', t.IntegerType())])) - >>> df.withColumn('qc', GWASCatalogAssociations._qc_subsignificant_associations(f.col("qc"), f.col("p_value_mantissa"), f.col("p_value_exponent"), 5e-8)).show(truncate = False) + >>> df.withColumn('qc', GWASCatalogCuratedAssociationsParser._qc_subsignificant_associations(f.col("qc"), f.col("p_value_mantissa"), f.col("p_value_exponent"), 5e-8)).show(truncate = False) +------------------------+----------------+----------------+ |qc |p_value_mantissa|p_value_exponent| +------------------------+----------------+----------------+ @@ -836,7 +844,7 @@ def _qc_subsignificant_associations( """ - return StudyLocus._update_quality_flag( + return StudyLocus.update_quality_flag( qc, calculate_neglog_pvalue(p_value_mantissa, p_value_exponent) < f.lit(-np.log10(pvalue_cutoff)), @@ -861,7 +869,7 @@ def _qc_genomic_location( >>> import pyspark.sql.types as t >>> d = [{'qc': None, 'chromosome': None, 'position': None}, {'qc': None, 'chromosome': '1', 'position': None}, {'qc': None, 'chromosome': None, 'position': 1}, {'qc': None, 'chromosome': '1', 'position': 1}] >>> df = spark.createDataFrame(d, schema=t.StructType([t.StructField('qc', t.ArrayType(t.StringType()), True), t.StructField('chromosome', t.StringType()), t.StructField('position', t.IntegerType())])) - >>> df.withColumn('qc', GWASCatalogAssociations._qc_genomic_location(df.qc, df.chromosome, df.position)).show(truncate=False) + >>> df.withColumn('qc', GWASCatalogCuratedAssociationsParser._qc_genomic_location(df.qc, df.chromosome, df.position)).show(truncate=False) +----------------------------+----------+--------+ |qc |chromosome|position| +----------------------------+----------+--------+ @@ -873,7 +881,7 @@ def _qc_genomic_location( """ - return StudyLocus._update_quality_flag( + return StudyLocus.update_quality_flag( qc, position.isNull() | chromosome.isNull(), StudyLocusQualityCheck.NO_GENOMIC_LOCATION_FLAG, @@ -897,7 +905,7 @@ def _qc_variant_inconsistencies( Returns: Column: Updated QC column with flag. """ - return GWASCatalogAssociations._update_quality_flag( + return StudyLocus.update_quality_flag( qc, # Number of chromosomes does not correspond to the number of positions: (f.size(f.split(chromosome, ";")) != f.size(f.split(position, ";"))) @@ -925,7 +933,7 @@ def _qc_unmapped_variants(qc: Column, alternate_allele: Column) -> Column: >>> d = [{'alternate_allele': 'A', 'qc': None}, {'alternate_allele': None, 'qc': None}] >>> schema = t.StructType([t.StructField('alternate_allele', t.StringType(), True), t.StructField('qc', t.ArrayType(t.StringType()), True)]) >>> df = spark.createDataFrame(data=d, schema=schema) - >>> df.withColumn("new_qc", GWASCatalogAssociations._qc_unmapped_variants(f.col("qc"), f.col("alternate_allele"))).show() + >>> df.withColumn("new_qc", GWASCatalogCuratedAssociationsParser._qc_unmapped_variants(f.col("qc"), f.col("alternate_allele"))).show() +----------------+----+--------------------+ |alternate_allele| qc| new_qc| +----------------+----+--------------------+ @@ -935,7 +943,7 @@ def _qc_unmapped_variants(qc: Column, alternate_allele: Column) -> Column: """ - return GWASCatalogAssociations._update_quality_flag( + return StudyLocus.update_quality_flag( qc, alternate_allele.isNull(), StudyLocusQualityCheck.NON_MAPPED_VARIANT_FLAG, @@ -960,7 +968,7 @@ def _qc_palindromic_alleles( >>> schema = t.StructType([t.StructField('reference_allele', t.StringType(), True), t.StructField('alternate_allele', t.StringType(), True), t.StructField('qc', t.ArrayType(t.StringType()), True)]) >>> d = [{'reference_allele': 'A', 'alternate_allele': 'T', 'qc': None}, {'reference_allele': 'AT', 'alternate_allele': 'TA', 'qc': None}, {'reference_allele': 'AT', 'alternate_allele': 'AT', 'qc': None}] >>> df = spark.createDataFrame(data=d, schema=schema) - >>> df.withColumn("qc", GWASCatalogAssociations._qc_palindromic_alleles(f.col("qc"), f.col("reference_allele"), f.col("alternate_allele"))).show(truncate=False) + >>> df.withColumn("qc", GWASCatalogCuratedAssociationsParser._qc_palindromic_alleles(f.col("qc"), f.col("reference_allele"), f.col("alternate_allele"))).show(truncate=False) +----------------+----------------+---------------------------------------+ |reference_allele|alternate_allele|qc | +----------------+----------------+---------------------------------------+ @@ -971,9 +979,9 @@ def _qc_palindromic_alleles( """ - return StudyLocus._update_quality_flag( + return StudyLocus.update_quality_flag( qc, - GWASCatalogAssociations._are_alleles_palindromic( + GWASCatalogCuratedAssociationsParser._are_alleles_palindromic( reference_allele, alternate_allele ), StudyLocusQualityCheck.PALINDROMIC_ALLELE_FLAG, @@ -981,11 +989,11 @@ def _qc_palindromic_alleles( @classmethod def from_source( - cls: type[GWASCatalogAssociations], + cls: type[GWASCatalogCuratedAssociationsParser], gwas_associations: DataFrame, variant_annotation: VariantAnnotation, pvalue_threshold: float = 5e-8, - ) -> GWASCatalogAssociations: + ) -> StudyLocusGWASCatalog: """Read GWASCatalog associations. It reads the GWAS Catalog association dataset, selects and renames columns, casts columns, and @@ -997,30 +1005,32 @@ def from_source( pvalue_threshold (float): P-value threshold for flagging associations Returns: - StudyLocusGWASCatalog: StudyLocusGWASCatalog dataset + StudyLocusGWASCatalog: GWASCatalogAssociations dataset """ - return GWASCatalogAssociations( + return StudyLocusGWASCatalog( _df=gwas_associations.withColumn( "studyLocusId", f.monotonically_increasing_id().cast(LongType()) ) .transform( # Map/harmonise variants to variant annotation dataset: # This function adds columns: variantId, referenceAllele, alternateAllele, chromosome, position - lambda df: GWASCatalogAssociations._map_to_variant_annotation_variants( + lambda df: GWASCatalogCuratedAssociationsParser._map_to_variant_annotation_variants( df, variant_annotation ) ) .withColumn( # Perform all quality control checks: "qualityControls", - GWASCatalogAssociations._qc_all( + GWASCatalogCuratedAssociationsParser._qc_all( f.array().alias("qualityControls"), f.col("CHR_ID"), f.col("CHR_POS").cast(IntegerType()), f.col("referenceAllele"), f.col("alternateAllele"), f.col("STRONGEST SNP-RISK ALLELE"), - *GWASCatalogAssociations._parse_pvalue(f.col("P-VALUE")), + *GWASCatalogCuratedAssociationsParser._parse_pvalue( + f.col("P-VALUE") + ), pvalue_threshold, ), ) @@ -1033,8 +1043,8 @@ def from_source( "position", f.col("STUDY ACCESSION").alias("studyId"), # beta value of the association - GWASCatalogAssociations._harmonise_beta( - GWASCatalogAssociations._normalise_risk_allele( + GWASCatalogCuratedAssociationsParser._harmonise_beta( + GWASCatalogCuratedAssociationsParser._normalise_risk_allele( f.col("STRONGEST SNP-RISK ALLELE") ), f.col("referenceAllele"), @@ -1042,68 +1052,10 @@ def from_source( f.col("OR or BETA"), f.col("95% CI (TEXT)"), ).alias("beta"), - # odds ratio of the association - GWASCatalogAssociations._harmonise_odds_ratio( - GWASCatalogAssociations._normalise_risk_allele( - f.col("STRONGEST SNP-RISK ALLELE") - ), - f.col("referenceAllele"), - f.col("alternateAllele"), - f.col("OR or BETA"), - f.col("95% CI (TEXT)"), - ).alias("oddsRatio"), - # CI lower of the beta value - GWASCatalogAssociations._harmonise_beta_ci( - GWASCatalogAssociations._normalise_risk_allele( - f.col("STRONGEST SNP-RISK ALLELE") - ), - f.col("referenceAllele"), - f.col("alternateAllele"), - f.col("OR or BETA"), - f.col("95% CI (TEXT)"), - f.col("P-VALUE"), - "lower", - ).alias("betaConfidenceIntervalLower"), - # CI upper for the beta value - GWASCatalogAssociations._harmonise_beta_ci( - GWASCatalogAssociations._normalise_risk_allele( - f.col("STRONGEST SNP-RISK ALLELE") - ), - f.col("referenceAllele"), - f.col("alternateAllele"), - f.col("OR or BETA"), - f.col("95% CI (TEXT)"), - f.col("P-VALUE"), - "upper", - ).alias("betaConfidenceIntervalUpper"), - # CI lower of the odds ratio value - GWASCatalogAssociations._harmonise_odds_ratio_ci( - GWASCatalogAssociations._normalise_risk_allele( - f.col("STRONGEST SNP-RISK ALLELE") - ), - f.col("referenceAllele"), - f.col("alternateAllele"), - f.col("OR or BETA"), - f.col("95% CI (TEXT)"), - f.col("P-VALUE"), - "lower", - ).alias("oddsRatioConfidenceIntervalLower"), - # CI upper of the odds ratio value - GWASCatalogAssociations._harmonise_odds_ratio_ci( - GWASCatalogAssociations._normalise_risk_allele( - f.col("STRONGEST SNP-RISK ALLELE") - ), - f.col("referenceAllele"), - f.col("alternateAllele"), - f.col("OR or BETA"), - f.col("95% CI (TEXT)"), - f.col("P-VALUE"), - "upper", - ).alias("oddsRatioConfidenceIntervalUpper"), # p-value of the association, string: split into exponent and mantissa. - *GWASCatalogAssociations._parse_pvalue(f.col("P-VALUE")), + *GWASCatalogCuratedAssociationsParser._parse_pvalue(f.col("P-VALUE")), # Capturing phenotype granularity at the association level - GWASCatalogAssociations._concatenate_substudy_description( + GWASCatalogCuratedAssociationsParser._concatenate_substudy_description( f.col("DISEASE/TRAIT"), f.col("P-VALUE (TEXT)"), f.col("MAPPED_TRAIT_URI"), @@ -1111,12 +1063,20 @@ def from_source( # Quality controls (array of strings) "qualityControls", ), - _schema=GWASCatalogAssociations.get_schema(), + _schema=StudyLocusGWASCatalog.get_schema(), ) + +@dataclass +class StudyLocusGWASCatalog(StudyLocus): + """Study locus Dataset for GWAS Catalog curated associations. + + A study index dataset captures all the metadata for all studies including GWAS and Molecular QTL. + """ + def update_study_id( - self: GWASCatalogAssociations, study_annotation: DataFrame - ) -> GWASCatalogAssociations: + self: StudyLocusGWASCatalog, study_annotation: DataFrame + ) -> StudyLocusGWASCatalog: """Update final studyId and studyLocusId with a dataframe containing study annotation. Args: @@ -1137,7 +1097,7 @@ def update_study_id( ) return self - def _qc_ambiguous_study(self: GWASCatalogAssociations) -> GWASCatalogAssociations: + def qc_ambiguous_study(self: StudyLocusGWASCatalog) -> StudyLocusGWASCatalog: """Flag associations with variants that can not be unambiguously associated with one study. Returns: @@ -1149,7 +1109,7 @@ def _qc_ambiguous_study(self: GWASCatalogAssociations) -> GWASCatalogAssociation self._df.withColumn( "qualityControls", - StudyLocus._update_quality_flag( + StudyLocus.update_quality_flag( f.col("qualityControls"), f.count(f.col("variantId")).over(assoc_ambiguity_window) > 1, StudyLocusQualityCheck.AMBIGUOUS_STUDY, diff --git a/src/otg/datasource/gwas_catalog/study_index.py b/src/otg/datasource/gwas_catalog/study_index.py index 34cdb8d09..27988c29d 100644 --- a/src/otg/datasource/gwas_catalog/study_index.py +++ b/src/otg/datasource/gwas_catalog/study_index.py @@ -16,8 +16,8 @@ @dataclass -class GWASCatalogStudyIndex(StudyIndex): - """Study index from GWAS Catalog. +class StudyIndexGWASCatalogParser: + """GWAS Catalog study index parser. The following information is harmonised from the GWAS Catalog: @@ -58,7 +58,7 @@ def _parse_discovery_samples(discovery_samples: Column) -> Column: ... ).alias('discoverySampleSize') ... ) ... .orderBy('studyId') - ... .withColumn('discoverySampleSize', GWASCatalogStudyIndex._parse_discovery_samples(f.col('discoverySampleSize'))) + ... .withColumn('discoverySampleSize', StudyIndexGWASCatalogParser._parse_discovery_samples(f.col('discoverySampleSize'))) ... .select('discoverySampleSize') ... .show(truncate=False) ... ) @@ -70,7 +70,7 @@ def _parse_discovery_samples(discovery_samples: Column) -> Column: +--------------------------------------------+ """ - # To initialize return objects for aggregate functions, schema has to be definied: + # To initialize return objects for aggregate functions, schema has to be defined: schema = t.ArrayType( t.StructType( [ @@ -96,7 +96,7 @@ def _parse_discovery_samples(discovery_samples: Column) -> Column: ), lambda ancestry: f.struct( ancestry.alias("ancestry"), - f.lit(0).cast(t.LongType()).alias("sampleSize"), + f.lit(0).alias("sampleSize"), ), ) @@ -120,7 +120,7 @@ def _parse_discovery_samples(discovery_samples: Column) -> Column: exploded_ancestries.alias("ancestries"), resolved_sample_count.alias("sample_count"), ), - GWASCatalogStudyIndex._merge_ancestries_and_counts, + StudyIndexGWASCatalogParser._merge_ancestries_and_counts, ), f.array().cast(schema), lambda x, y: f.array_union(x, y), @@ -130,7 +130,7 @@ def _parse_discovery_samples(discovery_samples: Column) -> Column: return f.aggregate( parsed_sample_size, unique_ancestries, - GWASCatalogStudyIndex._normalize_ancestries, + StudyIndexGWASCatalogParser._normalize_ancestries, ) @staticmethod @@ -155,7 +155,7 @@ def _normalize_ancestries(merged: Column, ancestry: Column) -> Column: f.struct( a.ancestry.alias("ancestry"), (a.sampleSize + ancestry.sampleSize) - .cast(t.LongType()) + .cast(t.IntegerType()) .alias("sampleSize"), ), ).otherwise(a), @@ -178,7 +178,7 @@ def _merge_ancestries_and_counts(ancestry_group: Column) -> Column: >>> data = [(12, ['African', 'European']),(12, ['African'])] >>> ( ... spark.createDataFrame(data, ['sample_count', 'ancestries']) - ... .select(GWASCatalogStudyIndex._merge_ancestries_and_counts(f.struct('sample_count', 'ancestries')).alias('test')) + ... .select(StudyIndexGWASCatalogParser._merge_ancestries_and_counts(f.struct('sample_count', 'ancestries')).alias('test')) ... .show(truncate=False) ... ) +-------------------------------+ @@ -201,19 +201,45 @@ def _merge_ancestries_and_counts(ancestry_group: Column) -> Column: ), ) + @staticmethod + def parse_cohorts(raw_cohort: Column) -> Column: + """Return a list of unique cohort labels from pipe separated list if provided. + + Args: + raw_cohort (Column): Cohort list column, where labels are separated by `|` sign. + + Returns: + Column: an array colun with string elements. + + Examples: + >>> data = [('BioME|CaPS|Estonia|FHS|UKB|GERA|GERA|GERA',),(None,),] + >>> spark.createDataFrame(data, ['cohorts']).select(StudyIndexGWASCatalogParser.parse_cohorts(f.col('cohorts')).alias('parsedCohorts')).show(truncate=False) + +--------------------------------------+ + |parsedCohorts | + +--------------------------------------+ + |[BioME, CaPS, Estonia, FHS, UKB, GERA]| + |[null] | + +--------------------------------------+ + + """ + return f.when( + (raw_cohort.isNull()) | (raw_cohort == ""), + f.array(f.lit(None).cast(t.StringType())), + ).otherwise(f.array_distinct(f.split(raw_cohort, r"\|"))) + @classmethod def _parse_study_table( - cls: type[GWASCatalogStudyIndex], catalog_studies: DataFrame - ) -> GWASCatalogStudyIndex: + cls: type[StudyIndexGWASCatalogParser], catalog_studies: DataFrame + ) -> StudyIndexGWASCatalog: """Harmonise GWASCatalog study table with `StudyIndex` schema. Args: catalog_studies (DataFrame): GWAS Catalog study table Returns: - GWASCatalogStudyIndex: Parsed and annotated GWAS Catalog study table. + StudyIndexGWASCatalog: Parsed and annotated GWAS Catalog study table. """ - return GWASCatalogStudyIndex( + return StudyIndexGWASCatalog( _df=catalog_studies.select( f.coalesce( f.col("STUDY ACCESSION"), f.monotonically_increasing_id() @@ -234,16 +260,16 @@ def _parse_study_table( "backgroundTraitFromSourceMappedIds" ), ), - _schema=GWASCatalogStudyIndex.get_schema(), + _schema=StudyIndexGWASCatalog.get_schema(), ) @classmethod def from_source( - cls: type[GWASCatalogStudyIndex], + cls: type[StudyIndexGWASCatalogParser], catalog_studies: DataFrame, ancestry_file: DataFrame, sumstats_lut: DataFrame, - ) -> StudyIndex: + ) -> StudyIndexGWASCatalog: """Ingests study level metadata from the GWAS Catalog. Args: @@ -252,26 +278,34 @@ def from_source( sumstats_lut (DataFrame): GWAS Catalog summary statistics list. Returns: - GWASCatalogStudyIndex: Parsed and annotated GWAS Catalog study table. + StudyIndexGWASCatalog: Parsed and annotated GWAS Catalog study table. """ # Read GWAS Catalogue raw data return ( cls._parse_study_table(catalog_studies) - ._annotate_ancestries(ancestry_file) - ._annotate_sumstats_info(sumstats_lut) - ._annotate_discovery_sample_sizes() + .annotate_ancestries(ancestry_file) + .annotate_sumstats_info(sumstats_lut) + .annotate_discovery_sample_sizes() ) + +@dataclass +class StudyIndexGWASCatalog(StudyIndex): + """Study index dataset from GWAS Catalog. + + A study index dataset captures all the metadata for all studies including GWAS and Molecular QTL. + """ + def update_study_id( - self: GWASCatalogStudyIndex, study_annotation: DataFrame - ) -> GWASCatalogStudyIndex: + self: StudyIndexGWASCatalog, study_annotation: DataFrame + ) -> StudyIndexGWASCatalog: """Update studyId with a dataframe containing study. Args: study_annotation (DataFrame): Dataframe containing `updatedStudyId`, `traitFromSource`, `traitFromSourceMappedIds` and key column `studyId`. Returns: - GWASCatalogStudyIndex: Updated study table. + StudyIndexGWASCatalog: Updated study table. """ self.df = ( self._df.join( @@ -306,9 +340,9 @@ def update_study_id( return self - def _annotate_ancestries( - self: GWASCatalogStudyIndex, ancestry_lut: DataFrame - ) -> GWASCatalogStudyIndex: + def annotate_ancestries( + self: StudyIndexGWASCatalog, ancestry_lut: DataFrame + ) -> StudyIndexGWASCatalog: """Extracting sample sizes and ancestry information. This function parses the ancestry data. Also get counts for the europeans in the same @@ -318,8 +352,12 @@ def _annotate_ancestries( ancestry_lut (DataFrame): Ancestry table as downloaded from the GWAS Catalog Returns: - GWASCatalogStudyIndex: Slimmed and cleaned version of the ancestry annotation. + StudyIndexGWASCatalog: Slimmed and cleaned version of the ancestry annotation. """ + from otg.datasource.gwas_catalog.study_index import ( + StudyIndexGWASCatalogParser as GWASCatalogStudyIndexParser, + ) + ancestry = ( ancestry_lut # Convert column headers to camelcase: @@ -332,6 +370,14 @@ def _annotate_ancestries( ) # studyId has not been split yet ) + # Parsing cohort information: + cohorts = ancestry_lut.select( + f.col("STUDY ACCESSION").alias("studyId"), + GWASCatalogStudyIndexParser.parse_cohorts(f.col("COHORT(S)")).alias( + "cohorts" + ), + ).distinct() + # Get a high resolution dataset on experimental stage: ancestry_stages = ( ancestry.groupBy("studyId") @@ -341,13 +387,14 @@ def _annotate_ancestries( f.struct( f.col("broadAncestralCategory").alias("ancestry"), f.col("numberOfIndividuals") - .cast(t.LongType()) + .cast(t.IntegerType()) .alias("sampleSize"), ) ) ) .withColumn( - "discoverySamples", self._parse_discovery_samples(f.col("initial")) + "discoverySamples", + GWASCatalogStudyIndexParser._parse_discovery_samples(f.col("initial")), ) .withColumnRenamed("replication", "replicationSamples") # Mapping discovery stage ancestries to LD reference: @@ -418,19 +465,21 @@ def _annotate_ancestries( europeans_deconvoluted, on="studyId", how="outer" ) - self.df = self.df.join(parsed_ancestry_lut, on="studyId", how="left") + self.df = self.df.join(parsed_ancestry_lut, on="studyId", how="left").join( + cohorts, on="studyId", how="left" + ) return self - def _annotate_sumstats_info( - self: GWASCatalogStudyIndex, sumstats_lut: DataFrame - ) -> GWASCatalogStudyIndex: + def annotate_sumstats_info( + self: StudyIndexGWASCatalog, sumstats_lut: DataFrame + ) -> StudyIndexGWASCatalog: """Annotate summary stat locations. Args: sumstats_lut (DataFrame): listing GWAS Catalog summary stats paths Returns: - GWASCatalogStudyIndex: including `summarystatsLocation` and `hasSumstats` columns + StudyIndexGWASCatalog: including `summarystatsLocation` and `hasSumstats` columns """ gwas_sumstats_base_uri = ( "ftp://ftp.ebi.ac.uk/pub/databases/gwas/summary_statistics/" @@ -457,15 +506,15 @@ def _annotate_sumstats_info( ) return self - def _annotate_discovery_sample_sizes( - self: GWASCatalogStudyIndex, - ) -> GWASCatalogStudyIndex: + def annotate_discovery_sample_sizes( + self: StudyIndexGWASCatalog, + ) -> StudyIndexGWASCatalog: """Extract the sample size of the discovery stage of the study as annotated in the GWAS Catalog. For some studies that measure quantitative traits, nCases and nControls can't be extracted. Therefore, we assume these are 0. Returns: - GWASCatalogStudyIndex: object with columns `nCases`, `nControls`, and `nSamples` per `studyId` correctly extracted. + StudyIndexGWASCatalog: object with columns `nCases`, `nControls`, and `nSamples` per `studyId` correctly extracted. """ sample_size_lut = ( self.df.select( @@ -494,9 +543,9 @@ def _annotate_discovery_sample_sizes( # Aggregating sample sizes for all ancestries: .groupBy("studyId") # studyId has not been split yet .agg( - f.sum("nCases").alias("nCases"), - f.sum("nControls").alias("nControls"), - f.sum("sampleSize").alias("nSamples"), + f.sum("nCases").cast("integer").alias("nCases"), + f.sum("nControls").cast("integer").alias("nControls"), + f.sum("sampleSize").cast("integer").alias("nSamples"), ) ) self.df = self.df.join(sample_size_lut, on="studyId", how="left") diff --git a/src/otg/datasource/gwas_catalog/study_splitter.py b/src/otg/datasource/gwas_catalog/study_splitter.py index f31d147be..d03c5c8c5 100644 --- a/src/otg/datasource/gwas_catalog/study_splitter.py +++ b/src/otg/datasource/gwas_catalog/study_splitter.py @@ -10,8 +10,8 @@ if TYPE_CHECKING: from pyspark.sql import Column - from otg.datasource.gwas_catalog.associations import GWASCatalogAssociations - from otg.datasource.gwas_catalog.study_index import GWASCatalogStudyIndex + from otg.datasource.gwas_catalog.study_index import StudyIndexGWASCatalog + from otg.datasource.gwas_catalog.study_locus_dataset import StudyLocusGWASCatalog class GWASCatalogStudySplitter: @@ -24,8 +24,8 @@ def _resolve_trait( """Resolve trait names by consolidating association-level and study-level trait names. Args: - association_trait (Column): Association-level trait name. study_trait (Column): Study-level trait name. + association_trait (Column): Association-level trait name. p_value_text (Column): P-value text. Returns: @@ -74,7 +74,7 @@ def _resolve_study_id(study_id: Column, sub_study_description: Column) -> Column """ split_w = Window.partitionBy(study_id).orderBy(sub_study_description) row_number = f.dense_rank().over(split_w) - substudy_count = f.count(row_number).over(split_w) + substudy_count = f.approx_count_distinct(row_number).over(split_w) return f.when(substudy_count == 1, study_id).otherwise( f.concat_ws("_", study_id, row_number) ) @@ -82,20 +82,20 @@ def _resolve_study_id(study_id: Column, sub_study_description: Column) -> Column @classmethod def split( cls: type[GWASCatalogStudySplitter], - studies: GWASCatalogStudyIndex, - associations: GWASCatalogAssociations, - ) -> Tuple[GWASCatalogStudyIndex, GWASCatalogAssociations]: + studies: StudyIndexGWASCatalog, + associations: StudyLocusGWASCatalog, + ) -> Tuple[StudyIndexGWASCatalog, StudyLocusGWASCatalog]: """Splitting multi-trait GWAS Catalog studies. If assigned disease of the study and the association don't agree, we assume the study needs to be split. Then disease EFOs, trait names and study ID are consolidated Args: - studies (GWASCatalogStudyIndex): GWAS Catalog studies. + studies (StudyIndexGWASCatalog): GWAS Catalog studies. associations (StudyLocusGWASCatalog): GWAS Catalog associations. Returns: - A tuple of the split associations and studies. + Tuple[StudyIndexGWASCatalog, StudyLocusGWASCatalog]: Split studies and associations. """ # Composite of studies and associations to resolve scattered information st_ass = ( @@ -132,5 +132,5 @@ def split( st_ass.select( "updatedStudyId", "studyId", "subStudyDescription" ).distinct() - )._qc_ambiguous_study(), + ).qc_ambiguous_study(), ) diff --git a/src/otg/datasource/gwas_catalog/summary_statistics.py b/src/otg/datasource/gwas_catalog/summary_statistics.py index 046c88810..94ac3027e 100644 --- a/src/otg/datasource/gwas_catalog/summary_statistics.py +++ b/src/otg/datasource/gwas_catalog/summary_statistics.py @@ -2,21 +2,52 @@ from __future__ import annotations +import re from dataclasses import dataclass from typing import TYPE_CHECKING import pyspark.sql.functions as f import pyspark.sql.types as t -from otg.common.utils import ( - calculate_confidence_interval, - convert_odds_ratio_to_beta, - parse_pvalue, -) +from otg.common.spark_helpers import neglog_pvalue_to_mantissa_and_exponent +from otg.common.utils import convert_odds_ratio_to_beta, parse_pvalue from otg.dataset.summary_statistics import SummaryStatistics if TYPE_CHECKING: - from pyspark.sql import DataFrame + from pyspark.sql import SparkSession + + +def filename_to_study_identifier(path: str) -> str: + """Extract GWAS Catalog study identifier from path. + + There's an expectation that the filename has to have the GCST accession of the study. + + Args: + path(str): filename of the harmonized summary statistics. + + Returns: + str: GWAS Catalog stuy accession. + + Raises: + ValueError: If the path does not contain the GWAS Catalog study identifier. + + Examples: + >>> filename_to_study_identifier("http://ftp.ebi.ac.uk/pub/databases/gwas/summary_statistics/GCST006001-GCST007000/GCST006090/harmonised/29895819-GCST006090-HP_0000975.h.tsv.gz") + 'GCST006090' + >>> filename_to_study_identifier("wrong/path") + Traceback (most recent call last): + ... + ValueError: Path ("wrong/path") does not contain GWAS Catalog study identifier. + """ + file_name = path.split("/")[-1] + study_id_matches = re.search(r"(GCST\d+)", file_name) + + if not study_id_matches: + raise ValueError( + f'Path ("{path}") does not contain GWAS Catalog study identifier.' + ) + + return study_id_matches[0] @dataclass @@ -26,59 +57,134 @@ class GWASCatalogSummaryStatistics(SummaryStatistics): @classmethod def from_gwas_harmonized_summary_stats( cls: type[GWASCatalogSummaryStatistics], - sumstats_df: DataFrame, - study_id: str, + spark: SparkSession, + sumstats_file: str, ) -> GWASCatalogSummaryStatistics: """Create summary statistics object from summary statistics flatfile, harmonized by the GWAS Catalog. + Things got slightly complicated given the GWAS Catalog harmonization pipelines changed recently so we had to accomodate to + both formats. + Args: - sumstats_df (DataFrame): Harmonized dataset read as a spark dataframe from GWAS Catalog. - study_id (str): GWAS Catalog study accession. + spark (SparkSession): spark session + sumstats_file (str): list of GWAS Catalog summary stat files, with study ids in them. Returns: - SummaryStatistics + GWASCatalogSummaryStatistics: Summary statistics object. """ + sumstats_df = spark.read.csv(sumstats_file, sep="\t", header=True).withColumn( + # Parsing GWAS Catalog study identifier from filename: + "studyId", + f.lit(filename_to_study_identifier(sumstats_file)), + ) + + # Parsing variant id fields: + chromosome = ( + f.col("hm_chrom") + if "hm_chrom" in sumstats_df.columns + else f.col("chromosome") + ).cast(t.StringType()) + position = ( + f.col("hm_pos") + if "hm_pos" in sumstats_df.columns + else f.col("base_pair_location") + ).cast(t.IntegerType()) + ref_allele = ( + f.col("hm_other_allele") + if "hm_other_allele" in sumstats_df.columns + else f.col("other_allele") + ) + alt_allele = ( + f.col("hm_effect_allele") + if "hm_effect_allele" in sumstats_df.columns + else f.col("effect_allele") + ) + + # Parsing p-value (get a tuple with mantissa and exponent): + p_value_expression = ( + parse_pvalue(f.col("p_value")) + if "p_value" in sumstats_df.columns + else neglog_pvalue_to_mantissa_and_exponent(f.col("neg_log_10_p_value")) + ) + # The effect allele frequency is an optional column, we have to test if it is there: - allele_frequency_expression = ( - f.col("hm_effect_allele_frequency").cast(t.FloatType()) - if "hm_effect_allele_frequency" in sumstats_df.columns + allele_frequency = ( + f.col("effect_allele_frequency") + if "effect_allele_frequency" in sumstats_df.columns else f.lit(None) + ).cast(t.FloatType()) + + # Do we have sample size? This expression captures 99.7% of sample size columns. + sample_size = (f.col("n") if "n" in sumstats_df.columns else f.lit(None)).cast( + t.IntegerType() ) + # Depending on the input, we might have beta, but the column might not be there at all also old format calls differently: + beta_expression = ( + f.col("hm_beta") + if "hm_beta" in sumstats_df.columns + else f.col("beta") + if "beta" in sumstats_df.columns + # If no column, create one: + else f.lit(None) + ).cast(t.DoubleType()) + + # We might have odds ratio or hazard ratio, wich are basically the same: + odds_ratio_expression = ( + f.col("hm_odds_ratio") + if "hm_odds_ratio" in sumstats_df.columns + else f.col("odds_ratio") + if "odds_ratio" in sumstats_df.columns + else f.col("hazard_ratio") + if "hazard_ratio" in sumstats_df.columns + # If no column, create one: + else f.lit(None) + ).cast(t.DoubleType()) + + # Does the file have standard error column? + standard_error = ( + f.col("standard_error") + if "standard_error" in sumstats_df.columns + else f.lit(None) + ).cast(t.DoubleType()) + # Processing columns of interest: processed_sumstats_df = ( sumstats_df # Dropping rows which doesn't have proper position: - .filter(f.col("hm_pos").cast(t.IntegerType()).isNotNull()) .select( - # Adding study identifier: - f.lit(study_id).cast(t.StringType()).alias("studyId"), + "studyId", # Adding variant identifier: - f.col("hm_variant_id").alias("variantId"), - f.col("hm_chrom").alias("chromosome"), - f.col("hm_pos").cast(t.IntegerType()).alias("position"), + f.concat_ws( + "_", + chromosome, + position, + ref_allele, + alt_allele, + ).alias("variantId"), + chromosome.alias("chromosome"), + position.alias("position"), # Parsing p-value mantissa and exponent: - *parse_pvalue(f.col("p_value")), + *p_value_expression, # Converting/calculating effect and confidence interval: *convert_odds_ratio_to_beta( - f.col("hm_beta").cast(t.DoubleType()), - f.col("hm_odds_ratio").cast(t.DoubleType()), - f.col("standard_error").cast(t.DoubleType()), + beta_expression, + odds_ratio_expression, + standard_error, ), - allele_frequency_expression.alias("effectAlleleFrequencyFromSource"), + allele_frequency.alias("effectAlleleFrequencyFromSource"), + sample_size.alias("sampleSize"), ) - # The previous select expression generated the necessary fields for calculating the confidence intervals: - .select( - "*", - *calculate_confidence_interval( - f.col("pValueMantissa"), - f.col("pValueExponent"), - f.col("beta"), - f.col("standardError"), - ), + .filter( + # Dropping associations where no harmonized position is available: + f.col("position").isNotNull() + & + # We are not interested in associations with zero effect: + (f.col("beta") != 0) ) - .repartition(200, "chromosome") - .sortWithinPartitions("position") + .orderBy(f.col("chromosome"), f.col("position")) + # median study size is 200Mb, max is 2.6Gb + .repartition(20) ) # Initializing summary statistics object: diff --git a/src/otg/datasource/intervals/andersson.py b/src/otg/datasource/intervals/andersson.py index 67a3f01d7..92eb1c025 100644 --- a/src/otg/datasource/intervals/andersson.py +++ b/src/otg/datasource/intervals/andersson.py @@ -18,12 +18,20 @@ from otg.dataset.gene_index import GeneIndex -class IntervalsAndersson(Intervals): +class IntervalsAndersson: """Interval dataset from Andersson et al. 2014.""" @staticmethod - def read_andersson(spark: SparkSession, path: str): - """Read andersson2014 dataset.""" + def read(spark: SparkSession, path: str) -> DataFrame: + """Read andersson2014 dataset. + + Args: + spark (SparkSession): Spark session + path (str): Path to the dataset + + Returns: + DataFrame: Raw Andersson et al. dataframe + """ input_schema = t.StructType.fromJson( json.loads( pkg_resources.read_text(schemas, "andersson2014.json", encoding="utf-8") @@ -47,8 +55,7 @@ def parse( """Parse Andersson et al. 2014 dataset. Args: - session (Session): session - path (str): Path to dataset + raw_anderson_df (DataFrame): Raw Andersson et al. dataset gene_index (GeneIndex): Gene index lift (LiftOverSpark): LiftOverSpark instance @@ -93,7 +100,7 @@ def parse( .orderBy("chrom", "start") ) - return cls( + return Intervals( _df=( # Lift over the intervals: lift.convert_intervals(parsed_anderson_df, "chrom", "start", "end") diff --git a/src/otg/datasource/intervals/javierre.py b/src/otg/datasource/intervals/javierre.py index 7fc7e858e..2070f166f 100644 --- a/src/otg/datasource/intervals/javierre.py +++ b/src/otg/datasource/intervals/javierre.py @@ -15,11 +15,11 @@ from otg.dataset.gene_index import GeneIndex -class IntervalsJavierre(Intervals): +class IntervalsJavierre: """Interval dataset from Javierre et al. 2016.""" @staticmethod - def read_javierre(spark: SparkSession, path: str): + def read(spark: SparkSession, path: str) -> DataFrame: """Read Javierre dataset. Args: @@ -27,7 +27,7 @@ def read_javierre(spark: SparkSession, path: str): path (str): Path to dataset Returns: - DataFrame: DataFrame with raw Javierre data + DataFrame: Raw Javierre dataset """ return spark.read.parquet(path) @@ -41,8 +41,7 @@ def parse( """Parse Javierre et al. 2016 dataset. Args: - session (Session): session - path (str): Path to dataset + javierre_raw (DataFrame): Raw Javierre data gene_index (GeneIndex): Gene index lift (LiftOverSpark): LiftOverSpark instance @@ -140,7 +139,7 @@ def parse( ) # Joining back the data: - return cls( + return Intervals( _df=( javierre_remapped.join( unique_intervals_with_genes, diff --git a/src/otg/datasource/intervals/jung.py b/src/otg/datasource/intervals/jung.py index 3ca26f026..8ae7310d2 100644 --- a/src/otg/datasource/intervals/jung.py +++ b/src/otg/datasource/intervals/jung.py @@ -15,11 +15,11 @@ from otg.dataset.gene_index import GeneIndex -class IntervalsJung(Intervals): +class IntervalsJung: """Interval dataset from Jung et al. 2019.""" @staticmethod - def read_jung(spark: SparkSession, path: str): + def read(spark: SparkSession, path: str) -> DataFrame: """Read jung dataset. Args: @@ -53,7 +53,7 @@ def parse( pmid = "31501517" # Lifting over the coordinates: - return cls( + return Intervals( _df=( jung_raw.withColumn( "interval", f.split(f.col("Interacting_fragment"), r"\.") diff --git a/src/otg/datasource/intervals/thurnman.py b/src/otg/datasource/intervals/thurman.py similarity index 86% rename from src/otg/datasource/intervals/thurnman.py rename to src/otg/datasource/intervals/thurman.py index 18587066d..46a814500 100644 --- a/src/otg/datasource/intervals/thurnman.py +++ b/src/otg/datasource/intervals/thurman.py @@ -15,19 +15,19 @@ from otg.dataset.gene_index import GeneIndex -class IntervalsThurnman(Intervals): +class IntervalsThurman: """Interval dataset from Thurman et al. 2012.""" @staticmethod - def read_thurnman(spark: SparkSession, path: str): - """Read thurnman dataset. + def read(spark: SparkSession, path: str) -> DataFrame: + """Read thurman dataset. Args: spark (SparkSession): Spark session path (str): Path to dataset Returns: - DataFrame: DataFrame with raw thurnman data + DataFrame: DataFrame with raw thurman data """ thurman_schema = t.StructType( [ @@ -45,28 +45,28 @@ def read_thurnman(spark: SparkSession, path: str): @classmethod def parse( - cls: type[IntervalsThurnman], - thurnman_raw: DataFrame, + cls: type[IntervalsThurman], + thurman_raw: DataFrame, gene_index: GeneIndex, lift: LiftOverSpark, ) -> Intervals: """Parse the Thurman et al. 2012 dataset. Args: - thurnman_raw (DataFrame): raw Thurman et al. 2019 dataset + thurman_raw (DataFrame): raw Thurman et al. 2019 dataset gene_index (GeneIndex): gene index lift (LiftOverSpark): LiftOverSpark instance Returns: - Intervals: Interval dataset containing Thurnman et al. 2012 data + Intervals: Interval dataset containing Thurman et al. 2012 data """ dataset_name = "thurman2012" experiment_type = "dhscor" pmid = "22955617" - return cls( + return Intervals( _df=( - thurnman_raw.select( + thurman_raw.select( f.regexp_replace(f.col("chrom"), "chr", "").alias("chrom"), "start", "end", @@ -100,5 +100,5 @@ def parse( ) .distinct() ), - _schema=cls.get_schema(), + _schema=Intervals.get_schema(), ) diff --git a/src/otg/datasource/open_targets/l2g_gold_standard.py b/src/otg/datasource/open_targets/l2g_gold_standard.py new file mode 100644 index 000000000..b51099cff --- /dev/null +++ b/src/otg/datasource/open_targets/l2g_gold_standard.py @@ -0,0 +1,123 @@ +"""Parser for OTPlatform locus to gene gold standards curation.""" +from __future__ import annotations + +from typing import Type + +import pyspark.sql.functions as f +from pyspark.sql import DataFrame + +from otg.dataset.l2g_gold_standard import L2GGoldStandard +from otg.dataset.study_locus import StudyLocus +from otg.dataset.v2g import V2G + + +class OpenTargetsL2GGoldStandard: + """Parser for OTGenetics locus to gene gold standards curation. + + The curation is processed to generate a dataset with 2 labels: + - Gold Standard Positive (GSP): When the lead variant is part of a curated list of GWAS loci with known gene-trait associations. + - Gold Standard Negative (GSN): When the lead variant is not part of a curated list of GWAS loci with known gene-trait associations but is in the vicinity of a gene's TSS. + """ + + LOCUS_TO_GENE_WINDOW = 500_000 + + @classmethod + def parse_positive_curation( + cls: Type[OpenTargetsL2GGoldStandard], gold_standard_curation: DataFrame + ) -> DataFrame: + """Parse positive set from gold standard curation. + + Args: + gold_standard_curation (DataFrame): Gold standard curation dataframe + + Returns: + DataFrame: Positive set + """ + return ( + gold_standard_curation.filter( + f.col("gold_standard_info.highest_confidence").isin(["High", "Medium"]) + ) + .select( + f.col("association_info.otg_id").alias("studyId"), + f.col("gold_standard_info.gene_id").alias("geneId"), + f.concat_ws( + "_", + f.col("sentinel_variant.locus_GRCh38.chromosome"), + f.col("sentinel_variant.locus_GRCh38.position"), + f.col("sentinel_variant.alleles.reference"), + f.col("sentinel_variant.alleles.alternative"), + ).alias("variantId"), + f.col("metadata.set_label").alias("source"), + ) + .withColumn( + "studyLocusId", + StudyLocus.assign_study_locus_id(f.col("studyId"), f.col("variantId")), + ) + .groupBy("studyLocusId", "studyId", "variantId", "geneId") + .agg(f.collect_set("source").alias("sources")) + ) + + @classmethod + def expand_gold_standard_with_negatives( + cls: Type[OpenTargetsL2GGoldStandard], positive_set: DataFrame, v2g: V2G + ) -> DataFrame: + """Create full set of positive and negative evidence of locus to gene associations. + + Negative evidence consists of all genes within a window of 500kb of the lead variant that are not in the positive set. + + Args: + positive_set (DataFrame): Positive set from curation + v2g (V2G): Variant to gene dataset to bring distance between a variant and a gene's TSS + + Returns: + DataFrame: Full set of positive and negative evidence of locus to gene associations + """ + return ( + positive_set.withColumnRenamed("geneId", "curated_geneId") + .join( + v2g.df.selectExpr( + "variantId", "geneId as non_curated_geneId", "distance" + ).filter(f.col("distance") <= cls.LOCUS_TO_GENE_WINDOW), + on="variantId", + how="left", + ) + .withColumn( + "goldStandardSet", + f.when( + (f.col("curated_geneId") == f.col("non_curated_geneId")) + # to keep the positives that are outside the v2g dataset + | (f.col("non_curated_geneId").isNull()), + f.lit(L2GGoldStandard.GS_POSITIVE_LABEL), + ).otherwise(L2GGoldStandard.GS_NEGATIVE_LABEL), + ) + .withColumn( + "geneId", + f.when( + f.col("goldStandardSet") == L2GGoldStandard.GS_POSITIVE_LABEL, + f.col("curated_geneId"), + ).otherwise(f.col("non_curated_geneId")), + ) + .drop("distance", "curated_geneId", "non_curated_geneId") + ) + + @classmethod + def as_l2g_gold_standard( + cls: type[OpenTargetsL2GGoldStandard], + gold_standard_curation: DataFrame, + v2g: V2G, + ) -> L2GGoldStandard: + """Initialise L2GGoldStandard from source dataset. + + Args: + gold_standard_curation (DataFrame): Gold standard curation dataframe, extracted from https://github.com/opentargets/genetics-gold-standards + v2g (V2G): Variant to gene dataset to bring distance between a variant and a gene's TSS + + Returns: + L2GGoldStandard: L2G Gold Standard dataset. False negatives have not yet been removed. + """ + return L2GGoldStandard( + _df=cls.parse_positive_curation(gold_standard_curation).transform( + cls.expand_gold_standard_with_negatives, v2g + ), + _schema=L2GGoldStandard.get_schema(), + ) diff --git a/src/otg/datasource/open_targets/target.py b/src/otg/datasource/open_targets/target.py index 3d334d34d..c4d6a3803 100644 --- a/src/otg/datasource/open_targets/target.py +++ b/src/otg/datasource/open_targets/target.py @@ -8,7 +8,14 @@ class OpenTargetsTarget: - """Parser for OTPlatform target dataset.""" + """Parser for OTPlatform target dataset. + + Genomic data from Open Targets provides gene identification and genomic coordinates that are integrated into the gene index of our ETL pipeline. + + The EMBL-EBI Ensembl database is used as a source for human targets in the Platform, with the Ensembl gene ID as the primary identifier. The criteria for target inclusion is: + - Genes from all biotypes encoded in canonical chromosomes + - Genes in alternative assemblies encoding for a reviewed protein product. + """ @staticmethod def _get_gene_tss(strand_col: Column, start_col: Column, end_col: Column) -> Column: @@ -37,7 +44,9 @@ def _get_gene_tss(strand_col: Column, start_col: Column, end_col: Column) -> Col return f.when(strand_col == 1, start_col).when(strand_col == -1, end_col) @classmethod - def as_gene_index(cls: type[GeneIndex], target_index: DataFrame) -> GeneIndex: + def as_gene_index( + cls: type[OpenTargetsTarget], target_index: DataFrame + ) -> GeneIndex: """Initialise GeneIndex from source dataset. Args: @@ -49,6 +58,10 @@ def as_gene_index(cls: type[GeneIndex], target_index: DataFrame) -> GeneIndex: return GeneIndex( _df=target_index.select( f.coalesce(f.col("id"), f.lit("unknown")).alias("geneId"), + "approvedSymbol", + "approvedName", + "biotype", + f.col("obsoleteSymbols.label").alias("obsoleteSymbols"), f.coalesce(f.col("genomicLocation.chromosome"), f.lit("unknown")).alias( "chromosome" ), diff --git a/src/otg/datasource/ukbiobank/study_index.py b/src/otg/datasource/ukbiobank/study_index.py index 46322df92..7ef33f46c 100644 --- a/src/otg/datasource/ukbiobank/study_index.py +++ b/src/otg/datasource/ukbiobank/study_index.py @@ -11,7 +11,7 @@ from pyspark.sql import DataFrame -class UKBiobankStudyIndex(StudyIndex): +class UKBiobankStudyIndex: """Study index dataset from UKBiobank. The following information is extracted: @@ -36,7 +36,7 @@ class UKBiobankStudyIndex(StudyIndex): def from_source( cls: type[UKBiobankStudyIndex], ukbiobank_studies: DataFrame, - ) -> UKBiobankStudyIndex: + ) -> StudyIndex: """This function ingests study level metadata from UKBiobank. The University of Michigan SAIGE analysis (N=1281) utilized PheCode derived phenotypes and a novel method that ensures accurate P values, even with highly unbalanced case-control ratios (Zhou et al., 2018). @@ -47,7 +47,7 @@ def from_source( ukbiobank_studies (DataFrame): UKBiobank study manifest file loaded in spark session. Returns: - UKBiobankStudyIndex: Annotated UKBiobank study table. + StudyIndex: Annotated UKBiobank study table. """ return StudyIndex( _df=( @@ -76,10 +76,10 @@ def from_source( "publicationJournal" ), f.col("n_total").cast("string").alias("initialSampleSize"), - f.col("n_cases").cast("long").alias("nCases"), + f.col("n_cases").cast("integer").alias("nCases"), f.array( f.struct( - f.col("n_total").cast("long").alias("sampleSize"), + f.col("n_total").cast("integer").alias("sampleSize"), f.concat(f.lit("European="), f.col("n_total")).alias( "ancestry" ), @@ -103,7 +103,7 @@ def from_source( ) .withColumn( "ldPopulationStructure", - cls.aggregate_and_map_ancestries(f.col("discoverySamples")), + StudyIndex.aggregate_and_map_ancestries(f.col("discoverySamples")), ) ), _schema=StudyIndex.get_schema(), diff --git a/src/otg/eqtl_catalogue.py b/src/otg/eqtl_catalogue.py new file mode 100644 index 000000000..c57f95ed3 --- /dev/null +++ b/src/otg/eqtl_catalogue.py @@ -0,0 +1,67 @@ +"""Step to run eQTL Catalogue study table ingestion.""" + +from __future__ import annotations + +from dataclasses import dataclass + +from omegaconf import MISSING + +from otg.common.session import Session +from otg.datasource.eqtl_catalogue.study_index import EqtlCatalogueStudyIndex +from otg.datasource.eqtl_catalogue.summary_stats import EqtlCatalogueSummaryStats + + +@dataclass +class EqtlCatalogueStep: + """eQTL Catalogue ingestion step. + + Attributes: + session (Session): Session object. + eqtl_catalogue_paths_imported (str): eQTL Catalogue input files for the harmonised and imported data. + eqtl_catalogue_study_index_out (str): Output path for the eQTL Catalogue study index dataset. + eqtl_catalogue_summary_stats_out (str): Output path for the eQTL Catalogue summary stats. + """ + + session: Session = MISSING + + eqtl_catalogue_paths_imported: str = MISSING + eqtl_catalogue_study_index_out: str = MISSING + eqtl_catalogue_summary_stats_out: str = MISSING + + def __post_init__(self: EqtlCatalogueStep) -> None: + """Run step.""" + # Fetch study index. + df = self.session.spark.read.option("delimiter", "\t").csv( + self.eqtl_catalogue_paths_imported, header=True + ) + # Process partial study index. At this point, it is not complete because we don't have the gene IDs, which we + # will only get once the summary stats are ingested. + study_index_df = EqtlCatalogueStudyIndex.from_source(df).df + + # Fetch summary stats. + input_filenames = [row.summarystatsLocation for row in study_index_df.collect()] + summary_stats_df = ( + self.session.spark.read.option("delimiter", "\t") + .csv(input_filenames, header=True) + .repartition(1280) + ) + # Process summary stats. + summary_stats_df = EqtlCatalogueSummaryStats.from_source(summary_stats_df).df + + # Add geneId column to the study index. + study_index_df = EqtlCatalogueStudyIndex.add_gene_id_column( + study_index_df, + summary_stats_df, + ).df + + # Write study index. + study_index_df.write.mode(self.session.write_mode).parquet( + self.eqtl_catalogue_study_index_out + ) + # Write summary stats. + ( + summary_stats_df.sortWithinPartitions("position") + .write.partitionBy("chromosome") + .mode(self.session.write_mode) + .parquet(self.eqtl_catalogue_summary_stats_out) + ) diff --git a/src/otg/finngen.py b/src/otg/finngen.py deleted file mode 100644 index b62762598..000000000 --- a/src/otg/finngen.py +++ /dev/null @@ -1,56 +0,0 @@ -"""Step to run FinnGen study table ingestion.""" - -from __future__ import annotations - -from dataclasses import dataclass -from urllib.request import urlopen - -from otg.common.session import Session -from otg.config import FinnGenStepConfig -from otg.datasource.finngen.study_index import FinnGenStudyIndex -from otg.datasource.finngen.summary_stats import FinnGenSummaryStats - - -@dataclass -class FinnGenStep(FinnGenStepConfig): - """FinnGen ingestion step.""" - - session: Session = Session() - - def run(self: FinnGenStep) -> None: - """Run FinnGen ingestion step.""" - # Read the JSON data from the URL. - json_data = urlopen(self.finngen_phenotype_table_url).read().decode("utf-8") - rdd = self.session.spark.sparkContext.parallelize([json_data]) - df = self.session.spark.read.json(rdd) - - # Parse the study index data. - finngen_studies = FinnGenStudyIndex.from_source( - df, - self.finngen_release_prefix, - self.finngen_sumstat_url_prefix, - self.finngen_sumstat_url_suffix, - ) - - # Write the study index output. - finngen_studies.df.write.mode(self.session.write_mode).parquet( - self.finngen_study_index_out - ) - - # Prepare list of files for ingestion. - input_filenames = [ - row.summarystatsLocation for row in finngen_studies.collect() - ] - summary_stats_df = self.session.spark.read.option("delimiter", "\t").csv( - input_filenames, header=True - ) - - # Specify data processing instructions. - summary_stats_df = FinnGenSummaryStats.from_finngen_harmonized_summary_stats( - summary_stats_df - ).df - - # Sort and partition for output. - summary_stats_df.sortWithinPartitions("position").write.partitionBy( - "studyId", "chromosome" - ).mode(self.session.write_mode).parquet(self.finngen_summary_stats_out) diff --git a/src/otg/finngen_studies.py b/src/otg/finngen_studies.py new file mode 100644 index 000000000..9a1d800e8 --- /dev/null +++ b/src/otg/finngen_studies.py @@ -0,0 +1,31 @@ +"""Step to run FinnGen study table ingestion.""" + +from __future__ import annotations + +from dataclasses import dataclass + +from omegaconf import MISSING + +from otg.common.session import Session +from otg.datasource.finngen.study_index import FinnGenStudyIndex + + +@dataclass +class FinnGenStudiesStep: + """FinnGen study index generation step. + + Attributes: + session (Session): Session object. + finngen_study_index_out (str): Output path for the FinnGen study index dataset. + """ + + session: Session = MISSING + finngen_study_index_out: str = MISSING + finngen_summary_stats_out: str = MISSING + + def __post_init__(self: FinnGenStudiesStep) -> None: + """Run step.""" + # Fetch study index. + FinnGenStudyIndex.from_source(self.session.spark).df.write.mode( + self.session.write_mode + ).parquet(self.finngen_study_index_out) diff --git a/src/otg/finngen_sumstat_preprocess.py b/src/otg/finngen_sumstat_preprocess.py new file mode 100644 index 000000000..959c000dc --- /dev/null +++ b/src/otg/finngen_sumstat_preprocess.py @@ -0,0 +1,36 @@ +"""Step to run FinnGen study table ingestion.""" + +from __future__ import annotations + +from dataclasses import dataclass + +from omegaconf import MISSING + +from otg.common.session import Session +from otg.datasource.finngen.summary_stats import FinnGenSummaryStats + + +@dataclass +class FinnGenSumstatPreprocessStep: + """FinnGen sumstats preprocessing. + + Attributes: + session (Session): Session object. + finngen_study_index_out (str): Output path for the FinnGen study index dataset. + finngen_summary_stats_out (str): Output path for the FinnGen summary statistics. + """ + + session: Session = MISSING + raw_sumstats_path: str = MISSING + out_sumstats_path: str = MISSING + + def __post_init__(self: FinnGenSumstatPreprocessStep) -> None: + """Run step.""" + # Process summary stats. + ( + FinnGenSummaryStats.from_source( + self.session.spark, raw_file=self.raw_sumstats_path + ) + .df.write.mode(self.session.write_mode) + .parquet(self.out_sumstats_path) + ) diff --git a/src/otg/gene_index.py b/src/otg/gene_index.py index 90d23553e..4a2cc34c1 100644 --- a/src/otg/gene_index.py +++ b/src/otg/gene_index.py @@ -3,22 +3,30 @@ from dataclasses import dataclass +from omegaconf import MISSING + from otg.common.session import Session -from otg.config import GeneIndexStepConfig from otg.datasource.open_targets.target import OpenTargetsTarget @dataclass -class GeneIndexStep(GeneIndexStepConfig): +class GeneIndexStep: """Gene index step. This step generates a gene index dataset from an Open Targets Platform target dataset. + + Attributes: + session (Session): Session object. + target_path (str): Open targets Platform target dataset path. + gene_index_path (str): Output gene index path. """ - session: Session = Session() + session: Session = MISSING + target_path: str = MISSING + gene_index_path: str = MISSING - def run(self: GeneIndexStep) -> None: - """Run Target index step.""" + def __post_init__(self: GeneIndexStep) -> None: + """Run step.""" # Extract platform_target = self.session.spark.read.parquet(self.target_path) # Transform diff --git a/src/otg/gwas_catalog.py b/src/otg/gwas_catalog.py deleted file mode 100644 index a81c7c5f4..000000000 --- a/src/otg/gwas_catalog.py +++ /dev/null @@ -1,71 +0,0 @@ -"""Step to generate variant annotation dataset.""" -from __future__ import annotations - -from dataclasses import dataclass - -import hail as hl - -from otg.common.session import Session -from otg.config import GWASCatalogStepConfig -from otg.dataset.ld_index import LDIndex -from otg.dataset.variant_annotation import VariantAnnotation -from otg.datasource.gwas_catalog.associations import GWASCatalogAssociations -from otg.datasource.gwas_catalog.study_index import GWASCatalogStudyIndex -from otg.datasource.gwas_catalog.study_splitter import GWASCatalogStudySplitter -from otg.method.ld import LDAnnotator -from otg.method.pics import PICS - - -@dataclass -class GWASCatalogStep(GWASCatalogStepConfig): - """GWAS Catalog step.""" - - session: Session = Session() - - def run(self: GWASCatalogStep) -> None: - """Run GWAS Catalog ingestion step to extract GWASCatalog Study and StudyLocus tables.""" - hl.init(sc=self.session.spark.sparkContext, log="/dev/null") - # All inputs: - # Variant annotation dataset - va = VariantAnnotation.from_parquet(self.session, self.variant_annotation_path) - # GWAS Catalog raw study information - catalog_studies = self.session.spark.read.csv( - self.catalog_studies_file, sep="\t", header=True - ) - # GWAS Catalog ancestry information - ancestry_lut = self.session.spark.read.csv( - self.catalog_ancestry_file, sep="\t", header=True - ) - # GWAS Catalog summary statistics information - sumstats_lut = self.session.spark.read.csv( - self.catalog_sumstats_lut, sep="\t", header=False - ) - # GWAS Catalog raw association information - catalog_associations = self.session.spark.read.csv( - self.catalog_associations_file, sep="\t", header=True - ) - # LD index dataset - ld_index = LDIndex.from_parquet(self.session, self.ld_index_path) - - # Transform: - # GWAS Catalog study index and study-locus splitted - study_index, study_locus = GWASCatalogStudySplitter.split( - GWASCatalogStudyIndex.from_source( - catalog_studies, ancestry_lut, sumstats_lut - ), - GWASCatalogAssociations.from_source(catalog_associations, va), - ) - - # Annotate LD information and clump associations dataset - study_locus_ld = LDAnnotator.ld_annotate(study_locus, study_index, ld_index) - - # Fine-mapping LD-clumped study-locus using PICS - finemapped_study_locus = PICS.finemap(study_locus_ld).annotate_credible_sets() - - # Write: - study_index.df.write.mode(self.session.write_mode).parquet( - self.catalog_studies_out - ) - finemapped_study_locus.df.write.mode(self.session.write_mode).parquet( - self.catalog_associations_out - ) diff --git a/src/otg/gwas_catalog_ingestion.py b/src/otg/gwas_catalog_ingestion.py new file mode 100644 index 000000000..bea0bbed2 --- /dev/null +++ b/src/otg/gwas_catalog_ingestion.py @@ -0,0 +1,75 @@ +"""Step to process GWAS Catalog associations and study table.""" +from __future__ import annotations + +from dataclasses import dataclass + +from omegaconf import MISSING + +from otg.common.session import Session +from otg.dataset.variant_annotation import VariantAnnotation +from otg.datasource.gwas_catalog.associations import ( + GWASCatalogCuratedAssociationsParser, +) +from otg.datasource.gwas_catalog.study_index import StudyIndexGWASCatalogParser +from otg.datasource.gwas_catalog.study_splitter import GWASCatalogStudySplitter + + +@dataclass +class GWASCatalogIngestionStep: + """GWAS Catalog ingestion step to extract GWASCatalog Study and StudyLocus tables. + + !!!note This step currently only processes the GWAS Catalog curated list of top hits. + + Attributes: + session (Session): Session object. + catalog_study_files (list[str]): List of raw GWAS catalog studies file. + catalog_ancestry_files (list[str]): List of raw ancestry annotations files from GWAS Catalog. + catalog_sumstats_lut (str): GWAS Catalog summary statistics lookup table. + catalog_associations_file (str): Raw GWAS catalog associations file. + variant_annotation_path (str): Input variant annotation path. + ld_populations (list): List of populations to include. + catalog_studies_out (str): Output GWAS catalog studies path. + catalog_associations_out (str): Output GWAS catalog associations path. + """ + + session: Session = MISSING + catalog_study_files: list[str] = MISSING + catalog_ancestry_files: list[str] = MISSING + catalog_sumstats_lut: str = MISSING + catalog_associations_file: str = MISSING + variant_annotation_path: str = MISSING + catalog_studies_out: str = MISSING + catalog_associations_out: str = MISSING + + def __post_init__(self: GWASCatalogIngestionStep) -> None: + """Run step.""" + # Extract + va = VariantAnnotation.from_parquet(self.session, self.variant_annotation_path) + catalog_studies = self.session.spark.read.csv( + self.catalog_study_files, sep="\t", header=True + ) + ancestry_lut = self.session.spark.read.csv( + self.catalog_ancestry_files, sep="\t", header=True + ) + sumstats_lut = self.session.spark.read.csv( + self.catalog_sumstats_lut, sep="\t", header=False + ) + catalog_associations = self.session.spark.read.csv( + self.catalog_associations_file, sep="\t", header=True + ).persist() + + # Transform + study_index, study_locus = GWASCatalogStudySplitter.split( + StudyIndexGWASCatalogParser.from_source( + catalog_studies, ancestry_lut, sumstats_lut + ), + GWASCatalogCuratedAssociationsParser.from_source(catalog_associations, va), + ) + + # Load + study_index.df.write.mode(self.session.write_mode).parquet( + self.catalog_studies_out + ) + study_locus.df.write.mode(self.session.write_mode).parquet( + self.catalog_associations_out + ) diff --git a/src/otg/gwas_catalog_sumstat_preprocess.py b/src/otg/gwas_catalog_sumstat_preprocess.py index 2a3584f78..682aed1cf 100644 --- a/src/otg/gwas_catalog_sumstat_preprocess.py +++ b/src/otg/gwas_catalog_sumstat_preprocess.py @@ -3,34 +3,34 @@ from dataclasses import dataclass +from omegaconf import MISSING + from otg.common.session import Session -from otg.config import GWASCatalogSumstatsPreprocessConfig from otg.datasource.gwas_catalog.summary_statistics import GWASCatalogSummaryStatistics @dataclass -class GWASCatalogSumstatsPreprocessStep(GWASCatalogSumstatsPreprocessConfig): - """Step to preprocess GWAS Catalog harmonised summary stats.""" +class GWASCatalogSumstatsPreprocessStep: + """Step to preprocess GWAS Catalog harmonised summary stats. + + Attributes: + session (Session): Session object. + raw_sumstats_path (str): Input raw GWAS Catalog summary statistics path. + out_sumstats_path (str): Output GWAS Catalog summary statistics path. + """ - session: Session = Session() + session: Session = MISSING + raw_sumstats_path: str = MISSING + out_sumstats_path: str = MISSING - def run(self: GWASCatalogSumstatsPreprocessStep) -> None: - """Run Step.""" + def __post_init__(self: GWASCatalogSumstatsPreprocessStep) -> None: + """Run step.""" # Extract self.session.logger.info(self.raw_sumstats_path) self.session.logger.info(self.out_sumstats_path) - self.session.logger.info(self.study_id) - - # Reading dataset: - raw_dataset = self.session.spark.read.csv( - self.raw_sumstats_path, header=True, sep="\t" - ) - self.session.logger.info( - f"Number of single point associations: {raw_dataset.count()}" - ) # Processing dataset: GWASCatalogSummaryStatistics.from_gwas_harmonized_summary_stats( - raw_dataset, self.study_id + self.session.spark, self.raw_sumstats_path ).df.write.mode(self.session.write_mode).parquet(self.out_sumstats_path) self.session.logger.info("Processing dataset successfully completed.") diff --git a/src/otg/l2g.py b/src/otg/l2g.py new file mode 100644 index 000000000..701bad308 --- /dev/null +++ b/src/otg/l2g.py @@ -0,0 +1,210 @@ +"""Step to run Locus to Gene either for inference or for training.""" +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Any + +import pyspark.sql.functions as f +import sklearn +from omegaconf import MISSING +from xgboost.spark import SparkXGBClassifier + +from otg.common.session import Session + +# from otg.dataset.colocalisation import Colocalisation +from otg.dataset.l2g_feature_matrix import L2GFeatureMatrix +from otg.dataset.l2g_gold_standard import L2GGoldStandard +from otg.dataset.l2g_prediction import L2GPrediction +from otg.dataset.study_index import StudyIndex +from otg.dataset.study_locus import StudyLocus +from otg.dataset.study_locus_overlap import StudyLocusOverlap +from otg.dataset.v2g import V2G +from otg.method.l2g.model import LocusToGeneModel +from otg.method.l2g.trainer import LocusToGeneTrainer + + +@dataclass +class LocusToGeneStep: + """Locus to gene step. + + Attributes: + session (Session): Session object. + extended_spark_conf (dict[str, str] | None): Extended Spark configuration. + run_mode (str): One of "train" or "predict". + wandb_run_name (str | None): Name of the run to be tracked on W&B. + perform_cross_validation (bool): Whether to perform cross validation. + model_path (str | None): Path to save the model. + predictions_path (str | None): Path to save the predictions. + credible_set_path (str): Path to credible set Parquet files. + variant_gene_path (str): Path to variant to gene Parquet files. + colocalisation_path (str): Path to colocalisation Parquet files. + study_index_path (str): Path to study index Parquet files. + study_locus_overlap_path (str): Path to study locus overlap Parquet files. + gold_standard_curation_path (str | None): Path to gold standard curation JSON files. + gene_interactions_path (str | None): Path to gene interactions Parquet files. + features_list (list[str]): List of features to use. + hyperparameters (dict): Hyperparameters for the model. + """ + + extended_spark_conf: dict[str, str] | None = None + + session: Session = MISSING + run_mode: str = MISSING + wandb_run_name: str | None = None + perform_cross_validation: bool = False + model_path: str = MISSING + predictions_path: str = MISSING + credible_set_path: str = MISSING + variant_gene_path: str = MISSING + colocalisation_path: str = MISSING + study_index_path: str = MISSING + study_locus_overlap_path: str = MISSING + gold_standard_curation_path: str = MISSING + gene_interactions_path: str = MISSING + features_list: list[str] = field( + default_factory=lambda: [ + # average distance of all tagging variants to gene TSS + "distanceTssMean", + # # minimum distance of all tagging variants to gene TSS + "distanceTssMinimum", + # # maximum vep consequence score of the locus 95% credible set among all genes in the vicinity + "vepMaximumNeighborhood", + # # maximum vep consequence score of the locus 95% credible set split by gene + "vepMaximum", + # # max clpp for each (study, locus, gene) aggregating over all eQTLs + # "eqtlColocClppLocalMaximum", + # # max clpp for each (study, locus) aggregating over all eQTLs + # "eqtlColocClppNeighborhoodMaximum", + # # max log-likelihood ratio value for each (study, locus, gene) aggregating over all eQTLs + # "eqtlColocLlrLocalMaximum", + # # max log-likelihood ratio value for each (study, locus) aggregating over all eQTLs + # "eqtlColocLlrNeighborhoodMaximum", + # # max clpp for each (study, locus, gene) aggregating over all pQTLs + # "pqtlColocClppLocalMaximum", + # # max clpp for each (study, locus) aggregating over all pQTLs + # "pqtlColocClppNeighborhoodMaximum", + # # max log-likelihood ratio value for each (study, locus, gene) aggregating over all pQTLs + # "pqtlColocLlrLocalMaximum", + # # max log-likelihood ratio value for each (study, locus) aggregating over all pQTLs + # "pqtlColocLlrNeighborhoodMaximum", + # # max clpp for each (study, locus, gene) aggregating over all sQTLs + # "sqtlColocClppLocalMaximum", + # # max clpp for each (study, locus) aggregating over all sQTLs + # "sqtlColocClppNeighborhoodMaximum", + # # max log-likelihood ratio value for each (study, locus, gene) aggregating over all sQTLs + # "sqtlColocLlrLocalMaximum", + # # max log-likelihood ratio value for each (study, locus) aggregating over all sQTLs + # "sqtlColocLlrNeighborhoodMaximum", + ] + ) + hyperparameters: dict[str, Any] = field( + default_factory=lambda: { + "max_depth": 5, + "loss_function": "binary:logistic", + } + ) + + def __post_init__(self: LocusToGeneStep) -> None: + """Run step. + + Raises: + ValueError: if run_mode is not one of "train" or "predict". + """ + print("Sci-kit learn version: ", sklearn.__version__) # noqa: T201 + if self.run_mode not in ["train", "predict"]: + raise ValueError( + f"run_mode must be one of 'train' or 'predict', got {self.run_mode}" + ) + # Load common inputs + credible_set = StudyLocus.from_parquet( + self.session, self.credible_set_path, recursiveFileLookup=True + ) + studies = StudyIndex.from_parquet( + self.session, self.study_index_path, recursiveFileLookup=True + ) + v2g = V2G.from_parquet(self.session, self.variant_gene_path) + # coloc = Colocalisation.from_parquet(self.session, self.colocalisation_path) # TODO: run step + + if self.run_mode == "train": + # Process gold standard and L2G features + study_locus_overlap = StudyLocusOverlap.from_parquet( + self.session, self.study_locus_overlap_path + ) + gs_curation = self.session.spark.read.json(self.gold_standard_curation_path) + interactions = self.session.spark.read.parquet(self.gene_interactions_path) + + gold_standards = L2GGoldStandard.from_otg_curation( + gold_standard_curation=gs_curation, + v2g=v2g, + study_locus_overlap=study_locus_overlap, + interactions=interactions, + ) + + fm = L2GFeatureMatrix.generate_features( + features_list=self.features_list, + study_locus=credible_set, + study_index=studies, + variant_gene=v2g, + # colocalisation=coloc, + ) + + # Join and fill null values with 0 + data = L2GFeatureMatrix( + _df=fm.df.join( + f.broadcast( + gold_standards.df.drop("variantId", "studyId", "sources") + ), + on=["studyLocusId", "geneId"], + how="inner", + ), + _schema=L2GFeatureMatrix.get_schema(), + ).fill_na() + + # Instantiate classifier + estimator = SparkXGBClassifier( + eval_metric="logloss", + features_col="features", + label_col="label", + max_depth=5, + ) + l2g_model = LocusToGeneModel( + features_list=list(self.features_list), estimator=estimator + ) + if self.perform_cross_validation: + # Perform cross validation to extract what are the best hyperparameters + cv_folds = self.hyperparameters.get("cross_validation_folds", 5) + LocusToGeneTrainer.cross_validate( + l2g_model=l2g_model, + data=data, + num_folds=cv_folds, + ) + else: + # Train model + LocusToGeneTrainer.train( + data=data, + l2g_model=l2g_model, + features_list=list(self.features_list), + model_path=self.model_path, + evaluate=True, + wandb_run_name=self.wandb_run_name, + **self.hyperparameters, + ) + self.session.logger.info(self.model_path) + + if self.run_mode == "predict": + if not self.model_path or not self.predictions_path: + raise ValueError( + "model_path and predictions_path must be set for predict mode." + ) + predictions = L2GPrediction.from_credible_set( + self.model_path, + self.features_list, + credible_set, + studies, + v2g, + # coloc + ) + predictions.df.write.mode(self.session.write_mode).parquet( + self.predictions_path + ) + self.session.logger.info(self.predictions_path) diff --git a/src/otg/ld_index.py b/src/otg/ld_index.py index ccc416df5..54ab93066 100644 --- a/src/otg/ld_index.py +++ b/src/otg/ld_index.py @@ -4,36 +4,38 @@ from dataclasses import dataclass import hail as hl +from omegaconf import MISSING from otg.common.session import Session -from otg.config import LDIndexStepConfig from otg.datasource.gnomad.ld import GnomADLDMatrix @dataclass -class LDIndexStep(LDIndexStepConfig): +class LDIndexStep: """LD index step. !!! warning "This step is resource intensive" Suggested params: high memory machine, 5TB of boot disk, no SSDs. + Attributes: + session (Session): Session object. + min_r2 (float): Minimum r2 to consider when considering variants within a window. + ld_index_out (str): Output LD index path. """ - session: Session = Session() + session: Session = MISSING - def run(self: LDIndexStep) -> None: - """Run LD index dump step.""" + min_r2: float = 0.5 + ld_index_out: str = MISSING + + def __post_init__(self: LDIndexStep) -> None: + """Run step.""" hl.init(sc=self.session.spark.sparkContext, log="/dev/null") - ld_index = GnomADLDMatrix.as_ld_index( - self.ld_populations, - self.ld_matrix_template, - self.ld_index_raw_template, - self.grch37_to_grch38_chain_path, - self.min_r2, - ) - self.session.logger.info(f"Writing LD index to: {self.ld_index_out}") ( - ld_index.df.write.partitionBy("chromosome") + GnomADLDMatrix() + .as_ld_index(self.min_r2) + .df.write.partitionBy("chromosome") .mode(self.session.write_mode) - .parquet(f"{self.ld_index_out}") + .parquet(self.ld_index_out) ) + self.session.logger.info(self.ld_index_out) diff --git a/src/otg/method/clump.py b/src/otg/method/clump.py index abf0c6e2b..9f117fc01 100644 --- a/src/otg/method/clump.py +++ b/src/otg/method/clump.py @@ -32,7 +32,7 @@ def _is_lead_linked( variant_id (Column): Lead variant id p_value_exponent (Column): p-value exponent p_value_mantissa (Column): p-value mantissa - locus (Column): Credible set + ld_set (Column): Array of variants in LD with the lead variant Returns: Column: Boolean in which True indicates that the lead is linked to another tag in the same dataset. diff --git a/src/otg/method/colocalisation.py b/src/otg/method/colocalisation.py index 5787b61d6..6e72d570f 100644 --- a/src/otg/method/colocalisation.py +++ b/src/otg/method/colocalisation.py @@ -13,7 +13,7 @@ from otg.dataset.colocalisation import Colocalisation if TYPE_CHECKING: - from numpy import ndarray + from numpy.typing import NDArray from pyspark.sql import Column from otg.dataset.study_locus_overlap import StudyLocusOverlap @@ -105,14 +105,14 @@ class Coloc: """ @staticmethod - def _get_logsum(log_abf: ndarray) -> float: + def _get_logsum(log_abf: NDArray[np.float64]) -> float: """Calculates logsum of vector. This function calculates the log of the sum of the exponentiated logs taking out the max, i.e. insuring that the sum is not Inf Args: - log_abf (ndarray): log approximate bayes factor + log_abf (NDArray[np.float64]): log approximate bayes factor Returns: float: logsum @@ -127,11 +127,11 @@ def _get_logsum(log_abf: ndarray) -> float: return float(result) @staticmethod - def _get_posteriors(all_abfs: ndarray) -> DenseVector: + def _get_posteriors(all_abfs: NDArray[np.float64]) -> DenseVector: """Calculate posterior probabilities for each hypothesis. Args: - all_abfs (ndarray): h0-h4 bayes factors + all_abfs (NDArray[np.float64]): h0-h4 bayes factors Returns: DenseVector: Posterior diff --git a/src/otg/method/l2g/__init__.py b/src/otg/method/l2g/__init__.py new file mode 100644 index 000000000..c08bd9bd7 --- /dev/null +++ b/src/otg/method/l2g/__init__.py @@ -0,0 +1,3 @@ +"""Method classes for Locus-To-Gene.""" + +from __future__ import annotations diff --git a/src/otg/method/l2g/evaluator.py b/src/otg/method/l2g/evaluator.py new file mode 100644 index 000000000..f41b1d45e --- /dev/null +++ b/src/otg/method/l2g/evaluator.py @@ -0,0 +1,204 @@ +"""Module that integrates Spark ML Evaluators with W&B for experiment tracking.""" +from __future__ import annotations + +import itertools +from typing import TYPE_CHECKING, Any, Dict + +from pyspark import keyword_only +from pyspark.ml.evaluation import ( + BinaryClassificationEvaluator, + Evaluator, + MulticlassClassificationEvaluator, +) +from pyspark.ml.param import Param, Params, TypeConverters +from wandb.sdk.wandb_run import Run + +if TYPE_CHECKING: + from pyspark.sql import DataFrame + + +class WandbEvaluator(Evaluator): + """Wrapper for pyspark Evaluators. It is expected that the user will provide an Evaluators, and this wrapper will log metrics from said evaluator to W&B.""" + + spark_ml_evaluator: Param[Evaluator] = Param( + Params._dummy(), "spark_ml_evaluator", "evaluator from pyspark.ml.evaluation" + ) + + wandb_run: Param[Run] = Param( + Params._dummy(), + "wandb_run", + "wandb run. Expects an already initialized run. You should set this, or wandb_run_kwargs, NOT BOTH", + ) + + wandb_run_kwargs: Param[Any] = Param( + Params._dummy(), + "wandb_run_kwargs", + "kwargs to be passed to wandb.init. You should set this, or wandb_runId, NOT BOTH. Setting this is useful when using with WandbCrossValdidator", + ) + + wandb_runId: Param[str] = Param( # noqa: N815 + Params._dummy(), + "wandb_runId", + "wandb run id. if not providing an intialized run to wandb_run, a run with id wandb_runId will be resumed", + ) + + wandb_project_name: Param[str] = Param( + Params._dummy(), + "wandb_project_name", + "name of W&B project", + typeConverter=TypeConverters.toString, + ) + + label_values: Param[list[str]] = Param( + Params._dummy(), + "label_values", + "for classification and multiclass classification, this is a list of values the label can assume\nIf provided Multiclass or Multilabel evaluator without label_values, we'll figure it out from dataset passed through to evaluate.", + ) + + _input_kwargs: Dict[str, Any] + + @keyword_only + def __init__( + self: WandbEvaluator, + label_values: list[str] | None = None, + **kwargs: BinaryClassificationEvaluator + | MulticlassClassificationEvaluator + | Run, + ) -> None: + """Initialize a WandbEvaluator. + + Args: + label_values (list[str] | None): List of label values. + **kwargs (BinaryClassificationEvaluator | MulticlassClassificationEvaluator | Run): Keyword arguments. + """ + if label_values is None: + label_values = [] + super(Evaluator, self).__init__() + + self.metrics = { + MulticlassClassificationEvaluator: [ + "f1", + "accuracy", + "weightedPrecision", + "weightedRecall", + "weightedTruePositiveRate", + "weightedFalsePositiveRate", + "weightedFMeasure", + "truePositiveRateByLabel", + "falsePositiveRateByLabel", + "precisionByLabel", + "recallByLabel", + "fMeasureByLabel", + "logLoss", + "hammingLoss", + ], + BinaryClassificationEvaluator: ["areaUnderROC", "areaUnderPR"], + } + + self._setDefault(label_values=[]) + kwargs = self._input_kwargs + self._set(**kwargs) + + def setspark_ml_evaluator(self: WandbEvaluator, value: Evaluator) -> None: + """Set the spark_ml_evaluator parameter. + + Args: + value (Evaluator): Spark ML evaluator. + """ + self._set(spark_ml_evaluator=value) + + def setlabel_values(self: WandbEvaluator, value: list[str]) -> None: + """Set the label_values parameter. + + Args: + value (list[str]): List of label values. + """ + self._set(label_values=value) + + def getspark_ml_evaluator(self: WandbEvaluator) -> Evaluator: + """Get the spark_ml_evaluator parameter. + + Returns: + Evaluator: Spark ML evaluator. + """ + return self.getOrDefault(self.spark_ml_evaluator) + + def getwandb_run(self: WandbEvaluator) -> Run: + """Get the wandb_run parameter. + + Returns: + Run: Wandb run object. + """ + return self.getOrDefault(self.wandb_run) + + def getwandb_project_name(self: WandbEvaluator) -> Any: + """Get the wandb_project_name parameter. + + Returns: + Any: Name of the W&B project. + """ + return self.getOrDefault(self.wandb_project_name) + + def getlabel_values(self: WandbEvaluator) -> list[str]: + """Get the label_values parameter. + + Returns: + list[str]: List of label values. + """ + return self.getOrDefault(self.label_values) + + def _evaluate(self: WandbEvaluator, dataset: DataFrame) -> float: + """Evaluate the model on the given dataset. + + Args: + dataset (DataFrame): Dataset to evaluate the model on. + + Returns: + float: Metric value. + """ + dataset.persist() + metric_values: list[tuple[str, Any]] = [] + label_values = self.getlabel_values() + spark_ml_evaluator: BinaryClassificationEvaluator | MulticlassClassificationEvaluator = ( + self.getspark_ml_evaluator() # type: ignore[assignment, unused-ignore] + ) + run = self.getwandb_run() + evaluator_type = type(spark_ml_evaluator) + for metric in self.metrics[evaluator_type]: + if "ByLabel" in metric and label_values == []: + print( # noqa: T201 + "no label_values for the target have been provided and will be determined by the dataset. This could take some time" + ) + label_values = [ + r[spark_ml_evaluator.getLabelCol()] + for r in dataset.select(spark_ml_evaluator.getLabelCol()) + .distinct() + .collect() + ] + if isinstance(label_values[0], list): + merged = list(itertools.chain(*label_values)) + label_values = list(dict.fromkeys(merged).keys()) + self.setlabel_values(label_values) + for label in label_values: + out = spark_ml_evaluator.evaluate( + dataset, + { + spark_ml_evaluator.metricLabel: label, # type: ignore[assignment, unused-ignore] + spark_ml_evaluator.metricName: metric, + }, + ) + metric_values.append((f"{metric}:{label}", out)) + out = spark_ml_evaluator.evaluate( + dataset, {spark_ml_evaluator.metricName: metric} + ) + metric_values.append((f"{metric}", out)) + run.log(dict(metric_values)) + config = [ + (f"{k.parent.split('_')[0]}.{k.name}", v) + for k, v in spark_ml_evaluator.extractParamMap().items() + if "metric" not in k.name + ] + run.config.update(dict(config)) + return_metric = spark_ml_evaluator.evaluate(dataset) + dataset.unpersist() + return return_metric diff --git a/src/otg/method/l2g/feature_factory.py b/src/otg/method/l2g/feature_factory.py new file mode 100644 index 000000000..19ba5bb88 --- /dev/null +++ b/src/otg/method/l2g/feature_factory.py @@ -0,0 +1,360 @@ +"""Collection of methods that extract features from the OTG datasets to be fed in L2G.""" +from __future__ import annotations + +from functools import reduce +from typing import TYPE_CHECKING + +import pyspark.sql.functions as f + +from otg.common.spark_helpers import ( + convert_from_wide_to_long, + get_record_with_maximum_value, +) +from otg.dataset.l2g_feature import L2GFeature +from otg.dataset.study_locus import CredibleInterval, StudyLocus + +if TYPE_CHECKING: + from pyspark.sql import Column, DataFrame + + from otg.dataset.colocalisation import Colocalisation + from otg.dataset.study_index import StudyIndex + from otg.dataset.v2g import V2G + + +class ColocalisationFactory: + """Feature extraction in colocalisation.""" + + @staticmethod + def _get_max_coloc_per_study_locus( + study_locus: StudyLocus, + studies: StudyIndex, + colocalisation: Colocalisation, + colocalisation_method: str, + ) -> L2GFeature: + """Get the maximum colocalisation posterior probability for each pair of overlapping study-locus per type of colocalisation method and QTL type. + + Args: + study_locus (StudyLocus): Study locus dataset + studies (StudyIndex): Study index dataset + colocalisation (Colocalisation): Colocalisation dataset + colocalisation_method (str): Colocalisation method to extract the max from + + Returns: + L2GFeature: Stores the features with the max coloc probabilities for each pair of study-locus + + Raises: + ValueError: If the colocalisation method is not supported + """ + if colocalisation_method not in ["COLOC", "eCAVIAR"]: + raise ValueError( + f"Colocalisation method {colocalisation_method} not supported" + ) + if colocalisation_method == "COLOC": + coloc_score_col_name = "log2h4h3" + coloc_feature_col_template = "max_coloc_llr" + + elif colocalisation_method == "eCAVIAR": + coloc_score_col_name = "clpp" + coloc_feature_col_template = "max_coloc_clpp" + + colocalising_study_locus = ( + study_locus.df.select("studyLocusId", "studyId") + # annotate studyLoci with overlapping IDs on the left - to just keep GWAS associations + .join( + colocalisation._df.selectExpr( + "leftStudyLocusId as studyLocusId", + "rightStudyLocusId", + "colocalisationMethod", + f"{coloc_score_col_name} as coloc_score", + ), + on="studyLocusId", + how="inner", + ) + # bring study metadata to just keep QTL studies on the right + .join( + study_locus.df.selectExpr( + "studyLocusId as rightStudyLocusId", "studyId as right_studyId" + ), + on="rightStudyLocusId", + how="inner", + ) + .join( + f.broadcast( + studies._df.selectExpr( + "studyId as right_studyId", + "studyType as right_studyType", + "geneId", + ) + ), + on="right_studyId", + how="inner", + ) + .filter( + (f.col("colocalisationMethod") == colocalisation_method) + & (f.col("right_studyType") != "gwas") + ) + .select("studyLocusId", "right_studyType", "geneId", "coloc_score") + ) + + # Max LLR calculation per studyLocus AND type of QTL + local_max = get_record_with_maximum_value( + colocalising_study_locus, + ["studyLocusId", "right_studyType", "geneId"], + "coloc_score", + ) + neighbourhood_max = ( + get_record_with_maximum_value( + colocalising_study_locus, + ["studyLocusId", "right_studyType"], + "coloc_score", + ) + .join( + local_max.selectExpr("studyLocusId", "coloc_score as coloc_local_max"), + on="studyLocusId", + how="inner", + ) + .withColumn( + f"{coloc_feature_col_template}_nbh", + f.col("coloc_local_max") - f.col("coloc_score"), + ) + ) + + # Split feature per molQTL + local_dfs = [] + nbh_dfs = [] + for qtl_type in ["eqtl", "sqtl", "pqtl"]: + local_max = local_max.filter( + f.col("right_studyType") == qtl_type + ).withColumnRenamed( + "coloc_score", f"{qtl_type}_{coloc_feature_col_template}_local" + ) + local_dfs.append(local_max) + + neighbourhood_max = neighbourhood_max.filter( + f.col("right_studyType") == qtl_type + ).withColumnRenamed( + f"{coloc_feature_col_template}_nbh", + f"{qtl_type}_{coloc_feature_col_template}_nbh", + ) + nbh_dfs.append(neighbourhood_max) + + wide_dfs = reduce( + lambda x, y: x.unionByName(y, allowMissingColumns=True), + local_dfs + nbh_dfs, + colocalising_study_locus.limit(0), + ) + + return L2GFeature( + _df=convert_from_wide_to_long( + wide_dfs, + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=L2GFeature.get_schema(), + ) + + @staticmethod + def _get_coloc_features( + study_locus: StudyLocus, studies: StudyIndex, colocalisation: Colocalisation + ) -> L2GFeature: + """Calls _get_max_coloc_per_study_locus for both methods and concatenates the results. + + Args: + study_locus (StudyLocus): Study locus dataset + studies (StudyIndex): Study index dataset + colocalisation (Colocalisation): Colocalisation dataset + + Returns: + L2GFeature: Stores the features with the max coloc probabilities for each pair of study-locus + """ + coloc_llr = ColocalisationFactory._get_max_coloc_per_study_locus( + study_locus, + studies, + colocalisation, + "COLOC", + ) + coloc_clpp = ColocalisationFactory._get_max_coloc_per_study_locus( + study_locus, + studies, + colocalisation, + "eCAVIAR", + ) + + return L2GFeature( + _df=coloc_llr.df.unionByName(coloc_clpp.df, allowMissingColumns=True), + _schema=L2GFeature.get_schema(), + ) + + +class StudyLocusFactory(StudyLocus): + """Feature extraction in study locus.""" + + @staticmethod + def _get_tss_distance_features( + study_locus: StudyLocus, distances: V2G + ) -> L2GFeature: + """Joins StudyLocus with the V2G to extract the minimum distance to a gene TSS of all variants in a StudyLocus credible set. + + Args: + study_locus (StudyLocus): Study locus dataset + distances (V2G): Dataframe containing the distances of all variants to all genes TSS within a region + + Returns: + L2GFeature: Stores the features with the minimum distance among all variants in the credible set and a gene TSS. + + """ + wide_df = ( + study_locus.filter_credible_set(CredibleInterval.IS95) + .df.select( + "studyLocusId", + "variantId", + f.explode("locus.variantId").alias("tagVariantId"), + ) + .join( + distances.df.selectExpr( + "variantId as tagVariantId", "geneId", "distance" + ), + on="tagVariantId", + how="inner", + ) + .groupBy("studyLocusId", "geneId") + .agg( + f.min("distance").alias("distanceTssMinimum"), + f.mean("distance").alias("distanceTssMean"), + ) + ) + + return L2GFeature( + _df=convert_from_wide_to_long( + wide_df, + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=L2GFeature.get_schema(), + ) + + @staticmethod + def _get_vep_features( + credible_set: StudyLocus, + v2g: V2G, + ) -> L2GFeature: + """Get the maximum VEP score for all variants in a locus's 95% credible set. + + This informs about functional impact of the variants in the locus. For more information on variant consequences, see: https://www.ensembl.org/info/genome/variation/prediction/predicted_data.html + Two metrics: max VEP score per study locus and gene, and max VEP score per study locus. + + + Args: + credible_set (StudyLocus): Study locus dataset with the associations to be annotated + v2g (V2G): V2G dataset with the variant/gene relationships and their consequences + + Returns: + L2GFeature: Stores the features with the max VEP score. + """ + + def _aggregate_vep_feature( + df: DataFrame, + aggregation_expr: Column, + aggregation_cols: list[str], + feature_name: str, + ) -> DataFrame: + """Extracts the maximum or average VEP score after grouping by the given columns. Different aggregations return different predictive annotations. + + If the group_cols include "geneId", the maximum/mean VEP score per gene is returned. + Otherwise, the maximum/mean VEP score for all genes in the neighborhood of the locus is returned. + + Args: + df (DataFrame): DataFrame with the VEP scores for each variant in a studyLocus + aggregation_expr (Column): Aggregation expression to apply + aggregation_cols (list[str]): Columns to group by + feature_name (str): Name of the feature to be returned + + Returns: + DataFrame: DataFrame with the maximum VEP score per locus or per locus/gene + """ + if "geneId" in aggregation_cols: + return df.groupBy(aggregation_cols).agg( + aggregation_expr.alias(feature_name) + ) + return ( + df.groupBy(aggregation_cols) + .agg( + aggregation_expr.alias(feature_name), + f.collect_set("geneId").alias("geneId"), + ) + .withColumn("geneId", f.explode("geneId")) + ) + + credible_set_w_variant_consequences = ( + credible_set.filter_credible_set(CredibleInterval.IS95) + .df.withColumn("variantInLocusId", f.explode(f.col("locus.variantId"))) + .withColumn( + "variantInLocusPosteriorProbability", + f.explode(f.col("locus.posteriorProbability")), + ) + .join( + # Join with V2G to get variant consequences + v2g.df.filter( + f.col("datasourceId") == "variantConsequence" + ).withColumnRenamed("variantId", "variantInLocusId"), + on="variantInLocusId", + ) + .withColumn( + "weightedScore", + f.col("score") * f.col("variantInLocusPosteriorProbability"), + ) + .select( + "studyLocusId", + "variantId", + "studyId", + "geneId", + "score", + "weightedScore", + ) + .distinct() + .persist() + ) + + return L2GFeature( + _df=convert_from_wide_to_long( + reduce( + lambda x, y: x.unionByName(y, allowMissingColumns=True), + [ + # Calculate overall max VEP score for all genes in the vicinity + credible_set_w_variant_consequences.transform( + _aggregate_vep_feature, + f.max("score"), + ["studyLocusId"], + "vepMaximumNeighbourhood", + ), + # Calculate overall max VEP score per gene + credible_set_w_variant_consequences.transform( + _aggregate_vep_feature, + f.max("score"), + ["studyLocusId", "geneId"], + "vepMaximum", + ), + # Calculate mean VEP score for all genes in the vicinity + credible_set_w_variant_consequences.transform( + _aggregate_vep_feature, + f.mean("weightedScore"), + ["studyLocusId"], + "vepMeanNeighbourhood", + ), + # Calculate mean VEP score per gene + credible_set_w_variant_consequences.transform( + _aggregate_vep_feature, + f.mean("weightedScore"), + ["studyLocusId", "geneId"], + "vepMean", + ), + ], + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ).filter(f.col("featureValue").isNotNull()), + _schema=L2GFeature.get_schema(), + ) diff --git a/src/otg/method/l2g/model.py b/src/otg/method/l2g/model.py new file mode 100644 index 000000000..2eedfc1f3 --- /dev/null +++ b/src/otg/method/l2g/model.py @@ -0,0 +1,305 @@ +"""Locus to Gene classifier.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING, Any, Type + +from pyspark.ml import Pipeline, PipelineModel +from pyspark.ml.evaluation import ( + BinaryClassificationEvaluator, + MulticlassClassificationEvaluator, +) +from pyspark.ml.feature import StringIndexer, VectorAssembler +from pyspark.ml.tuning import ParamGridBuilder +from wandb.data_types import Table +from wandb.sdk import init as wandb_init +from wandb.wandb_run import Run +from xgboost.spark.core import SparkXGBClassifierModel + +from otg.dataset.l2g_feature_matrix import L2GFeatureMatrix +from otg.method.l2g.evaluator import WandbEvaluator + +if TYPE_CHECKING: + from pyspark.ml import Transformer + from pyspark.sql import DataFrame + + +@dataclass +class LocusToGeneModel: + """Wrapper for the Locus to Gene classifier.""" + + features_list: list[str] + estimator: Any = None + pipeline: Pipeline = Pipeline(stages=[]) + model: PipelineModel | None = None + wandb_l2g_project_name: str = "otg_l2g" + + def __post_init__(self: LocusToGeneModel) -> None: + """Post init that adds the model to the ML pipeline.""" + label_indexer = StringIndexer( + inputCol="goldStandardSet", outputCol="label", handleInvalid="keep" + ) + vector_assembler = LocusToGeneModel.features_vector_assembler( + self.features_list + ) + + self.pipeline = Pipeline( + stages=[ + label_indexer, + vector_assembler, + ] + ) + + def save(self: LocusToGeneModel, path: str) -> None: + """Saves fitted pipeline model to disk. + + Args: + path (str): Path to save the model to + + Raises: + ValueError: If the model has not been fitted yet + """ + if self.model is None: + raise ValueError("Model has not been fitted yet.") + self.model.write().overwrite().save(path) + + @property + def classifier(self: LocusToGeneModel) -> Any: + """Return the model. + + Returns: + Any: An estimator object from Spark ML + """ + return self.estimator + + @staticmethod + def features_vector_assembler(features_cols: list[str]) -> VectorAssembler: + """Spark transformer to assemble the feature columns into a vector. + + Args: + features_cols (list[str]): List of feature columns to assemble + + Returns: + VectorAssembler: Spark transformer to assemble the feature columns into a vector + + Examples: + >>> from pyspark.ml.feature import VectorAssembler + >>> df = spark.createDataFrame([(5.2, 3.5)], schema="feature_1 FLOAT, feature_2 FLOAT") + >>> assembler = LocusToGeneModel.features_vector_assembler(["feature_1", "feature_2"]) + >>> assembler.transform(df).show() + +---------+---------+--------------------+ + |feature_1|feature_2| features| + +---------+---------+--------------------+ + | 5.2| 3.5|[5.19999980926513...| + +---------+---------+--------------------+ + + """ + return ( + VectorAssembler(handleInvalid="error") + .setInputCols(features_cols) + .setOutputCol("features") + ) + + def log_to_wandb( + self: LocusToGeneModel, + results: DataFrame, + training_data: L2GFeatureMatrix, + evaluators: list[ + BinaryClassificationEvaluator | MulticlassClassificationEvaluator + ], + wandb_run: Run, + ) -> None: + """Log evaluation results and feature importance to W&B. + + Args: + results (DataFrame): Dataframe containing the predictions + training_data (L2GFeatureMatrix): Training data used for the model. If provided, the table and the number of positive and negative labels will be logged to W&B + evaluators (list[BinaryClassificationEvaluator | MulticlassClassificationEvaluator]): List of Spark ML evaluators to use for evaluation + wandb_run (Run): W&B run to log the results to + """ + ## Track evaluation metrics + for evaluator in evaluators: + wandb_evaluator = WandbEvaluator( + spark_ml_evaluator=evaluator, wandb_run=wandb_run + ) + wandb_evaluator.evaluate(results) + ## Track feature importance + wandb_run.log({"importances": self.get_feature_importance()}) + ## Track training set + training_table = Table(dataframe=training_data.df.toPandas()) + wandb_run.log({"trainingSet": training_table}) + # Count number of positive and negative labels + gs_counts_dict = { + "goldStandard" + row["goldStandardSet"].capitalize(): row["count"] + for row in training_data.df.groupBy("goldStandardSet").count().collect() + } + wandb_run.log(gs_counts_dict) + # Missingness rates + wandb_run.log( + {"missingnessRates": training_data.calculate_feature_missingness_rate()} + ) + + @classmethod + def load_from_disk( + cls: Type[LocusToGeneModel], path: str, features_list: list[str] + ) -> LocusToGeneModel: + """Load a fitted pipeline model from disk. + + Args: + path (str): Path to the model + features_list (list[str]): List of features used for the model + + Returns: + LocusToGeneModel: L2G model loaded from disk + """ + return cls(model=PipelineModel.load(path), features_list=features_list) + + @classifier.setter # type: ignore + def classifier(self: LocusToGeneModel, new_estimator: Any) -> None: + """Set the model. + + Args: + new_estimator (Any): An estimator object from Spark ML + """ + self.estimator = new_estimator + + def get_param_grid(self: LocusToGeneModel) -> list[Any]: + """Return the parameter grid for the model. + + Returns: + list[Any]: List of parameter maps to use for cross validation + """ + return ( + ParamGridBuilder() + .addGrid(self.estimator.max_depth, [3, 5, 7]) + .addGrid(self.estimator.learning_rate, [0.01, 0.1, 1.0]) + .build() + ) + + def add_pipeline_stage( + self: LocusToGeneModel, transformer: Transformer + ) -> LocusToGeneModel: + """Adds a stage to the L2G pipeline. + + Args: + transformer (Transformer): Spark transformer to add to the pipeline + + Returns: + LocusToGeneModel: L2G model with the new transformer + + Examples: + >>> from pyspark.ml.regression import LinearRegression + >>> estimator = LinearRegression() + >>> test_model = LocusToGeneModel(features_list=["a", "b"]) + >>> print(len(test_model.pipeline.getStages())) + 2 + >>> print(len(test_model.add_pipeline_stage(estimator).pipeline.getStages())) + 3 + """ + pipeline_stages = self.pipeline.getStages() + new_stages = pipeline_stages + [transformer] + self.pipeline = Pipeline(stages=new_stages) + return self + + def evaluate( + self: LocusToGeneModel, + results: DataFrame, + hyperparameters: dict[str, Any], + wandb_run_name: str | None, + training_data: L2GFeatureMatrix | None = None, + ) -> None: + """Perform evaluation of the model predictions for the test set and track the results with W&B. + + Args: + results (DataFrame): Dataframe containing the predictions + hyperparameters (dict[str, Any]): Hyperparameters used for the model + wandb_run_name (str | None): Descriptive name for the run to be tracked with W&B + training_data (L2GFeatureMatrix | None): Training data used for the model. If provided, the ratio of positive to negative labels will be logged to W&B + """ + binary_evaluator = BinaryClassificationEvaluator( + rawPredictionCol="rawPrediction", labelCol="label" + ) + multi_evaluator = MulticlassClassificationEvaluator( + labelCol="label", predictionCol="prediction" + ) + + if wandb_run_name and training_data: + run = wandb_init( + project=self.wandb_l2g_project_name, + config=hyperparameters, + name=wandb_run_name, + ) + if isinstance(run, Run): + self.log_to_wandb( + results, training_data, [binary_evaluator, multi_evaluator], run + ) + run.finish() + + @property + def feature_name_map(self: LocusToGeneModel) -> dict[str, str]: + """Return a dictionary mapping encoded feature names to the original names. + + Returns: + dict[str, str]: Feature name map of the model + + Raises: + ValueError: If the model has not been fitted yet + """ + if not self.model: + raise ValueError("Model not fitted yet. `fit()` has to be called first.") + elif isinstance(self.model.stages[1], VectorAssembler): + feature_names = self.model.stages[1].getInputCols() + return {f"f{i}": feature_name for i, feature_name in enumerate(feature_names)} + + def get_feature_importance(self: LocusToGeneModel) -> dict[str, float]: + """Return dictionary with relative importances of every feature in the model. Feature names are encoded and have to be mapped back to their original names. + + Returns: + dict[str, float]: Dictionary mapping feature names to their importance + + Raises: + ValueError: If the model has not been fitted yet or is not an XGBoost model + """ + if not self.model or not isinstance( + self.model.stages[-1], SparkXGBClassifierModel + ): + raise ValueError( + f"Model type {type(self.model)} not supported for feature importance." + ) + importance_map = self.model.stages[-1].get_feature_importances() + return {self.feature_name_map[k]: v for k, v in importance_map.items()} + + def fit( + self: LocusToGeneModel, + feature_matrix: L2GFeatureMatrix, + ) -> LocusToGeneModel: + """Fit the pipeline to the feature matrix dataframe. + + Args: + feature_matrix (L2GFeatureMatrix): Feature matrix dataframe to fit the model to + + Returns: + LocusToGeneModel: Fitted model + """ + self.model = self.pipeline.fit(feature_matrix.df) + return self + + def predict( + self: LocusToGeneModel, + feature_matrix: L2GFeatureMatrix, + ) -> DataFrame: + """Apply the model to a given feature matrix dataframe. The feature matrix needs to be preprocessed first. + + Args: + feature_matrix (L2GFeatureMatrix): Feature matrix dataframe to apply the model to + + Returns: + DataFrame: Dataframe with predictions + + Raises: + ValueError: If the model has not been fitted yet + """ + if not self.model: + raise ValueError("Model not fitted yet. `fit()` has to be called first.") + return self.model.transform(feature_matrix.df) diff --git a/src/otg/method/l2g/trainer.py b/src/otg/method/l2g/trainer.py new file mode 100644 index 000000000..95ac506f0 --- /dev/null +++ b/src/otg/method/l2g/trainer.py @@ -0,0 +1,112 @@ +"""Utilities to train and apply the Locus to Gene classifier.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any, Optional + +from pyspark.ml.evaluation import MulticlassClassificationEvaluator +from pyspark.ml.tuning import CrossValidator + +from otg.dataset.l2g_feature_matrix import L2GFeatureMatrix +from otg.method.l2g.model import LocusToGeneModel + + +@dataclass +class LocusToGeneTrainer: + """Modelling of what is the most likely causal gene associated with a given locus.""" + + _model: LocusToGeneModel + train_set: L2GFeatureMatrix + + @classmethod + def train( + cls: type[LocusToGeneTrainer], + data: L2GFeatureMatrix, + l2g_model: LocusToGeneModel, + features_list: list[str], + evaluate: bool, + wandb_run_name: str | None = None, + model_path: str | None = None, + **hyperparams: dict[str, Any], + ) -> LocusToGeneModel: + """Train the Locus to Gene model. + + Args: + data (L2GFeatureMatrix): Feature matrix containing the data + l2g_model (LocusToGeneModel): Model to fit to the data on + features_list (list[str]): List of features to use for the model + evaluate (bool): Whether to evaluate the model on a test set + wandb_run_name (str | None): Descriptive name for the run to be tracked with W&B + model_path (str | None): Path to save the model to + **hyperparams (dict[str, Any]): Hyperparameters to use for the model + + Returns: + LocusToGeneModel: Trained model + """ + train, test = data.select_features(features_list).train_test_split(fraction=0.8) + + model = l2g_model.add_pipeline_stage(l2g_model.estimator).fit(train) + + if evaluate: + l2g_model.evaluate( + results=model.predict(test), + hyperparameters=hyperparams, + wandb_run_name=wandb_run_name, + training_data=train, + ) + if model_path: + l2g_model.save(model_path) + return l2g_model + + @classmethod + def cross_validate( + cls: type[LocusToGeneTrainer], + l2g_model: LocusToGeneModel, + data: L2GFeatureMatrix, + num_folds: int, + param_grid: Optional[list] = None, # type: ignore + ) -> LocusToGeneModel: + """Perform k-fold cross validation on the model. + + By providing a model with a parameter grid, this method will perform k-fold cross validation on the model for each + combination of parameters and return the best model. + + Args: + l2g_model (LocusToGeneModel): Model to fit to the data on + data (L2GFeatureMatrix): Data to perform cross validation on + num_folds (int): Number of folds to use for cross validation + param_grid (Optional[list]): List of parameter maps to use for cross validation + + Returns: + LocusToGeneModel: Trained model fitted with the best hyperparameters + + Raises: + ValueError: Parameter grid is empty. Cannot perform cross-validation. + ValueError: Unable to retrieve the best model. + """ + evaluator = MulticlassClassificationEvaluator() + params_grid = param_grid or l2g_model.get_param_grid() + if not param_grid: + raise ValueError( + "Parameter grid is empty. Cannot perform cross-validation." + ) + cv = CrossValidator( + numFolds=num_folds, + estimator=l2g_model.estimator, + estimatorParamMaps=params_grid, + evaluator=evaluator, + parallelism=2, + collectSubModels=False, + seed=42, + ) + + l2g_model.add_pipeline_stage(cv) # type: ignore[assignment, unused-ignore] + + # Integrate the best model from the last stage of the pipeline + if (full_pipeline_model := l2g_model.fit(data).model) is None or not hasattr( + full_pipeline_model, "stages" + ): + raise ValueError("Unable to retrieve the best model.") + l2g_model.model = full_pipeline_model.stages[-1].bestModel # type: ignore[assignment, unused-ignore] + return l2g_model diff --git a/src/otg/method/ld.py b/src/otg/method/ld.py index 09c42c4ba..c834efb85 100644 --- a/src/otg/method/ld.py +++ b/src/otg/method/ld.py @@ -19,7 +19,14 @@ class LDAnnotator: @staticmethod def _calculate_weighted_r_overall(ld_set: Column) -> Column: - """Aggregation of weighted R information using ancestry proportions.""" + """Aggregation of weighted R information using ancestry proportions. + + Args: + ld_set (Column): LD set + + Returns: + Column: LD set with added 'r2Overall' field + """ return f.transform( ld_set, lambda x: f.struct( diff --git a/src/otg/method/pics.py b/src/otg/method/pics.py index c7a259ee1..6d38f4643 100644 --- a/src/otg/method/pics.py +++ b/src/otg/method/pics.py @@ -2,13 +2,13 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any import pyspark.sql.functions as f import pyspark.sql.types as t from scipy.stats import norm -from otg.dataset.study_locus import StudyLocus +from otg.dataset.study_locus import StudyLocus, StudyLocusQualityCheck if TYPE_CHECKING: from pyspark.sql import Row @@ -31,7 +31,7 @@ def _pics_relative_posterior_probability( pics_snp_std (float): Standard deviation for the P value of the association between a SNP and a trait Returns: - Relative posterior probability of a SNP being causal in a locus + float: Posterior probability of the association between a SNP and a trait Examples: >>> rel_prob = PICS._pics_relative_posterior_probability(neglog_p=10.0, pics_snp_mu=1.0, pics_snp_std=10.0) @@ -53,7 +53,7 @@ def _pics_standard_deviation(neglog_p: float, r2: float, k: float) -> float | No k (float): Empiric constant that can be adjusted to fit the curve, 6.4 recommended. Returns: - Standard deviation for the P value of the association between a SNP and a trait + float | None: Standard deviation for the P value of the association between a SNP and a trait Examples: >>> PICS._pics_standard_deviation(neglog_p=1.0, r2=1.0, k=6.4) @@ -81,7 +81,7 @@ def _pics_mu(neglog_p: float, r2: float) -> float | None: r2 (float): LD score between a given SNP and the lead variant Returns: - Mean P value of the association between a SNP and a trait + float | None: Mean P value of the association between a SNP and a trait Examples: >>> PICS._pics_mu(neglog_p=1.0, r2=1.0) @@ -94,7 +94,9 @@ def _pics_mu(neglog_p: float, r2: float) -> float | None: return neglog_p * r2 if r2 >= 0.5 else None @staticmethod - def _finemap(ld_set: list[Row], lead_neglog_p: float, k: float) -> list | None: + def _finemap( + ld_set: list[Row], lead_neglog_p: float, k: float + ) -> list[dict[str, Any]] | None: """Calculates the probability of a variant being causal in a study-locus context by applying the PICS method. It is intended to be applied as an UDF in `PICS.finemap`, where each row is a StudyLocus association. @@ -102,12 +104,12 @@ def _finemap(ld_set: list[Row], lead_neglog_p: float, k: float) -> list | None: its association signal and causality probability as of PICS. Args: - ld_set (list): list of tagging variants after expanding the locus + ld_set (list[Row]): list of tagging variants after expanding the locus lead_neglog_p (float): P value of the association signal between the lead variant and the study in the form of -log10. k (float): Empiric constant that can be adjusted to fit the curve, 6.4 recommended. Returns: - List of tagging variants with an estimation of the association signal and their posterior probability as of PICS. + list[dict[str, Any]] | None: List of tagging variants with an estimation of the association signal and their posterior probability as of PICS. Examples: >>> from pyspark.sql import Row @@ -125,7 +127,7 @@ def _finemap(ld_set: list[Row], lead_neglog_p: float, k: float) -> list | None: ... Row(variantId="var2", r2Overall=None), ... ] >>> PICS._finemap(ld_set_with_no_r2, lead_neglog_p=10.0, k=6.4) - [{'variantId': 'var1', 'r2Overall': None}, {'variantId': 'var2', 'r2Overall': None}] + [] """ if ld_set is None: return None @@ -143,8 +145,7 @@ def _finemap(ld_set: list[Row], lead_neglog_p: float, k: float) -> list | None: or tag_dict["r2Overall"] < 0.5 or not lead_neglog_p ): - # If PICS cannot be calculated, we'll return the original credible set - new_credible_set.append(tag_dict) + # If PICS cannot be calculated, we drop the variant from the credible set continue pics_snp_mu = PICS._pics_mu(lead_neglog_p, tag_dict["r2Overall"]) @@ -220,6 +221,9 @@ def finemap( lambda locus, neglog_p: PICS._finemap(locus, neglog_p, k), picsed_ldset_schema, ) + non_picsable_expr = ( + f.size(f.filter(f.col("ldSet"), lambda x: x.r2Overall >= 0.5)) == 0 + ) return StudyLocus( _df=( associations.df @@ -237,7 +241,18 @@ def finemap( ), ), ) - # Rename tagVariantId to variantId + .withColumn( + "qualityControls", + StudyLocus.update_quality_flag( + f.col("qualityControls"), + non_picsable_expr, + StudyLocusQualityCheck.NOT_QUALIFYING_LD_BLOCK, + ), + ) + .withColumn( + "finemappingMethod", + f.coalesce(f.col("finemappingMethod"), f.lit("pics")), + ) .drop("neglog_pvalue") ), _schema=StudyLocus.get_schema(), diff --git a/src/otg/method/window_based_clumping.py b/src/otg/method/window_based_clumping.py index 890b54ca7..a0b8d23c9 100644 --- a/src/otg/method/window_based_clumping.py +++ b/src/otg/method/window_based_clumping.py @@ -14,7 +14,7 @@ from otg.dataset.study_locus import StudyLocus if TYPE_CHECKING: - from numpy import ndarray + from numpy.typing import NDArray from pyspark.sql import Column from otg.dataset.summary_statistics import SummaryStatistics @@ -111,13 +111,13 @@ def _cluster_peaks( ).otherwise(cluster_id) @staticmethod - def _prune_peak(position: ndarray, window_size: int) -> DenseVector: + def _prune_peak(position: NDArray[np.float64], window_size: int) -> DenseVector: """Establish lead snps based on their positions listed by p-value. The function `find_peak` assigns lead SNPs based on their positions listed by p-value within a specified window size. Args: - position (ndarray): positions of the SNPs sorted by p-value. + position (NDArray[np.float64]): positions of the SNPs sorted by p-value. window_size (int): the distance in bp within which associations are clumped together around the lead snp. Returns: @@ -131,10 +131,10 @@ def _prune_peak(position: ndarray, window_size: int) -> DenseVector: """ # Initializing the lead list with zeroes: - is_lead: ndarray = np.zeros(len(position)) + is_lead = np.zeros(len(position)) # List containing indices of leads: - lead_indices: list = [] + lead_indices: list[int] = [] # Looping through all positions: for index in range(len(position)): @@ -234,7 +234,9 @@ def clump( # Adding study-locus id: .withColumn( "studyLocusId", - StudyLocus.assign_study_locus_id("studyId", "variantId"), + StudyLocus.assign_study_locus_id( + f.col("studyId"), f.col("variantId") + ), ) # Initialize QC column as array of strings: .withColumn( @@ -258,9 +260,9 @@ def clump_with_locus( Args: summary_stats (SummaryStatistics): Input summary statistics dataset window_length (int): Window size in bp, used for distance based clumping. - p_value_significance (float, optional): GWAS significance threshold used to filter peaks. Defaults to 5e-8. - p_value_baseline (float, optional): Least significant threshold. Below this, all snps are dropped. Defaults to 0.05. - locus_window_length (int, optional): The distance for collecting locus around the semi indices. + p_value_significance (float): GWAS significance threshold used to filter peaks. Defaults to 5e-8. + p_value_baseline (float): Least significant threshold. Below this, all snps are dropped. Defaults to 0.05. + locus_window_length (int | None): The distance for collecting locus around the semi indices. Defaults to None. Returns: StudyLocus: StudyLocus after clumping with information about the `locus` diff --git a/src/otg/overlaps.py b/src/otg/overlaps.py index 7e46ff069..74a8c6d58 100644 --- a/src/otg/overlaps.py +++ b/src/otg/overlaps.py @@ -3,31 +3,44 @@ from dataclasses import dataclass +from omegaconf import MISSING + from otg.common.session import Session -from otg.config import StudyLocusOverlapStepConfig from otg.dataset.study_index import StudyIndex from otg.dataset.study_locus import StudyLocus from otg.dataset.study_locus_overlap import StudyLocusOverlap @dataclass -class OverlapsIndexStep(StudyLocusOverlapStepConfig): +class OverlapsIndexStep: """StudyLocus overlaps step. + !!! note + This dataset is defined to contain the overlapping signals between studyLocus associations once they have been clumped and fine-mapped. + This step generates a dataset of overlapping studyLocus associations. - """ - session: Session = Session() + Attributes: + session (Session): Session object. + study_locus_path (str): Input study-locus path. + study_index_path (str): Input study index path to extract the type of study. + overlaps_index_out (str): Output overlaps index path. + """ - def run(self: OverlapsIndexStep) -> None: - """Run Overlaps index step. + session: Session = MISSING + study_locus_path: str = MISSING + study_index_path: str = MISSING + overlaps_index_out: str = MISSING - !!! note - This dataset is defined to contain the overlapping signals between studyLocus associations once they have been clumped and fine-mapped. - """ + def __post_init__(self: OverlapsIndexStep) -> None: + """Run step.""" # Extract - study_locus = StudyLocus.from_parquet(self.session, self.study_locus_path) - study_index = StudyIndex.from_parquet(self.session, self.study_index_path) + study_locus = StudyLocus.from_parquet( + self.session, self.study_locus_path, recursiveFileLookup=True + ) + study_index = StudyIndex.from_parquet( + self.session, self.study_index_path, recursiveFileLookup=True + ) # Transform overlaps_index = StudyLocusOverlap.from_associations(study_locus, study_index) # Load diff --git a/src/otg/pics.py b/src/otg/pics.py new file mode 100644 index 000000000..c326706cb --- /dev/null +++ b/src/otg/pics.py @@ -0,0 +1,40 @@ +"""Step to apply PICS finemapping.""" + +from __future__ import annotations + +from dataclasses import dataclass + +from omegaconf import MISSING + +from otg.common.session import Session +from otg.dataset.study_locus import StudyLocus +from otg.method.pics import PICS + + +@dataclass +class PICSStep: + """PICS finemapping of LD-annotated StudyLocus. + + Attributes: + session (Session): Session object. + + study_locus_ld_annotated_in (str): Path to Study Locus with the LD information annotated + picsed_study_locus_out (str): Path to Study Locus after running PICS + """ + + session: Session = MISSING + study_locus_ld_annotated_in: str = MISSING + picsed_study_locus_out: str = MISSING + + def __post_init__(self: PICSStep) -> None: + """Run step.""" + # Extract + study_locus_ld_annotated = StudyLocus.from_parquet( + self.session, self.study_locus_ld_annotated_in + ) + # PICS + picsed_sl = PICS.finemap(study_locus_ld_annotated).annotate_credible_sets() + # Write + picsed_sl.df.write.mode(self.session.write_mode).parquet( + self.picsed_study_locus_out + ) diff --git a/src/otg/py.typed b/src/otg/py.typed new file mode 100644 index 000000000..e69de29bb diff --git a/src/otg/ukbiobank.py b/src/otg/ukbiobank.py index 6fe8a6ab2..3e1a25559 100644 --- a/src/otg/ukbiobank.py +++ b/src/otg/ukbiobank.py @@ -4,19 +4,28 @@ from dataclasses import dataclass +from omegaconf import MISSING + from otg.common.session import Session -from otg.config import UKBiobankStepConfig from otg.datasource.ukbiobank.study_index import UKBiobankStudyIndex @dataclass -class UKBiobankStep(UKBiobankStepConfig): - """UKBiobank study table ingestion step.""" +class UKBiobankStep: + """UKBiobank study table ingestion step. + + Attributes: + session (Session): Session object. + ukbiobank_manifest (str): UKBiobank manifest of studies. + ukbiobank_study_index_out (str): Output path for the UKBiobank study index dataset. + """ - session: Session = Session() + session: Session = MISSING + ukbiobank_manifest: str = MISSING + ukbiobank_study_index_out: str = MISSING - def run(self: UKBiobankStep) -> None: - """Run UKBiobank study table ingestion step.""" + def __post_init__(self: UKBiobankStep) -> None: + """Run step.""" # Read in the UKBiobank manifest tsv file. df = self.session.spark.read.csv( self.ukbiobank_manifest, sep="\t", header=True, inferSchema=True diff --git a/src/otg/v2g.py b/src/otg/v2g.py index ce0c1541b..61cf5fa79 100644 --- a/src/otg/v2g.py +++ b/src/otg/v2g.py @@ -1,24 +1,24 @@ """Step to generate variant annotation dataset.""" from __future__ import annotations -from dataclasses import dataclass +from dataclasses import dataclass, field from functools import reduce +from typing import Dict, List + +import pyspark.sql.functions as f +from omegaconf import MISSING from otg.common.Liftover import LiftOverSpark from otg.common.session import Session -from otg.config import V2GStepConfig from otg.dataset.gene_index import GeneIndex +from otg.dataset.intervals import Intervals from otg.dataset.v2g import V2G from otg.dataset.variant_annotation import VariantAnnotation from otg.dataset.variant_index import VariantIndex -from otg.datasource.intervals.andersson import IntervalsAndersson -from otg.datasource.intervals.javierre import IntervalsJavierre -from otg.datasource.intervals.jung import IntervalsJung -from otg.datasource.intervals.thurnman import IntervalsThurnman @dataclass -class V2GStep(V2GStepConfig): +class V2GStep: """Variant-to-gene (V2G) step. This step aims to generate a dataset that contains multiple pieces of evidence supporting the functional association of specific variants with genes. Some of the evidence types include: @@ -27,70 +27,106 @@ class V2GStep(V2GStepConfig): 2. In silico functional predictions, e.g. Variant Effect Predictor (VEP) from Ensembl. 3. Distance between the variant and each gene's canonical transcription start site (TSS). + Attributes: + session (Session): Session object. + variant_index_path (str): Input variant index path. + variant_annotation_path (str): Input variant annotation path. + gene_index_path (str): Input gene index path. + vep_consequences_path (str): Input VEP consequences path. + liftover_chain_file_path (str): Path to GRCh37 to GRCh38 chain file. + liftover_max_length_difference: Maximum length difference for liftover. + max_distance (int): Maximum distance to consider. + approved_biotypes (list[str]): List of approved biotypes. + intervals (dict): Dictionary of interval sources. + v2g_path (str): Output V2G path. """ - session: Session = Session() - - def run(self: V2GStep) -> None: - """Run V2G dataset generation.""" - # Filter gene index by approved biotypes to define V2G gene universe - gene_index_filtered = GeneIndex.from_parquet( - self.session, self.gene_index_path - ).filter_by_biotypes(self.approved_biotypes) + session: Session = MISSING + variant_index_path: str = MISSING + variant_annotation_path: str = MISSING + gene_index_path: str = MISSING + vep_consequences_path: str = MISSING + liftover_chain_file_path: str = MISSING + liftover_max_length_difference: int = 100 + max_distance: int = 500_000 + approved_biotypes: List[str] = field( + default_factory=lambda: [ + "protein_coding", + "3prime_overlapping_ncRNA", + "antisense", + "bidirectional_promoter_lncRNA", + "IG_C_gene", + "IG_D_gene", + "IG_J_gene", + "IG_V_gene", + "lincRNA", + "macro_lncRNA", + "non_coding", + "sense_intronic", + "sense_overlapping", + ] + ) + intervals: Dict[str, str] = field(default_factory=dict) + v2g_path: str = MISSING + def __post_init__(self: V2GStep) -> None: + """Run step.""" + # Read + gene_index = GeneIndex.from_parquet(self.session, self.gene_index_path) vi = VariantIndex.from_parquet(self.session, self.variant_index_path).persist() va = VariantAnnotation.from_parquet(self.session, self.variant_annotation_path) vep_consequences = self.session.spark.read.csv( self.vep_consequences_path, sep="\t", header=True + ).select( + f.element_at(f.split("Accession", r"/"), -1).alias( + "variantFunctionalConsequenceId" + ), + f.col("Term").alias("label"), + f.col("v2g_score").cast("double").alias("score"), ) - # Variant annotation reduced to the variant index to define V2G variant universe - va_slimmed = va.filter_by_variant_df(vi.df, ["id", "chromosome"]).persist() - - # lift over variants to hg38 + # Transform lift = LiftOverSpark( - self.liftover_chain_file_path, self.liftover_max_length_difference + # lift over variants to hg38 + self.liftover_chain_file_path, + self.liftover_max_length_difference, + ) + gene_index_filtered = gene_index.filter_by_biotypes( + # Filter gene index by approved biotypes to define V2G gene universe + list(self.approved_biotypes) + ) + va_slimmed = va.filter_by_variant_df( + # Variant annotation reduced to the variant index to define V2G variant universe + vi.df + ).persist() + intervals = Intervals( + _df=reduce( + lambda x, y: x.unionByName(y, allowMissingColumns=True), + # create interval instances by parsing each source + [ + Intervals.from_source( + self.session.spark, source_name, source_path, gene_index, lift + ).df + for source_name, source_path in self.intervals.items() + ], + ), + _schema=Intervals.get_schema(), ) - - # Expected andersson et al. schema: v2g_datasets = [ va_slimmed.get_distance_to_tss(gene_index_filtered, self.max_distance), - # variant effects va_slimmed.get_most_severe_vep_v2g(vep_consequences, gene_index_filtered), - va_slimmed.get_polyphen_v2g(gene_index_filtered), - va_slimmed.get_sift_v2g(gene_index_filtered), va_slimmed.get_plof_v2g(gene_index_filtered), - # intervals - IntervalsAndersson.parse( - IntervalsAndersson.read_andersson(self.session, self.anderson_path), - gene_index_filtered, - lift, - ).v2g(vi), - IntervalsJavierre.parse( - IntervalsJavierre.read_javierre(self.session, self.javierre_path), - gene_index_filtered, - lift, - ).v2g(vi), - IntervalsJung.parse( - IntervalsJung.read_jung(self.session, self.jung_path), - gene_index_filtered, - lift, - ).v2g(vi), - IntervalsThurnman.parse( - IntervalsThurnman.read_thurnman(self.session, self.thurnman_path), - gene_index_filtered, - lift, - ).v2g(vi), + intervals.v2g(vi), ] - - # merge all V2G datasets v2g = V2G( _df=reduce( lambda x, y: x.unionByName(y, allowMissingColumns=True), [dataset.df for dataset in v2g_datasets], - ).repartition("chromosome") + ).repartition("chromosome"), + _schema=V2G.get_schema(), ) - # write V2G dataset + + # Load ( v2g.df.write.partitionBy("chromosome") .mode(self.session.write_mode) diff --git a/src/otg/variant_annotation.py b/src/otg/variant_annotation.py index ceb6ffe92..0573f8d50 100644 --- a/src/otg/variant_annotation.py +++ b/src/otg/variant_annotation.py @@ -4,37 +4,35 @@ from dataclasses import dataclass import hail as hl +from omegaconf import MISSING from otg.common.session import Session -from otg.config import VariantAnnotationStepConfig from otg.datasource.gnomad.variants import GnomADVariants @dataclass -class VariantAnnotationStep(VariantAnnotationStepConfig): +class VariantAnnotationStep: """Variant annotation step. Variant annotation step produces a dataset of the type `VariantAnnotation` derived from gnomADs `gnomad.genomes.vX.X.X.sites.ht` Hail's table. This dataset is used to validate variants and as a source of annotation. + + Attributes: + session (Session): Session object. + variant_annotation_path (str): Output variant annotation path. """ - session: Session = Session() + session: Session = MISSING + variant_annotation_path: str = MISSING - def run(self: VariantAnnotationStep) -> None: - """Run variant annotation step.""" - # init hail session + def __post_init__(self: VariantAnnotationStep) -> None: + """Run step.""" + # Initialise hail session. hl.init(sc=self.session.spark.sparkContext, log="/dev/null") - - """Run variant annotation step.""" - variant_annotation = GnomADVariants.as_variant_annotation( - self.gnomad_genomes, - self.chain_38_to_37, - self.populations, - ) - # Writing data partitioned by chromosome and position: + # Run variant annotation. + variant_annotation = GnomADVariants().as_variant_annotation() + # Write data partitioned by chromosome and position. ( - variant_annotation.df.repartition(400, "chromosome") - .sortWithinPartitions("chromosome", "position") - .write.partitionBy("chromosome") - .mode(self.session.write_mode) - .parquet(self.variant_annotation_path) + variant_annotation.df.write.mode(self.session.write_mode).parquet( + self.variant_annotation_path + ) ) diff --git a/src/otg/variant_index.py b/src/otg/variant_index.py index a75c91a71..9b7b73ded 100644 --- a/src/otg/variant_index.py +++ b/src/otg/variant_index.py @@ -3,47 +3,43 @@ from dataclasses import dataclass +from omegaconf import MISSING + from otg.common.session import Session -from otg.config import VariantIndexStepConfig from otg.dataset.study_locus import StudyLocus from otg.dataset.variant_annotation import VariantAnnotation from otg.dataset.variant_index import VariantIndex @dataclass -class VariantIndexStep(VariantIndexStepConfig): - """Variant index step. +class VariantIndexStep: + """Run variant index step to only variants in study-locus sets. Using a `VariantAnnotation` dataset as a reference, this step creates and writes a dataset of the type `VariantIndex` that includes only variants that have disease-association data with a reduced set of annotations. + + Attributes: + session (Session): Session object. + variant_annotation_path (str): Input variant annotation path. + study_locus_path (str): Input study-locus path. + variant_index_path (str): Output variant index path. """ - session: Session = Session() + session: Session = MISSING + variant_annotation_path: str = MISSING + credible_set_path: str = MISSING + variant_index_path: str = MISSING - def run(self: VariantIndexStep) -> None: - """Run variant index step.""" - # Variant annotation dataset + def __post_init__(self: VariantIndexStep) -> None: + """Run step.""" + # Extract va = VariantAnnotation.from_parquet(self.session, self.variant_annotation_path) - - # Study-locus dataset - study_locus = StudyLocus.from_parquet(self.session, self.study_locus_path) - - # Reduce scope of variant annotation dataset to only variants in study-locus sets: - va_slimmed = va.filter_by_variant_df( - study_locus.unique_lead_tag_variants(), ["id", "chromosome"] + credible_set = StudyLocus.from_parquet( + self.session, self.credible_set_path, recursiveFileLookup=True ) - # Generate variant index ussing a subset of the variant annotation dataset - vi = VariantIndex.from_variant_annotation(va_slimmed) - - # Write data: - # self.etl.logger.info( - # f"Writing invalid variants from the credible set to: {self.variant_invalid}" - # ) - # vi.invalid_variants.write.mode(self.etl.write_mode).parquet( - # self.variant_invalid - # ) + # Transform + vi = VariantIndex.from_variant_annotation(va, credible_set) - self.session.logger.info(f"Writing variant index to: {self.variant_index_path}") ( vi.df.write.partitionBy("chromosome") .mode(self.session.write_mode) diff --git a/src/utils/__init__.py b/src/utils/__init__.py new file mode 100644 index 000000000..0c4858c7d --- /dev/null +++ b/src/utils/__init__.py @@ -0,0 +1,3 @@ +"""Utils.""" + +from __future__ import annotations diff --git a/src/scripts/schemadocs.py b/src/utils/schemadocs.py similarity index 73% rename from src/scripts/schemadocs.py rename to src/utils/schemadocs.py index 5ecd737b2..ebf1ebfbb 100644 --- a/src/scripts/schemadocs.py +++ b/src/utils/schemadocs.py @@ -18,8 +18,7 @@ def spark_connect() -> SparkSession: Returns: SparkSession: SparkSession object. """ - spark = SparkSession.builder.master("local[1]").appName("schemas").getOrCreate() - return spark + return SparkSession.builder.master("local[1]").appName("schemas").getOrCreate() def generate_schema_assets( @@ -28,9 +27,9 @@ def generate_schema_assets( """Generate schema assets for mkdocs documentation. Args: - spark: SparkSession object. - assets_dir: Path to assets directory. - schema_dir: Path to schema directory. + spark (SparkSession): SparkSession object. + assets_dir (Path): Path to assets directory. + schema_dir (str): Path to schema directory. """ for i in os.listdir(schema_dir): if i.endswith(".json"): @@ -40,17 +39,16 @@ def generate_schema_assets( df = spark.createDataFrame([], input_schema) outfilename = i.replace("json", "md") with (assets_dir / outfilename).open("w") as out: - tree = df._jdf.schema().treeString() # type: ignore + tree = df._jdf.schema().treeString() out.write(f"```\n{tree}\n```") @mkdocs.plugins.event_priority(50) -def on_pre_build(config: MkdocsConfig, **kwargs) -> None: +def on_pre_build(config: MkdocsConfig) -> None: """Main function. Args: - config: MkdocsConfig object. - **kwargs: Arbitrary keyword arguments. + config (MkdocsConfig): MkdocsConfig object. """ # Create schema dir if not exist: assets_dir = Path("docs/assets/schemas") @@ -62,4 +60,3 @@ def on_pre_build(config: MkdocsConfig, **kwargs) -> None: assets_dir=assets_dir, schema_dir="src/otg/assets/schemas", ) - print(f"Schema assests generated for {config['site_name']}") diff --git a/src/utils/spark.py b/src/utils/spark.py new file mode 100644 index 000000000..b5099bca7 --- /dev/null +++ b/src/utils/spark.py @@ -0,0 +1,39 @@ +"""Spark utilities.""" +from __future__ import annotations + +from pathlib import Path + +import hail as hl +from pyspark.conf import SparkConf + + +def get_spark_testing_conf() -> SparkConf: + """Get SparkConf for testing purposes. + + Returns: + SparkConf: SparkConf with settings for testing. + """ + hail_home = Path(hl.__file__).parent.as_posix() + return ( + SparkConf() + .set("spark.driver.bindAddress", "127.0.0.1") + # No shuffling. + .set("spark.sql.shuffle.partitions", "1") + # UI settings. + .set("spark.ui.showConsoleProgress", "false") + .set("spark.ui.enabled", "false") + .set("spark.ui.dagGraph.retainedRootRDDs", "1") + .set("spark.ui.retainedJobs", "1") + .set("spark.ui.retainedStages", "1") + .set("spark.ui.retainedTasks", "1") + .set("spark.sql.ui.retainedExecutions", "1") + .set("spark.worker.ui.retainedExecutors", "1") + .set("spark.worker.ui.retainedDrivers", "1") + # Fixed memory. + .set("spark.driver.memory", "2g") + .set("spark.jars", f"{hail_home}/backend/hail-all-spark.jar") + .set("spark.driver.extraClassPath", f"{hail_home}/backend/hail-all-spark.jar") + .set("spark.executor.extraClassPath", "./hail-all-spark.jar") + .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") + .set("spark.kryo.registrator", "is.hail.kryo.HailKryoRegistrator") + ) diff --git a/templates/.release_notes.md.j2 b/templates/.release_notes.md.j2 new file mode 100644 index 000000000..81af53590 --- /dev/null +++ b/templates/.release_notes.md.j2 @@ -0,0 +1,11 @@ +{% macro add_emoji(commit_type) %}{% if commit_type == "feature" %}✨{% elif commit_type == "fix" %}🐛{% elif commit_type == "documentation" %}📖{% elif commit_type == "style" %}🎨{% elif commit_type == "refactor" %}♻️{% elif commit_type == "test" %}✅{% elif commit_type == "chore" %}🚀{% elif commit_type == "performance" %}⚡️{% elif commit_type == "ci" %}👷‍♂️{% elif commit_type == "build" %}🏗{% elif commit_type == "breaking" %}💥{% elif commit_type == "unknown" %}🤷‍♂️{% elif commit_type == "revert" %}⏪{% else %}🤷‍♂️{% endif %}{% endmacro %} + +{% macro commit_scope(commit_summary) %}{{ commit_summary.split(":")[0] }}{% endmacro %} +{% macro commit_content(commit_summary) %}{{ commit_summary.split(":")[1] }}{% endmacro %} +## What's Changed +{% for type_, commits in release["elements"] | dictsort %} +### {{ add_emoji(type_) }} {{ type_ | capitalize }} +{%- if type_ != "unknown" %} +{% for commit in commits %} +- {{ commit_content(commit.commit.summary) }} - [`{{ commit.commit.hexsha[:7] }}`]({{ commit.commit.hexsha | commit_hash_url }}) ([{{ commit.commit.author.name }}](mailto:{{commit.commit.author.email}})) +{%- endfor %}{% endif %}{% endfor %} diff --git a/templates/CHANGELOG.md.j2 b/templates/CHANGELOG.md.j2 new file mode 100644 index 000000000..c61ea7c09 --- /dev/null +++ b/templates/CHANGELOG.md.j2 @@ -0,0 +1,27 @@ +{% macro add_emoji(commit_type) %}{% if commit_type == "feature" %}✨{% elif commit_type == "fix" %}🐛{% elif commit_type == "documentation" %}📖{% elif commit_type == "style" %}🎨{% elif commit_type == "refactor" %}♻️{% elif commit_type == "test" %}✅{% elif commit_type == "chore" %}🚀{% elif commit_type == "performance" %}⚡️{% elif commit_type == "ci" %}👷‍♂️{% elif commit_type == "build" %}🏗{% elif commit_type == "breaking" %}💥{% elif commit_type == "unknown" %}🤷‍♂️{% elif commit_type == "revert" %}⏪{% else %}🤷‍♂️{% endif %}{% endmacro %} + +{% macro commit_scope(commit_summary) %}{{ commit_summary.split(":")[0] }}{% endmacro %} +{% macro commit_content(commit_summary) %}{{ commit_summary.split(":")[1] }}{% endmacro %} +# CHANGELOG +{% if context.history.unreleased | length > 0 %} + +{# UNRELEASED #} +## Unreleased +{% for type_, commits in context.history.unreleased | dictsort %} +### add_emoji({{type_}}) {{ type_ | capitalize }} +{% for commit in commits %}{% if type_ != "unknown" %} +- {{ commit_content(commit.commit.summary) }} - [`{{ commit.commit.hexsha[:7] }}`]({{ commit.commit.hexsha | commit_hash_url }}) ([{{ commit.commit.author.name }}](mailto:{{commit.commit.author.email}})) +{% else %} +- {{ commit_content(commit.commit.summary) }} - [`{{ commit.commit.hexsha[:7] }}`]({{ commit.commit.hexsha | commit_hash_url }}) ([{{ commit.commit.author.name }}](mailto:{{commit.commit.author.email}})) +{% endif %}{% endfor %}{% endfor %}{% endif %} + +{# RELEASED #} +{% for version, release in context.history.released.items() %} +## {{ version.as_tag() }} ({{ release.tagged_date.strftime("%Y-%m-%d") }}) +{% for type_, commits in release["elements"] | dictsort %} +### {{ add_emoji(type_) }} {{ type_ | capitalize }} +{% for commit in commits %}{% if type_ != "unknown" %} +- {{ commit_content(commit.commit.summary) }} - [`{{ commit.commit.hexsha[:7] }}`]({{ commit.commit.hexsha | commit_hash_url }}) ([{{ commit.commit.author.name }}](mailto:{{commit.commit.author.email}})) +{% else %} +- {{ commit_content(commit.commit.summary) }} - [`{{ commit.commit.hexsha[:7] }}`]({{ commit.commit.hexsha | commit_hash_url }}) ([{{ commit.commit.author.name }}](mailto:{{commit.commit.author.email}})) +{% endif %}{% endfor %}{% endfor %}{% endfor %} diff --git a/tests/airflow/test_dag.py b/tests/airflow/test_dag.py index 0e0697531..8676d70f4 100644 --- a/tests/airflow/test_dag.py +++ b/tests/airflow/test_dag.py @@ -6,43 +6,44 @@ @pytest.fixture(params=["./src/airflow/dags"]) -def dag_bag(request): +def dag_bag(request: pytest.FixtureRequest) -> DagBag: """Return a DAG bag for testing.""" return DagBag(dag_folder=request.param, include_examples=False) -def test_no_import_errors(dag_bag): +def test_no_import_errors(dag_bag: DagBag) -> None: """Test for import errors.""" assert ( not dag_bag.import_errors ), f"DAG import failures. Errors: {dag_bag.import_errors}" -def test_requires_tags(dag_bag): +def test_requires_tags(dag_bag: DagBag) -> None: """Tags should be defined for each DAG.""" for _, dag in dag_bag.dags.items(): assert dag.tags -def test_owner_len_greater_than_five(dag_bag): +def test_owner_len_greater_than_five(dag_bag: DagBag) -> None: """Owner should be defined for each DAG and be longer than 5 characters.""" for _, dag in dag_bag.dags.items(): assert len(dag.owner) > 5 -def test_desc_len_greater_than_fifteen(dag_bag): +def test_desc_len_greater_than_fifteen(dag_bag: DagBag) -> None: """Description should be defined for each DAG and be longer than 30 characters.""" for _, dag in dag_bag.dags.items(): - assert len(dag.description) > 30 + if isinstance(dag.description, str): + assert len(dag.description) > 30 -def test_owner_not_airflow(dag_bag): +def test_owner_not_airflow(dag_bag: DagBag) -> None: """Owner should not be 'airflow'.""" for _, dag in dag_bag.dags.items(): assert str.lower(dag.owner) != "airflow" -def test_three_or_less_retries(dag_bag): +def test_three_or_less_retries(dag_bag: DagBag) -> None: """Retries should be 3 or less.""" for _, dag in dag_bag.dags.items(): assert dag.default_args["retries"] <= 3 diff --git a/tests/common/test_session.py b/tests/common/test_session.py index 06fa23ee4..c87a8a86a 100644 --- a/tests/common/test_session.py +++ b/tests/common/test_session.py @@ -14,6 +14,24 @@ def test_session_creation() -> None: assert isinstance(Session(spark_uri="local[1]"), Session) +def test_hail_configuration(hail_home: str) -> None: + """Assert that Hail configuration is set when start_hail is True.""" + session = Session(spark_uri="local[1]", hail_home=hail_home, start_hail=True) + + expected_hail_conf = { + "spark.jars": f"{hail_home}/backend/hail-all-spark.jar", + "spark.driver.extraClassPath": f"{hail_home}/backend/hail-all-spark.jar", + "spark.executor.extraClassPath": "./hail-all-spark.jar", + "spark.serializer": "org.apache.spark.serializer.KryoSerializer", + "spark.kryo.registrator": "is.hail.kryo.HailKryoRegistrator", + } + + observed_conf = dict(session.spark.sparkContext.getConf().getAll()) + # sourcery skip: no-loop-in-tests + for key, value in expected_hail_conf.items(): + assert observed_conf.get(key) == value, f"Expected {key} to be set to {value}" + + def test_log4j_creation(spark: SparkSession) -> None: """Test session log4j.""" assert isinstance(Log4j(spark=spark), Log4j) diff --git a/tests/conftest.py b/tests/conftest.py index b8206996e..f23a7949c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,14 +1,19 @@ """Unit test configuration.""" from __future__ import annotations +from pathlib import Path + import dbldatagen as dg +import hail as hl import pytest -from pyspark.sql import DataFrame, SparkSession - from otg.common.Liftover import LiftOverSpark +from otg.common.session import Session from otg.dataset.colocalisation import Colocalisation from otg.dataset.gene_index import GeneIndex from otg.dataset.intervals import Intervals +from otg.dataset.l2g_feature_matrix import L2GFeatureMatrix +from otg.dataset.l2g_gold_standard import L2GGoldStandard +from otg.dataset.l2g_prediction import L2GPrediction from otg.dataset.ld_index import LDIndex from otg.dataset.study_index import StudyIndex from otg.dataset.study_locus import StudyLocus @@ -17,49 +22,43 @@ from otg.dataset.v2g import V2G from otg.dataset.variant_annotation import VariantAnnotation from otg.dataset.variant_index import VariantIndex -from otg.datasource.finngen.study_index import FinnGenStudyIndex -from otg.datasource.finngen.summary_stats import FinnGenSummaryStats -from otg.datasource.gwas_catalog.associations import GWASCatalogAssociations -from otg.datasource.gwas_catalog.study_index import GWASCatalogStudyIndex -from otg.datasource.ukbiobank.study_index import UKBiobankStudyIndex +from otg.datasource.gwas_catalog.associations import StudyLocusGWASCatalog +from otg.datasource.gwas_catalog.study_index import StudyIndexGWASCatalog +from pyspark.sql import DataFrame, SparkSession + +from utils.spark import get_spark_testing_conf @pytest.fixture(scope="session", autouse=True) -def spark(tmp_path_factory) -> SparkSession: +def spark(tmp_path_factory: pytest.TempPathFactory) -> SparkSession: """Local spark session for testing purposes. + Args: + tmp_path_factory (pytest.TempPathFactory): pytest fixture + Returns: SparkSession: local spark session """ return ( - SparkSession.builder.master("local[1]") - .config("spark.driver.bindAddress", "127.0.0.1") - .config("spark.executor.cores", "1") - .config("spark.executor.instances", "1") - # no shuffling - .config("spark.sql.shuffle.partitions", "1") - # ui settings - .config("spark.ui.showConsoleProgress", "false") - .config("spark.ui.enabled", "false") - .config("spark.ui.dagGraph.retainedRootRDDs", "1") - .config("spark.ui.retainedJobs", "1") - .config("spark.ui.retainedStages", "1") - .config("spark.ui.retainedTasks", "1") - .config("spark.sql.ui.retainedExecutions", "1") - .config("spark.worker.ui.retainedExecutors", "1") - .config("spark.worker.ui.retainedDrivers", "1") - # fixed memory - .config("spark.driver.memory", "2g") - .config("spark.sql.warehouse.dir", tmp_path_factory.mktemp("warehouse")) - .config( - "spark.driver.extraJavaOptions", - "-Dderby.system.home={tmp_path_factory.mktemp('derby')}", - ) + SparkSession.builder.config(conf=get_spark_testing_conf()) + .master("local[1]") .appName("test") .getOrCreate() ) +@pytest.fixture() +def session() -> Session: + """Return OTG Session object.""" + return Session() + + +@pytest.fixture() +def hail_home() -> str: + """Return the path to the Hail home directory.""" + return Path(hl.__file__).parent.as_posix() + + @pytest.fixture() def mock_colocalisation(spark: SparkSession) -> Colocalisation: """Mock colocalisation dataset.""" @@ -85,7 +84,7 @@ def mock_colocalisation(spark: SparkSession) -> Colocalisation: def mock_study_index_data(spark: SparkSession) -> DataFrame: - """Mock v2g dataset.""" + """Mock study index dataset.""" si_schema = StudyIndex.get_schema() data_spec = ( @@ -116,6 +115,7 @@ def mock_study_index_data(spark: SparkSession) -> DataFrame: expr='array(named_struct("sampleSize", cast(rand() as string), "ancestry", cast(rand() as string)))', percentNulls=0.1, ) + .withColumnSpec("geneId", percentNulls=0.1) .withColumnSpec("pubmedId", percentNulls=0.1) .withColumnSpec("publicationFirstAuthor", percentNulls=0.1) .withColumnSpec("publicationDate", percentNulls=0.1) @@ -126,6 +126,7 @@ def mock_study_index_data(spark: SparkSession) -> DataFrame: .withColumnSpec("nControls", percentNulls=0.1) .withColumnSpec("nSamples", percentNulls=0.1) .withColumnSpec("summarystatsLocation", percentNulls=0.1) + .withColumnSpec("studyType", percentNulls=0.0, values=["eqtl", "pqtl", "sqtl"]) ) return data_spec.build() @@ -140,38 +141,11 @@ def mock_study_index(spark: SparkSession) -> StudyIndex: @pytest.fixture() -def mock_study_index_gwas_catalog(spark: SparkSession) -> GWASCatalogStudyIndex: +def mock_study_index_gwas_catalog(spark: SparkSession) -> StudyIndexGWASCatalog: """Mock GWASCatalogStudyIndex dataset.""" - return GWASCatalogStudyIndex( - _df=mock_study_index_data(spark), - _schema=StudyIndex.get_schema(), - ) - - -@pytest.fixture() -def mock_study_index_finngen(spark: SparkSession) -> FinnGenStudyIndex: - """Mock FinnGenStudyIndex dataset.""" - return FinnGenStudyIndex( + return StudyIndexGWASCatalog( _df=mock_study_index_data(spark), - _schema=StudyIndex.get_schema(), - ) - - -@pytest.fixture() -def mock_summary_stats_finngen(spark: SparkSession) -> FinnGenSummaryStats: - """Mock FinnGenSummaryStats dataset.""" - return FinnGenSummaryStats( - _df=mock_summary_statistics(spark), - _schema=SummaryStatistics.get_schema(), - ) - - -@pytest.fixture() -def mock_study_index_ukbiobank(spark: SparkSession) -> UKBiobankStudyIndex: - """Mock StudyIndexUKBiobank dataset.""" - return UKBiobankStudyIndex( - _df=mock_study_index_data(spark), - _schema=UKBiobankStudyIndex.get_schema(), + _schema=StudyIndexGWASCatalog.get_schema(), ) @@ -205,11 +179,6 @@ def mock_study_locus_data(spark: SparkSession) -> DataFrame: .withColumnSpec("chromosome", percentNulls=0.1) .withColumnSpec("position", percentNulls=0.1) .withColumnSpec("beta", percentNulls=0.1) - .withColumnSpec("oddsRatio", percentNulls=0.1) - .withColumnSpec("oddsRatioConfidenceIntervalLower", percentNulls=0.1) - .withColumnSpec("oddsRatioConfidenceIntervalUpper", percentNulls=0.1) - .withColumnSpec("betaConfidenceIntervalLower", percentNulls=0.1) - .withColumnSpec("betaConfidenceIntervalUpper", percentNulls=0.1) .withColumnSpec("effectAlleleFrequencyFromSource", percentNulls=0.1) .withColumnSpec("standardError", percentNulls=0.1) .withColumnSpec("subStudyDescription", percentNulls=0.1) @@ -240,11 +209,11 @@ def mock_study_locus(spark: SparkSession) -> StudyLocus: @pytest.fixture() -def mock_study_locus_gwas_catalog(spark: SparkSession) -> StudyLocus: +def mock_study_locus_gwas_catalog(spark: SparkSession) -> StudyLocusGWASCatalog: """Mock study_locus dataset.""" - return GWASCatalogAssociations( + return StudyLocusGWASCatalog( _df=mock_study_locus_data(spark), - _schema=GWASCatalogAssociations.get_schema(), + _schema=StudyLocusGWASCatalog.get_schema(), ) @@ -285,10 +254,9 @@ def mock_v2g(spark: SparkSession) -> V2G: .withSchema(v2g_schema) .withColumnSpec("distance", percentNulls=0.1) .withColumnSpec("resourceScore", percentNulls=0.1) + .withColumnSpec("score", percentNulls=0.1) .withColumnSpec("pmid", percentNulls=0.1) .withColumnSpec("biofeature", percentNulls=0.1) - .withColumnSpec("score", percentNulls=0.1) - .withColumnSpec("label", percentNulls=0.1) .withColumnSpec("variantFunctionalConsequenceId", percentNulls=0.1) .withColumnSpec("isHighQualityPlof", percentNulls=0.1) ) @@ -320,15 +288,15 @@ def mock_variant_annotation(spark: SparkSession) -> VariantAnnotation: expr='array(named_struct("alleleFrequency", rand(), "populationName", cast(rand() as string)))', percentNulls=0.1, ) + .withColumnSpec("rsIds", expr="array(cast(rand() AS string))", percentNulls=0.1) .withColumnSpec( - "cadd", - expr='named_struct("phred", cast(rand() as float), "raw", cast(rand() as float))', + "vep", + expr='named_struct("mostSevereConsequence", cast(rand() as string), "transcriptConsequences", array(named_struct("aminoAcids", cast(rand() as string), "consequenceTerms", array(cast(rand() as string)), "geneId", cast(rand() as string), "lof", cast(rand() as string))))', percentNulls=0.1, ) - .withColumnSpec("rsIds", expr="array(cast(rand() AS string))", percentNulls=0.1) .withColumnSpec( - "vep", - expr='named_struct("mostSevereConsequence", cast(rand() as string), "transcriptConsequences", array(named_struct("aminoAcids", cast(rand() as string), "consequenceTerms", array(cast(rand() as string)), "geneId", cast(rand() as string), "lof", cast(rand() as string), "polyphenPrediction", cast(rand() as string), "polyphenScore", cast(rand() as float), "siftPrediction", cast(rand() as string), "siftScore", cast(rand() as float))))', + "inSilicoPredictors", + expr='named_struct("cadd", named_struct("phred", cast(rand() as float), "raw_score", cast(rand() as float)), "revelMax", cast(rand() as double), "spliceaiDsMax", cast(rand() as float), "pangolinLargestDs", cast(rand() as double), "phylop", cast(rand() as double), "polyphenMax", cast(rand() as double), "siftMax", cast(rand() as double))', percentNulls=0.1, ) ) @@ -337,7 +305,7 @@ def mock_variant_annotation(spark: SparkSession) -> VariantAnnotation: @pytest.fixture() def mock_variant_index(spark: SparkSession) -> VariantIndex: - """Mock gene index.""" + """Mock variant index.""" vi_schema = VariantIndex.get_schema() data_spec = ( @@ -360,8 +328,8 @@ def mock_variant_index(spark: SparkSession) -> VariantIndex: percentNulls=0.1, ) .withColumnSpec( - "cadd", - expr='named_struct("phred", cast(rand() AS float), "raw", cast(rand() AS float))', + "inSilicoPredictors", + expr='named_struct("cadd", named_struct("phred", cast(rand() as float), "raw_score", cast(rand() as float)), "revelMax", cast(rand() as double), "spliceaiDsMax", cast(rand() as float), "pangolinLargestDs", cast(rand() as double), "phylop", cast(rand() as double), "polyphenMax", cast(rand() as double), "siftMax", cast(rand() as double))', percentNulls=0.1, ) .withColumnSpec("rsIds", expr="array(cast(rand() AS string))", percentNulls=0.1) @@ -371,8 +339,15 @@ def mock_variant_index(spark: SparkSession) -> VariantIndex: @pytest.fixture() -def mock_summary_statistics(spark: SparkSession) -> SummaryStatistics: - """Generating a mock summary statistics dataset.""" +def mock_summary_statistics_data(spark: SparkSession) -> DataFrame: + """Generating mock summary statistics data. + + Args: + spark (SparkSession): Spark session + + Returns: + DataFrame: Mock summary statistics data + """ ss_schema = SummaryStatistics.get_schema() data_spec = ( @@ -389,18 +364,21 @@ def mock_summary_statistics(spark: SparkSession) -> SummaryStatistics: "effectAlleleFrequencyFromSource", percentNulls=0.1, maxValue=1.0 ) # Allowing missingness: - .withColumnSpec("betaConfidenceIntervalLower", percentNulls=0.1) - .withColumnSpec("betaConfidenceIntervalUpper", percentNulls=0.1) .withColumnSpec("standardError", percentNulls=0.1) # Making sure p-values are below 1: ).build() - # Because some of the columns are not strictly speaking required, they are dropped now: - data_spec = data_spec.drop( - "betaConfidenceIntervalLower", "betaConfidenceIntervalUpper" - ) + return data_spec + - return SummaryStatistics(_df=data_spec, _schema=ss_schema) +@pytest.fixture() +def mock_summary_statistics( + mock_summary_statistics_data: DataFrame, +) -> SummaryStatistics: + """Generating a mock summary statistics dataset.""" + return SummaryStatistics( + _df=mock_summary_statistics_data, _schema=SummaryStatistics.get_schema() + ) @pytest.fixture() @@ -445,16 +423,6 @@ def sample_gwas_catalog_ancestries_lut(spark: SparkSession) -> DataFrame: ) -@pytest.fixture() -def sample_gwas_catalog_harmonised_sumstats(spark: SparkSession) -> DataFrame: - """Sample GWAS harmonised sumstats sample data.""" - return spark.read.csv( - "tests/data_samples/gwas_summary_stats_sample.tsv.gz", - sep="\t", - header=True, - ) - - @pytest.fixture() def sample_gwas_catalog_harmonised_sumstats_list(spark: SparkSession) -> DataFrame: """Sample GWAS harmonised sumstats sample data.""" @@ -496,13 +464,26 @@ def sample_finngen_studies(spark: SparkSession) -> DataFrame: @pytest.fixture() -def sample_finngen_summary_stats(spark: SparkSession) -> DataFrame: - """Sample FinnGen summary stats.""" +def sample_eqtl_catalogue_studies(spark: SparkSession) -> DataFrame: + """Sample eQTL Catalogue studies.""" # For reference, the sample file was generated with the following command: - # gsutil cat gs://finngen-public-data-r9/summary_stats/finngen_R9_AB1_ACTINOMYCOSIS.gz | gzip -cd | head -n11 | gzip -c > tests/data_samples/finngen_R9_AB1_ACTINOMYCOSIS.gz - # It's important for the test file to be named in exactly this way, because FinnGen study ID is populated based on input file name. + # curl https://raw.githubusercontent.com/eQTL-Catalogue/eQTL-Catalogue-resources/master/tabix/tabix_ftp_paths_imported.tsv | head -n11 > tests/data_samples/eqtl_catalogue_studies_sample.tsv + with open("tests/data_samples/eqtl_catalogue_studies_sample.tsv") as eqtl_catalogue: + tsv = eqtl_catalogue.read() + rdd = spark.sparkContext.parallelize([tsv]) + return spark.read.csv(rdd, sep="\t", header=True) + + +@pytest.fixture() +def sample_eqtl_catalogue_summary_stats(spark: SparkSession) -> DataFrame: + """Sample eQTL Catalogue summary stats.""" + # For reference, the sample file was generated with the following commands: + # mkdir -p tests/data_samples/imported/GTEx_V8/ge + # curl ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Adipose_Subcutaneous.tsv.gz | gzip -cd | head -n11 | gzip -c > tests/data_samples/imported/GTEx_V8/ge/Adipose_Subcutaneous.tsv.gz + # It's important for the test file to be named in exactly this way, because eQTL Catalogue study ID is populated based on input file name. return spark.read.option("delimiter", "\t").csv( - "tests/data_samples/finngen_R9_AB1_ACTINOMYCOSIS.gz", header=True + "tests/data_samples/imported/GTEx_V8/ge/Adipose_Subcutaneous.tsv.gz", + header=True, ) @@ -552,6 +533,79 @@ def mock_gene_index(spark: SparkSession) -> GeneIndex: @pytest.fixture() -def liftover_chain_37_to_38(spark: SparkSession) -> DataFrame: +def liftover_chain_37_to_38(spark: SparkSession) -> LiftOverSpark: """Sample liftover chain file.""" return LiftOverSpark("tests/data_samples/grch37_to_grch38.over.chain") + + +@pytest.fixture() +def sample_l2g_gold_standard(spark: SparkSession) -> DataFrame: + """Sample L2G gold standard curation.""" + return spark.read.json( + "tests/data_samples/l2g_gold_standard_curation_sample.json.gz", + ) + + +@pytest.fixture() +def sample_otp_interactions(spark: SparkSession) -> DataFrame: + """Sample OTP gene-gene interactions dataset.""" + return spark.read.parquet( + "tests/data_samples/otp_interactions_sample.parquet", + ) + + +@pytest.fixture() +def mock_l2g_feature_matrix(spark: SparkSession) -> L2GFeatureMatrix: + """Mock l2g feature matrix dataset.""" + schema = L2GFeatureMatrix.get_schema() + + data_spec = ( + dg.DataGenerator( + spark, + rows=50, + partitions=4, + randomSeedMethod="hash_fieldname", + ) + .withSchema(schema) + .withColumnSpec("distanceTssMean", percentNulls=0.1) + .withColumnSpec("distanceTssMinimum", percentNulls=0.1) + .withColumnSpec("eqtlColocClppLocalMaximum", percentNulls=0.1) + .withColumnSpec("eqtlColocClppNeighborhoodMaximum", percentNulls=0.1) + .withColumnSpec("eqtlColocLlrLocalMaximum", percentNulls=0.1) + .withColumnSpec("eqtlColocLlrNeighborhoodMaximum", percentNulls=0.1) + .withColumnSpec("pqtlColocClppLocalMaximum", percentNulls=0.1) + .withColumnSpec("pqtlColocClppNeighborhoodMaximum", percentNulls=0.1) + .withColumnSpec("pqtlColocLlrLocalMaximum", percentNulls=0.1) + .withColumnSpec("pqtlColocLlrNeighborhoodMaximum", percentNulls=0.1) + .withColumnSpec("sqtlColocClppLocalMaximum", percentNulls=0.1) + .withColumnSpec("sqtlColocClppNeighborhoodMaximum", percentNulls=0.1) + .withColumnSpec("sqtlColocLlrLocalMaximum", percentNulls=0.1) + .withColumnSpec("sqtlColocLlrNeighborhoodMaximum", percentNulls=0.1) + .withColumnSpec( + "goldStandardSet", percentNulls=0.0, values=["positive", "negative"] + ) + ) + + return L2GFeatureMatrix(_df=data_spec.build(), _schema=schema) + + +@pytest.fixture() +def mock_l2g_gold_standard(spark: SparkSession) -> L2GGoldStandard: + """Mock l2g gold standard dataset.""" + schema = L2GGoldStandard.get_schema() + data_spec = dg.DataGenerator( + spark, rows=400, partitions=4, randomSeedMethod="hash_fieldname" + ).withSchema(schema) + + return L2GGoldStandard(_df=data_spec.build(), _schema=schema) + + +@pytest.fixture() +def mock_l2g_predictions(spark: SparkSession) -> L2GPrediction: + """Mock l2g predictions dataset.""" + schema = L2GPrediction.get_schema() + data_spec = dg.DataGenerator( + spark, rows=400, partitions=4, randomSeedMethod="hash_fieldname" + ).withSchema(schema) + + return L2GPrediction(_df=data_spec.build(), _schema=schema) diff --git a/tests/data_samples/GCST005523_chr18.parquet b/tests/data_samples/GCST005523_chr18.parquet index f8257c109..7d8cf9be6 100644 Binary files a/tests/data_samples/GCST005523_chr18.parquet and b/tests/data_samples/GCST005523_chr18.parquet differ diff --git a/tests/data_samples/eqtl_catalogue_studies_sample.tsv b/tests/data_samples/eqtl_catalogue_studies_sample.tsv new file mode 100644 index 000000000..f756ecd6e --- /dev/null +++ b/tests/data_samples/eqtl_catalogue_studies_sample.tsv @@ -0,0 +1,11 @@ +study qtl_group tissue_ontology_id tissue_ontology_term tissue_label condition_label quant_method ftp_path +GTEx_V8 Adipose_Subcutaneous UBER_0002190 subcutaneous adipose tissue Adipose - Subcutaneous naive ge ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Adipose_Subcutaneous.tsv.gz +GTEx_V8 Adipose_Visceral_Omentum UBER_0010414 omental fat pad Adipose - Visceral (Omentum) naive ge ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Adipose_Visceral_Omentum.tsv.gz +GTEx_V8 Adrenal_Gland UBER_0002369 adrenal gland Adrenal Gland naive ge ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Adrenal_Gland.tsv.gz +GTEx_V8 Artery_Aorta UBER_0001496 ascending aorta Artery - Aorta naive ge ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Artery_Aorta.tsv.gz +GTEx_V8 Artery_Coronary UBER_0001621 coronary artery Artery - Coronary naive ge ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Artery_Coronary.tsv.gz +GTEx_V8 Artery_Tibial UBER_0007610 tibial artery Artery - Tibial naive ge ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Artery_Tibial.tsv.gz +GTEx_V8 Brain_Amygdala UBER_0001876 amygdala Brain - Amygdala naive ge ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Brain_Amygdala.tsv.gz +GTEx_V8 Brain_Anterior_cingulate_cortex_BA24 UBER_0009835 anterior cingulate cortex Brain - Anterior cingulate cortex (BA24) naive ge ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Brain_Anterior_cingulate_cortex_BA24.tsv.gz +GTEx_V8 Brain_Caudate_basal_ganglia UBER_0001873 caudate nucleus Brain - Caudate (basal ganglia) naive ge ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Brain_Caudate_basal_ganglia.tsv.gz +GTEx_V8 Brain_Cerebellar_Hemisphere UBER_0002037 cerebellum Brain - Cerebellar Hemisphere naive ge ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Brain_Cerebellar_Hemisphere.tsv.gz diff --git a/tests/data_samples/example_test-pop.bm/_SUCCESS b/tests/data_samples/example_test-pop.bm/_SUCCESS new file mode 100644 index 000000000..e69de29bb diff --git a/tests/data_samples/example_test-pop.bm/metadata.json b/tests/data_samples/example_test-pop.bm/metadata.json new file mode 100644 index 000000000..98c1d22bb --- /dev/null +++ b/tests/data_samples/example_test-pop.bm/metadata.json @@ -0,0 +1,18 @@ +{ + "blockSize": 2, + "nRows": 7, + "nCols": 7, + "maybeFiltered": [0, 4, 5, 8, 9, 10, 12, 13, 14, 15], + "partFiles": [ + "part-00-36-0-0-9da891bc-b3f3-211c-ec5d-b4586236d3f6", + "part-01-36-1-0-0f48a14a-3dc0-261b-3b0e-e3549671ed4b", + "part-02-36-2-0-c23e0dd7-d912-f900-88fd-fae87408e0bd", + "part-03-36-3-0-596fbcf8-3832-3676-1b73-987b185558f9", + "part-04-36-4-0-556c0d84-977b-2faa-376b-e758c55e2f42", + "part-05-36-5-0-8ac23bab-8bc8-8b2e-b897-9d818f17a80e", + "part-06-36-6-0-821b84fa-ae1c-8e95-c967-485dc621bd09", + "part-07-36-7-0-35b03c95-f5f4-aa0a-c39a-3e0a201c7e60", + "part-08-36-8-0-b6d68819-fa17-6649-1400-4113d86b4b81", + "part-09-36-9-0-7e9bb167-9ee1-443f-de8d-dcebf8c9b5fa" + ] +} diff --git a/tests/data_samples/example_test-pop.bm/parts/part-0-17-0-0-e3ab091a-11ed-50ee-431d-8f2be29e7fb0 b/tests/data_samples/example_test-pop.bm/parts/part-0-17-0-0-e3ab091a-11ed-50ee-431d-8f2be29e7fb0 new file mode 100644 index 000000000..e6ab71147 Binary files /dev/null and b/tests/data_samples/example_test-pop.bm/parts/part-0-17-0-0-e3ab091a-11ed-50ee-431d-8f2be29e7fb0 differ diff --git a/tests/data_samples/example_test-pop.bm/parts/part-00-36-0-0-9da891bc-b3f3-211c-ec5d-b4586236d3f6 b/tests/data_samples/example_test-pop.bm/parts/part-00-36-0-0-9da891bc-b3f3-211c-ec5d-b4586236d3f6 new file mode 100644 index 000000000..e6ab71147 Binary files /dev/null and b/tests/data_samples/example_test-pop.bm/parts/part-00-36-0-0-9da891bc-b3f3-211c-ec5d-b4586236d3f6 differ diff --git a/tests/data_samples/example_test-pop.bm/parts/part-01-36-1-0-0f48a14a-3dc0-261b-3b0e-e3549671ed4b b/tests/data_samples/example_test-pop.bm/parts/part-01-36-1-0-0f48a14a-3dc0-261b-3b0e-e3549671ed4b new file mode 100644 index 000000000..ea231e776 Binary files /dev/null and b/tests/data_samples/example_test-pop.bm/parts/part-01-36-1-0-0f48a14a-3dc0-261b-3b0e-e3549671ed4b differ diff --git a/tests/data_samples/example_test-pop.bm/parts/part-02-36-2-0-c23e0dd7-d912-f900-88fd-fae87408e0bd b/tests/data_samples/example_test-pop.bm/parts/part-02-36-2-0-c23e0dd7-d912-f900-88fd-fae87408e0bd new file mode 100644 index 000000000..9af417024 Binary files /dev/null and b/tests/data_samples/example_test-pop.bm/parts/part-02-36-2-0-c23e0dd7-d912-f900-88fd-fae87408e0bd differ diff --git a/tests/data_samples/example_test-pop.bm/parts/part-03-36-3-0-596fbcf8-3832-3676-1b73-987b185558f9 b/tests/data_samples/example_test-pop.bm/parts/part-03-36-3-0-596fbcf8-3832-3676-1b73-987b185558f9 new file mode 100644 index 000000000..84e34a7ce Binary files /dev/null and b/tests/data_samples/example_test-pop.bm/parts/part-03-36-3-0-596fbcf8-3832-3676-1b73-987b185558f9 differ diff --git a/tests/data_samples/example_test-pop.bm/parts/part-04-36-4-0-556c0d84-977b-2faa-376b-e758c55e2f42 b/tests/data_samples/example_test-pop.bm/parts/part-04-36-4-0-556c0d84-977b-2faa-376b-e758c55e2f42 new file mode 100644 index 000000000..350020535 Binary files /dev/null and b/tests/data_samples/example_test-pop.bm/parts/part-04-36-4-0-556c0d84-977b-2faa-376b-e758c55e2f42 differ diff --git a/tests/data_samples/example_test-pop.bm/parts/part-05-36-5-0-8ac23bab-8bc8-8b2e-b897-9d818f17a80e b/tests/data_samples/example_test-pop.bm/parts/part-05-36-5-0-8ac23bab-8bc8-8b2e-b897-9d818f17a80e new file mode 100644 index 000000000..412847da8 Binary files /dev/null and b/tests/data_samples/example_test-pop.bm/parts/part-05-36-5-0-8ac23bab-8bc8-8b2e-b897-9d818f17a80e differ diff --git a/tests/data_samples/example_test-pop.bm/parts/part-06-36-6-0-821b84fa-ae1c-8e95-c967-485dc621bd09 b/tests/data_samples/example_test-pop.bm/parts/part-06-36-6-0-821b84fa-ae1c-8e95-c967-485dc621bd09 new file mode 100644 index 000000000..39266234a Binary files /dev/null and b/tests/data_samples/example_test-pop.bm/parts/part-06-36-6-0-821b84fa-ae1c-8e95-c967-485dc621bd09 differ diff --git a/tests/data_samples/example_test-pop.bm/parts/part-07-36-7-0-35b03c95-f5f4-aa0a-c39a-3e0a201c7e60 b/tests/data_samples/example_test-pop.bm/parts/part-07-36-7-0-35b03c95-f5f4-aa0a-c39a-3e0a201c7e60 new file mode 100644 index 000000000..906ad10d5 Binary files /dev/null and b/tests/data_samples/example_test-pop.bm/parts/part-07-36-7-0-35b03c95-f5f4-aa0a-c39a-3e0a201c7e60 differ diff --git a/tests/data_samples/example_test-pop.bm/parts/part-08-36-8-0-b6d68819-fa17-6649-1400-4113d86b4b81 b/tests/data_samples/example_test-pop.bm/parts/part-08-36-8-0-b6d68819-fa17-6649-1400-4113d86b4b81 new file mode 100644 index 000000000..156abe2ba Binary files /dev/null and b/tests/data_samples/example_test-pop.bm/parts/part-08-36-8-0-b6d68819-fa17-6649-1400-4113d86b4b81 differ diff --git a/tests/data_samples/example_test-pop.bm/parts/part-09-36-9-0-7e9bb167-9ee1-443f-de8d-dcebf8c9b5fa b/tests/data_samples/example_test-pop.bm/parts/part-09-36-9-0-7e9bb167-9ee1-443f-de8d-dcebf8c9b5fa new file mode 100644 index 000000000..3985ba5dd Binary files /dev/null and b/tests/data_samples/example_test-pop.bm/parts/part-09-36-9-0-7e9bb167-9ee1-443f-de8d-dcebf8c9b5fa differ diff --git a/tests/data_samples/example_test-pop.bm/parts/part-1-17-1-0-50da5bf3-93d4-fb68-d8ad-4450d10b2c28 b/tests/data_samples/example_test-pop.bm/parts/part-1-17-1-0-50da5bf3-93d4-fb68-d8ad-4450d10b2c28 new file mode 100644 index 000000000..69c58be20 Binary files /dev/null and b/tests/data_samples/example_test-pop.bm/parts/part-1-17-1-0-50da5bf3-93d4-fb68-d8ad-4450d10b2c28 differ diff --git a/tests/data_samples/example_test-pop.bm/parts/part-2-17-2-0-94bda190-9389-91ab-30ad-9b3c9a3baf39 b/tests/data_samples/example_test-pop.bm/parts/part-2-17-2-0-94bda190-9389-91ab-30ad-9b3c9a3baf39 new file mode 100644 index 000000000..2d8675225 Binary files /dev/null and b/tests/data_samples/example_test-pop.bm/parts/part-2-17-2-0-94bda190-9389-91ab-30ad-9b3c9a3baf39 differ diff --git a/tests/data_samples/example_test-pop.bm/parts/part-3-17-3-0-819f71a1-a22c-8937-48e2-dc686b8ec9c5 b/tests/data_samples/example_test-pop.bm/parts/part-3-17-3-0-819f71a1-a22c-8937-48e2-dc686b8ec9c5 new file mode 100644 index 000000000..df5a43cb6 Binary files /dev/null and b/tests/data_samples/example_test-pop.bm/parts/part-3-17-3-0-819f71a1-a22c-8937-48e2-dc686b8ec9c5 differ diff --git a/tests/data_samples/example_test-pop.bm/parts/part-4-17-4-0-b9ac71e5-8432-3dac-e262-4eb17772eb45 b/tests/data_samples/example_test-pop.bm/parts/part-4-17-4-0-b9ac71e5-8432-3dac-e262-4eb17772eb45 new file mode 100644 index 000000000..1349250e9 Binary files /dev/null and b/tests/data_samples/example_test-pop.bm/parts/part-4-17-4-0-b9ac71e5-8432-3dac-e262-4eb17772eb45 differ diff --git a/tests/data_samples/example_test-pop.bm/parts/part-5-17-5-0-8d7756c7-f87c-eff0-3262-a16def109b7a b/tests/data_samples/example_test-pop.bm/parts/part-5-17-5-0-8d7756c7-f87c-eff0-3262-a16def109b7a new file mode 100644 index 000000000..3985ba5dd Binary files /dev/null and b/tests/data_samples/example_test-pop.bm/parts/part-5-17-5-0-8d7756c7-f87c-eff0-3262-a16def109b7a differ diff --git a/tests/data_samples/example_test-pop.ht/README.txt b/tests/data_samples/example_test-pop.ht/README.txt new file mode 100644 index 000000000..ace05ed2e --- /dev/null +++ b/tests/data_samples/example_test-pop.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.122-be9d88a80695 + Created at 2023/11/09 13:01:06 diff --git a/tests/data_samples/example_test-pop.ht/_SUCCESS b/tests/data_samples/example_test-pop.ht/_SUCCESS new file mode 100644 index 000000000..e69de29bb diff --git a/tests/data_samples/example_test-pop.ht/globals/metadata.json.gz b/tests/data_samples/example_test-pop.ht/globals/metadata.json.gz new file mode 100644 index 000000000..369b04d91 Binary files /dev/null and b/tests/data_samples/example_test-pop.ht/globals/metadata.json.gz differ diff --git a/tests/data_samples/example_test-pop.ht/globals/parts/part-0 b/tests/data_samples/example_test-pop.ht/globals/parts/part-0 new file mode 100644 index 000000000..89e711531 Binary files /dev/null and b/tests/data_samples/example_test-pop.ht/globals/parts/part-0 differ diff --git a/tests/data_samples/example_test-pop.ht/index/part-0-020df040-1af5-433e-944d-df08b484cf34.idx/index b/tests/data_samples/example_test-pop.ht/index/part-0-020df040-1af5-433e-944d-df08b484cf34.idx/index new file mode 100644 index 000000000..a62f9cf60 Binary files /dev/null and b/tests/data_samples/example_test-pop.ht/index/part-0-020df040-1af5-433e-944d-df08b484cf34.idx/index differ diff --git a/tests/data_samples/example_test-pop.ht/index/part-0-020df040-1af5-433e-944d-df08b484cf34.idx/metadata.json.gz b/tests/data_samples/example_test-pop.ht/index/part-0-020df040-1af5-433e-944d-df08b484cf34.idx/metadata.json.gz new file mode 100644 index 000000000..e7a54cb4f Binary files /dev/null and b/tests/data_samples/example_test-pop.ht/index/part-0-020df040-1af5-433e-944d-df08b484cf34.idx/metadata.json.gz differ diff --git a/tests/data_samples/example_test-pop.ht/metadata.json.gz b/tests/data_samples/example_test-pop.ht/metadata.json.gz new file mode 100644 index 000000000..1bdbc76e4 Binary files /dev/null and b/tests/data_samples/example_test-pop.ht/metadata.json.gz differ diff --git a/tests/data_samples/example_test-pop.ht/rows/metadata.json.gz b/tests/data_samples/example_test-pop.ht/rows/metadata.json.gz new file mode 100644 index 000000000..4ae750c7c Binary files /dev/null and b/tests/data_samples/example_test-pop.ht/rows/metadata.json.gz differ diff --git a/tests/data_samples/example_test-pop.ht/rows/parts/part-0-020df040-1af5-433e-944d-df08b484cf34 b/tests/data_samples/example_test-pop.ht/rows/parts/part-0-020df040-1af5-433e-944d-df08b484cf34 new file mode 100644 index 000000000..618c605e9 Binary files /dev/null and b/tests/data_samples/example_test-pop.ht/rows/parts/part-0-020df040-1af5-433e-944d-df08b484cf34 differ diff --git a/tests/data_samples/gwas_summary_stats_sample.tsv.gz b/tests/data_samples/gwas_summary_stats_sample.tsv.gz deleted file mode 100644 index 9a9c5f735..000000000 Binary files a/tests/data_samples/gwas_summary_stats_sample.tsv.gz and /dev/null differ diff --git a/tests/data_samples/imported/GTEx_V8/ge/Adipose_Subcutaneous.tsv.gz b/tests/data_samples/imported/GTEx_V8/ge/Adipose_Subcutaneous.tsv.gz new file mode 100644 index 000000000..74c0844a4 Binary files /dev/null and b/tests/data_samples/imported/GTEx_V8/ge/Adipose_Subcutaneous.tsv.gz differ diff --git a/tests/data_samples/l2g_gold_standard_curation_sample.json.gz b/tests/data_samples/l2g_gold_standard_curation_sample.json.gz new file mode 100644 index 000000000..3ffb365a4 Binary files /dev/null and b/tests/data_samples/l2g_gold_standard_curation_sample.json.gz differ diff --git a/tests/data_samples/new_format_GCST90293086.h.tsv.gz b/tests/data_samples/new_format_GCST90293086.h.tsv.gz new file mode 100644 index 000000000..a15d475df Binary files /dev/null and b/tests/data_samples/new_format_GCST90293086.h.tsv.gz differ diff --git a/tests/data_samples/old_format_GCST006090.h.tsv.gz b/tests/data_samples/old_format_GCST006090.h.tsv.gz new file mode 100644 index 000000000..76a207ccf Binary files /dev/null and b/tests/data_samples/old_format_GCST006090.h.tsv.gz differ diff --git a/tests/data_samples/otp_interactions_sample.parquet b/tests/data_samples/otp_interactions_sample.parquet new file mode 100644 index 000000000..44c0110be Binary files /dev/null and b/tests/data_samples/otp_interactions_sample.parquet differ diff --git a/tests/data_samples/thurnman_sample.bed8 b/tests/data_samples/thurman_sample.bed8 similarity index 100% rename from tests/data_samples/thurnman_sample.bed8 rename to tests/data_samples/thurman_sample.bed8 diff --git a/tests/dataset/test_dataset.py b/tests/dataset/test_dataset.py new file mode 100644 index 000000000..a491a68d3 --- /dev/null +++ b/tests/dataset/test_dataset.py @@ -0,0 +1,44 @@ +"""Test Dataset class.""" +from __future__ import annotations + +import pytest +from otg.dataset.dataset import Dataset +from pyspark.sql import SparkSession +from pyspark.sql.types import IntegerType, StructField, StructType + + +class MockDataset(Dataset): + """Concrete subclass of Dataset for testing. Necessary because Dataset is abstract.""" + + @classmethod + def get_schema(cls) -> StructType: + """Get schema.""" + return StructType([StructField("value", IntegerType(), False)]) + + +class TestCoalesceAndRepartition: + """Test TestDataset.coalesce and TestDataset.repartition.""" + + def test_repartition(self: TestCoalesceAndRepartition) -> None: + """Test Dataset.repartition.""" + initial_partitions = self.test_dataset._df.rdd.getNumPartitions() + new_partitions = initial_partitions + 1 + self.test_dataset.repartition(new_partitions) + assert self.test_dataset._df.rdd.getNumPartitions() == new_partitions + + def test_coalesce(self: TestCoalesceAndRepartition) -> None: + """Test Dataset.coalesce.""" + initial_partitions = self.test_dataset._df.rdd.getNumPartitions() + new_partitions = initial_partitions - 1 if initial_partitions > 1 else 1 + self.test_dataset.coalesce(new_partitions) + assert self.test_dataset._df.rdd.getNumPartitions() == new_partitions + + @pytest.fixture(autouse=True) + def _setup(self: TestCoalesceAndRepartition, spark: SparkSession) -> None: + """Setup fixture.""" + self.test_dataset = MockDataset( + _df=spark.createDataFrame( + [(1,), (2,), (3,)], schema=MockDataset.get_schema() + ), + _schema=MockDataset.get_schema(), + ) diff --git a/tests/dataset/test_gene_index.py b/tests/dataset/test_gene_index.py index 467e41090..10cd576bc 100644 --- a/tests/dataset/test_gene_index.py +++ b/tests/dataset/test_gene_index.py @@ -1,9 +1,8 @@ """Tests on LD index.""" from __future__ import annotations -from pyspark.sql import DataFrame - from otg.dataset.gene_index import GeneIndex +from pyspark.sql import DataFrame def test_gene_index_creation(mock_gene_index: GeneIndex) -> None: diff --git a/tests/dataset/test_l2g.py b/tests/dataset/test_l2g.py new file mode 100644 index 000000000..c2aa21dcb --- /dev/null +++ b/tests/dataset/test_l2g.py @@ -0,0 +1,175 @@ +"""Tests on L2G datasets.""" +from __future__ import annotations + +from typing import TYPE_CHECKING + +from otg.dataset.l2g_feature_matrix import L2GFeatureMatrix +from otg.dataset.l2g_gold_standard import L2GGoldStandard +from otg.dataset.l2g_prediction import L2GPrediction +from otg.dataset.study_locus_overlap import StudyLocusOverlap + +if TYPE_CHECKING: + from pyspark.sql import DataFrame, SparkSession + + +def test_feature_matrix(mock_l2g_feature_matrix: L2GFeatureMatrix) -> None: + """Test L2G Feature Matrix creation with mock data.""" + assert isinstance(mock_l2g_feature_matrix, L2GFeatureMatrix) + + +def test_gold_standard(mock_l2g_gold_standard: L2GFeatureMatrix) -> None: + """Test L2G gold standard creation with mock data.""" + assert isinstance(mock_l2g_gold_standard, L2GGoldStandard) + + +def test_process_gene_interactions(sample_otp_interactions: DataFrame) -> None: + """Tests processing of gene interactions from OTP.""" + expected_cols = ["geneIdA", "geneIdB", "score"] + observed_df = L2GGoldStandard.process_gene_interactions(sample_otp_interactions) + assert ( + observed_df.columns == expected_cols + ), "Gene interactions has a different schema." + + +def test_predictions(mock_l2g_predictions: L2GFeatureMatrix) -> None: + """Test L2G predictions creation with mock data.""" + assert isinstance(mock_l2g_predictions, L2GPrediction) + + +def test_filter_unique_associations(spark: SparkSession) -> None: + """Test filter_unique_associations.""" + mock_l2g_gs_df = spark.createDataFrame( + [ + (1, "variant1", "study1", "gene1", "positive"), + ( + 2, + "variant2", + "study1", + "gene1", + "negative", + ), # in the same locus as sl1 and pointing to same gene, has to be dropped + ( + 3, + "variant3", + "study1", + "gene1", + "positive", + ), # in diff locus as sl1 and pointing to same gene, has to be kept + ( + 4, + "variant4", + "study1", + "gene2", + "positive", + ), # in same locus as sl1 and pointing to diff gene, has to be kept + ], + "studyLocusId LONG, variantId STRING, studyId STRING, geneId STRING, goldStandardSet STRING", + ) + + mock_sl_overlap_df = spark.createDataFrame( + [(1, 2, "variant2"), (1, 4, "variant4")], + "leftStudyLocusId LONG, rightStudyLocusId LONG, tagVariantId STRING", + ) + + expected_df = spark.createDataFrame( + [ + (1, "variant1", "study1", "gene1", "positive"), + (3, "variant3", "study1", "gene1", "positive"), + (4, "variant4", "study1", "gene2", "positive"), + ], + "studyLocusId LONG, variantId STRING, studyId STRING, geneId STRING, goldStandardSet STRING", + ) + + mock_l2g_gs = L2GGoldStandard( + _df=mock_l2g_gs_df, _schema=L2GGoldStandard.get_schema() + ) + mock_sl_overlap = StudyLocusOverlap( + _df=mock_sl_overlap_df, _schema=StudyLocusOverlap.get_schema() + )._convert_to_square_matrix() + + observed_df = mock_l2g_gs.filter_unique_associations(mock_sl_overlap).df + + assert observed_df.collect() == expected_df.collect() + + +def test_remove_false_negatives(spark: SparkSession) -> None: + """Test `remove_false_negatives`.""" + mock_l2g_gs_df = spark.createDataFrame( + [ + (1, "variant1", "study1", "gene1", "positive"), + ( + 2, + "variant2", + "study1", + "gene2", + "negative", + ), # gene2 is a partner of gene1, has to be dropped + ( + 3, + "variant3", + "study1", + "gene3", + "negative", + ), # gene 3 is not a partner of gene1, has to be kept + ( + 4, + "variant4", + "study1", + "gene4", + "positive", + ), # gene 4 is a partner of gene1, has to be kept because it's positive + ], + "studyLocusId LONG, variantId STRING, studyId STRING, geneId STRING, goldStandardSet STRING", + ) + + mock_interactions_df = spark.createDataFrame( + [ + ("gene1", "gene2", 0.8), + ("gene1", "gene3", 0.5), + ("gene1", "gene4", 0.8), + ], + "geneIdA STRING, geneIdB STRING, score DOUBLE", + ) + + expected_df = spark.createDataFrame( + [ + (1, "variant1", "study1", "gene1", "positive"), + (3, "variant3", "study1", "gene3", "negative"), + (4, "variant4", "study1", "gene4", "positive"), + ], + "studyLocusId LONG, variantId STRING, studyId STRING, geneId STRING, goldStandardSet STRING", + ) + + mock_l2g_gs = L2GGoldStandard( + _df=mock_l2g_gs_df, _schema=L2GGoldStandard.get_schema() + ) + + observed_df = mock_l2g_gs.remove_false_negatives(mock_interactions_df).df.orderBy( + "studyLocusId" + ) + + assert observed_df.collect() == expected_df.collect() + + +def test_calculate_feature_missingness_rate(spark: SparkSession) -> None: + """Test L2GFeatureMatrix.calculate_feature_missingness_rate.""" + fm = L2GFeatureMatrix( + _df=spark.createDataFrame( + [ + (1, "gene1", 100.0, None), + (2, "gene2", 1000.0, 0.0), + ], + "studyLocusId LONG, geneId STRING, distanceTssMean DOUBLE, distanceTssMinimum DOUBLE", + ), + _schema=L2GFeatureMatrix.get_schema(), + ) + + expected_missingness = {"distanceTssMean": 0.0, "distanceTssMinimum": 1.0} + observed_missingness = fm.calculate_feature_missingness_rate() + assert isinstance(observed_missingness, dict) + assert len(observed_missingness) == len( + fm.features_list # type: ignore + ), "Missing features in the missingness rate dictionary." + assert ( + observed_missingness == expected_missingness + ), "Missingness rate is incorrect." diff --git a/tests/dataset/test_study_index.py b/tests/dataset/test_study_index.py index 49ef3c5f9..d1c93603a 100644 --- a/tests/dataset/test_study_index.py +++ b/tests/dataset/test_study_index.py @@ -1,11 +1,10 @@ """Test study index dataset.""" from __future__ import annotations +from otg.dataset.study_index import StudyIndex from pyspark.sql import DataFrame, SparkSession from pyspark.sql import functions as f -from otg.dataset.study_index import StudyIndex - def test_study_index_creation(mock_study_index: StudyIndex) -> None: """Test study index creation with mock data.""" @@ -17,7 +16,7 @@ def test_study_index_type_lut(mock_study_index: StudyIndex) -> None: assert isinstance(mock_study_index.study_type_lut(), DataFrame) -def test_aggregate_and_map_ancestries__correctness(spark: SparkSession): +def test_aggregate_and_map_ancestries__correctness(spark: SparkSession) -> None: """Test if population are mapped and relative sample sizes are calculated.""" data = [ ( @@ -62,12 +61,17 @@ def test_aggregate_and_map_ancestries__correctness(spark: SparkSession): # Asserting that the relative count go to 1.0 assert ( - df.select( - f.aggregate( - "parsedPopulation", f.lit(0.0), lambda y, x: y + x.relativeSampleSize - ).alias("sum") - ).collect()[0]["sum"] - ) == 1.0 + ( + df.select( + f.aggregate( + "parsedPopulation", + f.lit(0.0), + lambda y, x: y + x.relativeSampleSize, + ).alias("sum") + ).collect()[0]["sum"] + ) + == 1.0 + ) def test_aggregate_samples_by_ancestry__correctness(spark: SparkSession) -> None: @@ -122,11 +126,14 @@ def test_aggregate_samples_by_ancestry__correctness(spark: SparkSession) -> None # Asserting the number of aggregated sample size: assert ( - df.filter(f.col("studyId") == "s1") - .select( - f.aggregate("test_output", f.lit(0.0), lambda y, x: x.sampleSize + y).alias( - "totalSamples" + ( + df.filter(f.col("studyId") == "s1") + .select( + f.aggregate( + "test_output", f.lit(0.0), lambda y, x: x.sampleSize + y + ).alias("totalSamples") ) + .collect()[0]["totalSamples"] ) - .collect()[0]["totalSamples"] - ) == 300.0 + == 300.0 + ) diff --git a/tests/dataset/test_study_locus.py b/tests/dataset/test_study_locus.py index 2ca793937..ed680f63b 100644 --- a/tests/dataset/test_study_locus.py +++ b/tests/dataset/test_study_locus.py @@ -1,8 +1,15 @@ """Test study locus dataset.""" from __future__ import annotations +from typing import Any + +import pyspark.sql.functions as f import pytest -from pyspark.sql import Column, DataFrame, SparkSession +from otg.dataset.ld_index import LDIndex +from otg.dataset.study_index import StudyIndex +from otg.dataset.study_locus import CredibleInterval, StudyLocus +from otg.dataset.study_locus_overlap import StudyLocusOverlap +from pyspark.sql import Column, SparkSession from pyspark.sql.types import ( ArrayType, BooleanType, @@ -13,9 +20,6 @@ StructType, ) -from otg.dataset.study_index import StudyIndex -from otg.dataset.study_locus import CredibleInterval, StudyLocus, StudyLocusOverlap - def test_study_locus_creation(mock_study_locus: StudyLocus) -> None: """Test study locus creation with mock data.""" @@ -38,9 +42,91 @@ def test_filter_credible_set(mock_study_locus: StudyLocus) -> None: ) -def test_unique_lead_tag_variants(mock_study_locus: StudyLocus) -> None: - """Test unique lead tag variants.""" - assert isinstance(mock_study_locus.unique_lead_tag_variants(), DataFrame) +def test_assign_study_locus_id__null_variant_id(spark: SparkSession) -> None: + """Test assign study locus id when variant id is null for the same study.""" + df = spark.createDataFrame( + [("GCST000001", None), ("GCST000001", None)], + schema="studyId: string, variantId: string", + ).withColumn( + "studyLocusId", + StudyLocus.assign_study_locus_id(f.col("studyId"), f.col("variantId")), + ) + assert ( + df.select("studyLocusId").distinct().count() == 2 + ), "studyLocusId is not unique when variantId is null" + + +@pytest.mark.parametrize( + ("observed", "expected"), + [ + ( + # Locus is not null, should return union between variants in locus and lead variant + [ + ( + 1, + "traitA", + "22_varA", + [ + {"variantId": "22_varA", "posteriorProbability": 0.44}, + {"variantId": "22_varB", "posteriorProbability": 0.015}, + ], + ), + ], + [ + ( + "22_varA", + "22", + ), + ( + "22_varB", + "22", + ), + ], + ), + ( + # locus is null, should return lead variant + [ + (1, "traitA", "22_varA", None), + ], + [ + ( + "22_varA", + "22", + ), + ], + ), + ], +) +def test_unique_variants_in_locus( + spark: SparkSession, observed: list[Any], expected: list[Any] +) -> None: + """Test unique variants in locus.""" + # assert isinstance(mock_study_locus.test_unique_variants_in_locus(), DataFrame) + schema = StructType( + [ + StructField("studyLocusId", LongType(), True), + StructField("studyId", StringType(), True), + StructField("variantId", StringType(), True), + StructField( + "locus", + ArrayType( + StructType( + [ + StructField("variantId", StringType(), True), + ] + ) + ), + True, + ), + ] + ) + data_sl = StudyLocus( + _df=spark.createDataFrame(observed, schema), _schema=StudyLocus.get_schema() + ) + expected_df = spark.createDataFrame( + expected, schema="variantId: string, chromosome: string" + ) + assert data_sl.unique_variants_in_locus().collect() == expected_df.collect() def test_neglog_pvalue(mock_study_locus: StudyLocus) -> None: @@ -201,7 +287,7 @@ def test_clump(mock_study_locus: StudyLocus) -> None: ], ) def test_annotate_credible_sets( - spark: SparkSession, observed: list, expected: list + spark: SparkSession, observed: list[Any], expected: list[Any] ) -> None: """Test annotate_credible_sets.""" schema = StructType( @@ -234,6 +320,24 @@ def test_annotate_credible_sets( assert data_sl.annotate_credible_sets().df.collect() == expected_sl.df.collect() +def test_annotate_ld( + mock_study_locus: StudyLocus, mock_study_index: StudyIndex, mock_ld_index: LDIndex +) -> None: + """Test annotate_ld.""" + assert isinstance( + mock_study_locus.annotate_ld(mock_study_index, mock_ld_index), StudyLocus + ) + + def test__qc_no_population(mock_study_locus: StudyLocus) -> None: """Test _qc_no_population.""" assert isinstance(mock_study_locus._qc_no_population(), StudyLocus) + + +def test_ldannotate( + mock_study_locus: StudyLocus, mock_study_index: StudyIndex, mock_ld_index: LDIndex +) -> None: + """Test ldannotate.""" + assert isinstance( + mock_study_locus.annotate_ld(mock_study_index, mock_ld_index), StudyLocus + ) diff --git a/tests/dataset/test_study_locus_overlap.py b/tests/dataset/test_study_locus_overlap.py new file mode 100644 index 000000000..f76d4ab4a --- /dev/null +++ b/tests/dataset/test_study_locus_overlap.py @@ -0,0 +1,36 @@ +"""Test study locus overlap dataset.""" +from __future__ import annotations + +from otg.dataset.study_locus_overlap import StudyLocusOverlap +from pyspark.sql import SparkSession + + +def test_study_locus_overlap_creation( + mock_study_locus_overlap: StudyLocusOverlap, +) -> None: + """Test study locus overlap creation with mock data.""" + assert isinstance(mock_study_locus_overlap, StudyLocusOverlap) + + +def test_convert_to_square_matrix(spark: SparkSession) -> None: + """Test _convert_to_square_matrix.""" + mock_sl_overlap = StudyLocusOverlap( + _df=spark.createDataFrame( + [ + (1, 2, "variant2"), + ], + "leftStudyLocusId LONG, rightStudyLocusId LONG, tagVariantId STRING", + ), + _schema=StudyLocusOverlap.get_schema(), + ) + + expected_df = spark.createDataFrame( + [ + (1, 2, "variant2"), + (2, 1, "variant2"), + ], + "leftStudyLocusId LONG, rightStudyLocusId LONG, tagVariantId STRING", + ) + observed_df = mock_sl_overlap._convert_to_square_matrix().df + + assert observed_df.collect() == expected_df.collect() diff --git a/tests/dataset/test_study_locus_overlaps.py b/tests/dataset/test_study_locus_overlaps.py index 6d0f0b434..c417fc6c2 100644 --- a/tests/dataset/test_study_locus_overlaps.py +++ b/tests/dataset/test_study_locus_overlaps.py @@ -1,18 +1,16 @@ """Test colocalisation dataset.""" from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any import pyspark.sql.types as t import pytest - from otg.dataset.study_locus import StudyLocus from otg.dataset.study_locus_overlap import StudyLocusOverlap if TYPE_CHECKING: - from pyspark.sql import SparkSession - from otg.dataset.study_index import StudyIndex + from pyspark.sql import SparkSession def test_study_locus_overlap_creation( @@ -62,7 +60,9 @@ def test_study_locus_overlap_from_associations( ), ], ) -def test_overlapping_peaks(spark: SparkSession, observed: list, expected: list) -> None: +def test_overlapping_peaks( + spark: SparkSession, observed: list[dict[str, Any]], expected: list[dict[str, Any]] +) -> None: """Test overlapping signals between GWAS-GWAS and GWAS-Molecular trait to make sure that mQTLs are always on the right.""" mock_schema = t.StructType( [ @@ -82,6 +82,4 @@ def test_overlapping_peaks(spark: SparkSession, observed: list, expected: list) observed_df = spark.createDataFrame(observed, mock_schema) result_df = StudyLocus._overlapping_peaks(observed_df) expected_df = spark.createDataFrame(expected, expected_schema) - print("RESULT", result_df.show()) - print("EXPECTED", expected_df.show()) assert result_df.collect() == expected_df.collect() diff --git a/tests/dataset/test_summary_statistics.py b/tests/dataset/test_summary_statistics.py index 7225dad1f..99bc9ef00 100644 --- a/tests/dataset/test_summary_statistics.py +++ b/tests/dataset/test_summary_statistics.py @@ -3,10 +3,9 @@ from typing import TYPE_CHECKING -from pyspark.sql import types as t - from otg.dataset.study_locus import StudyLocus from otg.dataset.summary_statistics import SummaryStatistics +from pyspark.sql import types as t if TYPE_CHECKING: from pyspark.sql import SparkSession @@ -81,9 +80,9 @@ def test_summary_statistics__exclude_region__correctness( ] ) # Create dataframe and apply region based filter: - data = spark.createDataFrame(data, schema=schema) + df = spark.createDataFrame(data, schema=schema) filtered_sumstas = SummaryStatistics( - _df=data, _schema=SummaryStatistics.get_schema() + _df=df, _schema=SummaryStatistics.get_schema() ).exclude_region("c1:9-16") # Test for the correct number of rows returned: diff --git a/tests/dataset/test_v2g.py b/tests/dataset/test_v2g.py index 4a6fed10a..e6982fa98 100644 --- a/tests/dataset/test_v2g.py +++ b/tests/dataset/test_v2g.py @@ -1,4 +1,4 @@ -"""Tests on effect harmonisation.""" +"""Tests V2G dataset.""" from __future__ import annotations from typing import TYPE_CHECKING diff --git a/tests/dataset/test_variant_annotation.py b/tests/dataset/test_variant_annotation.py index b79f0d5ed..004485ef0 100644 --- a/tests/dataset/test_variant_annotation.py +++ b/tests/dataset/test_variant_annotation.py @@ -15,20 +15,6 @@ def test_variant_index_creation(mock_variant_annotation: VariantAnnotation) -> N assert isinstance(mock_variant_annotation, VariantAnnotation) -def test_get_polyphen_v2g( - mock_variant_annotation: VariantAnnotation, mock_gene_index: GeneIndex -) -> None: - """Test get_polyphen_v2g with mock variant annotation.""" - assert isinstance(mock_variant_annotation.get_polyphen_v2g(mock_gene_index), V2G) - - -def test_get_sift_v2g( - mock_variant_annotation: VariantAnnotation, mock_gene_index: GeneIndex -) -> None: - """Test get_sift_v2g with mock variant annotation.""" - assert isinstance(mock_variant_annotation.get_sift_v2g(mock_gene_index), V2G) - - def test_get_plof_v2g( mock_variant_annotation: VariantAnnotation, mock_gene_index: GeneIndex ) -> None: diff --git a/tests/dataset/test_variant_index.py b/tests/dataset/test_variant_index.py index a43ab6f3b..3ecc41c02 100644 --- a/tests/dataset/test_variant_index.py +++ b/tests/dataset/test_variant_index.py @@ -1,4 +1,4 @@ -"""Tests on effect harmonisation.""" +"""Tests on variant index generation.""" from __future__ import annotations from typing import TYPE_CHECKING @@ -6,6 +6,7 @@ from otg.dataset.variant_index import VariantIndex if TYPE_CHECKING: + from otg.dataset.study_locus import StudyLocus from otg.dataset.variant_annotation import VariantAnnotation @@ -14,7 +15,11 @@ def test_variant_index_creation(mock_variant_index: VariantIndex) -> None: assert isinstance(mock_variant_index, VariantIndex) -def test_from_variant_annotation(mock_variant_annotation: VariantAnnotation) -> None: +def test_from_variant_annotation( + mock_variant_annotation: VariantAnnotation, mock_study_locus: StudyLocus +) -> None: """Test variant index creation from variant annotation.""" - variant_index = VariantIndex.from_variant_annotation(mock_variant_annotation) + variant_index = VariantIndex.from_variant_annotation( + mock_variant_annotation, mock_study_locus + ) assert isinstance(variant_index, VariantIndex) diff --git a/tests/datasource/eqtl_catalogue/test_eqtl_catalogue_study_index.py b/tests/datasource/eqtl_catalogue/test_eqtl_catalogue_study_index.py new file mode 100644 index 000000000..99ed46f07 --- /dev/null +++ b/tests/datasource/eqtl_catalogue/test_eqtl_catalogue_study_index.py @@ -0,0 +1,19 @@ +"""Tests for study index dataset from eQTL Catalogue.""" + +from __future__ import annotations + +from otg.dataset.study_index import StudyIndex +from otg.datasource.eqtl_catalogue.study_index import EqtlCatalogueStudyIndex +from pyspark.sql import DataFrame + + +def test_eqtl_catalogue_study_index_from_source( + sample_eqtl_catalogue_studies: DataFrame, +) -> None: + """Test study index from source.""" + assert isinstance( + EqtlCatalogueStudyIndex.from_source( + sample_eqtl_catalogue_studies, + ), + StudyIndex, + ) diff --git a/tests/datasource/eqtl_catalogue/test_eqtl_catalogue_summary_stats.py b/tests/datasource/eqtl_catalogue/test_eqtl_catalogue_summary_stats.py new file mode 100644 index 000000000..5f486ca89 --- /dev/null +++ b/tests/datasource/eqtl_catalogue/test_eqtl_catalogue_summary_stats.py @@ -0,0 +1,17 @@ +"""Tests for study index dataset from eQTL Catalogue.""" + +from __future__ import annotations + +from otg.dataset.summary_statistics import SummaryStatistics +from otg.datasource.eqtl_catalogue.summary_stats import EqtlCatalogueSummaryStats +from pyspark.sql import DataFrame + + +def test_eqtl_catalogue_summary_stats_from_source( + sample_eqtl_catalogue_summary_stats: DataFrame, +) -> None: + """Test summary statistics from source.""" + assert isinstance( + EqtlCatalogueSummaryStats.from_source(sample_eqtl_catalogue_summary_stats), + SummaryStatistics, + ) diff --git a/tests/datasource/finngen/test_finngen_study_index.py b/tests/datasource/finngen/test_finngen_study_index.py index 4e936ea55..2f9b7ab13 100644 --- a/tests/datasource/finngen/test_finngen_study_index.py +++ b/tests/datasource/finngen/test_finngen_study_index.py @@ -2,22 +2,11 @@ from __future__ import annotations -from pyspark.sql import DataFrame - from otg.dataset.study_index import StudyIndex from otg.datasource.finngen.study_index import FinnGenStudyIndex +from pyspark.sql import SparkSession -def test_finngen_study_index_from_source( - sample_finngen_studies: DataFrame, -) -> None: +def test_finngen_study_index_from_source(spark: SparkSession) -> None: """Test study index from source.""" - assert isinstance( - FinnGenStudyIndex.from_source( - sample_finngen_studies, - "FINNGEN_R9_", - "https://storage.googleapis.com/finngen-public-data-r9/summary_stats/finngen_R9_", - ".gz", - ), - StudyIndex, - ) + assert isinstance(FinnGenStudyIndex.from_source(spark), StudyIndex) diff --git a/tests/datasource/finngen/test_finngen_summary_stats.py b/tests/datasource/finngen/test_finngen_summary_stats.py index d9cbbccf8..315d8cd64 100644 --- a/tests/datasource/finngen/test_finngen_summary_stats.py +++ b/tests/datasource/finngen/test_finngen_summary_stats.py @@ -2,19 +2,17 @@ from __future__ import annotations -from pyspark.sql import DataFrame - from otg.dataset.summary_statistics import SummaryStatistics from otg.datasource.finngen.summary_stats import FinnGenSummaryStats +from pyspark.sql import SparkSession -def test_finngen_summary_stats_from_source( - sample_finngen_summary_stats: DataFrame, -) -> None: +def test_finngen_summary_stats_from_source(spark: SparkSession) -> None: """Test summary statistics from source.""" assert isinstance( - FinnGenSummaryStats.from_finngen_harmonized_summary_stats( - sample_finngen_summary_stats + FinnGenSummaryStats.from_source( + spark=spark, + raw_file="tests/data_samples/finngen_R9_AB1_ACTINOMYCOSIS.gz", ), SummaryStatistics, ) diff --git a/tests/datasource/gnomad/test_gnomad_ld.py b/tests/datasource/gnomad/test_gnomad_ld.py index d64ca2568..6fbecc51a 100644 --- a/tests/datasource/gnomad/test_gnomad_ld.py +++ b/tests/datasource/gnomad/test_gnomad_ld.py @@ -2,10 +2,14 @@ from __future__ import annotations -import pytest -from pyspark.sql import SparkSession +from math import sqrt +from typing import Any +import hail as hl +import pytest from otg.datasource.gnomad.ld import GnomADLDMatrix +from pyspark.sql import DataFrame, SparkSession +from pyspark.sql import functions as f @pytest.mark.parametrize( @@ -42,7 +46,7 @@ ], ) def test_resolve_variant_indices( - spark: SparkSession, observed: list, expected: list + spark: SparkSession, observed: list[Any], expected: list[Any] ) -> None: """Test _resolve_variant_indices.""" ld_matrix = spark.createDataFrame( @@ -65,3 +69,118 @@ def test_resolve_variant_indices( assert ( observed_df.orderBy(observed_df["r"].desc()).collect() == expected_df.collect() ) + + +class TestGnomADLDMatrixVariants: + """Test the resolved LD variant sets.""" + + def test_get_ld_slice_type(self: TestGnomADLDMatrixVariants) -> None: + """Testing if ld_slice has the right type.""" + assert isinstance(self.ld_slice, DataFrame) + + def test_get_ld_empty_slice_type(self: TestGnomADLDMatrixVariants) -> None: + """Testing if ld_empty_slice is None.""" + assert self.ld_empty_slice is None + + def test_get_ld_variants__square( + self: TestGnomADLDMatrixVariants, + ) -> None: + """Testing if the function returns a square matrix.""" + if self.ld_slice is not None: + assert sqrt(self.ld_slice.count()) == int(sqrt(self.ld_slice.count())) + + @pytest.fixture(autouse=True) + def _setup(self: TestGnomADLDMatrixVariants, spark: SparkSession) -> None: + """Prepares fixtures for the test.""" + hl.init(sc=spark.sparkContext, log="/dev/null", idempotent=True) + + ld_test_population = "test-pop" + + gnomad_ld_matrix = GnomADLDMatrix( + ld_matrix_template="tests/data_samples/example_{POP}.bm", + ld_index_raw_template="tests/data_samples/example_{POP}.ht", + grch37_to_grch38_chain_path="tests/data_samples/grch37_to_grch38.over.chain", + ) + self.ld_slice = gnomad_ld_matrix.get_ld_variants( + gnomad_ancestry=ld_test_population, + chromosome="1", + start=10025, + end=10075, + ) + self.ld_empty_slice = gnomad_ld_matrix.get_ld_variants( + gnomad_ancestry=ld_test_population, + chromosome="1", + start=0, + end=1, + ) + + +class TestGnomADLDMatrixSlice: + """Test GnomAD LD methods.""" + + def test_get_ld_matrix_slice__diagonal(self: TestGnomADLDMatrixSlice) -> None: + """Test LD matrix slice.""" + assert ( + self.matrix_slice.filter(f.col("idx_i") == f.col("idx_j")) + .select("r") + .distinct() + .collect()[0]["r"] + == 1.0 + ), "The matrix does not have ones in the diagonal." + + def test_get_ld_matrix_slice__count(self: TestGnomADLDMatrixSlice) -> None: + """Test LD matrix slice.""" + # As the slicing of the matrix is inclusive, the total number of rows are calculated as follows: + included_indices = self.slice_end_index - self.slice_start_index + 1 + expected_pariwise_count = included_indices**2 + + assert ( + self.matrix_slice.count() == expected_pariwise_count + ), "The matrix is not complete." + + def test_get_ld_matrix_slice__type(self: TestGnomADLDMatrixSlice) -> None: + """Test LD matrix slice.""" + assert isinstance( + self.matrix_slice, DataFrame + ), "The returned data is not a dataframe." + + def test_get_ld_matrix_slice__symmetry( + self: TestGnomADLDMatrixSlice, + ) -> None: + """Test LD matrix slice.""" + # Testing square matrix completeness and symmetry: + compared = self.matrix_slice.join( + ( + self.matrix_slice.select( + f.col("idx_i").alias("idx_j"), + f.col("idx_j").alias("idx_i"), + f.col("r").alias("r_sym"), + ) + ), + on=["idx_i", "idx_j"], + how="inner", + ) + + assert ( + compared.count() == self.matrix_slice.count() + ), "The matrix is not complete." + assert ( + compared.filter(f.col("r") == f.col("r_sym")).count() == compared.count() + ), "The matrix is not symmetric." + + @pytest.fixture(autouse=True) + def _setup(self: TestGnomADLDMatrixSlice, spark: SparkSession) -> None: + """Prepares fixtures for the test.""" + hl.init(sc=spark.sparkContext, log="/dev/null", idempotent=True) + gnomad_ld_matrix = GnomADLDMatrix( + ld_matrix_template="tests/data_samples/example_{POP}.bm" + ) + test_ld_population: str = "test-pop" + self.slice_start_index: int = 1 + self.slice_end_index: int = 2 + + self.matrix_slice = gnomad_ld_matrix.get_ld_matrix_slice( + gnomad_ancestry=test_ld_population, + start_index=self.slice_start_index, + end_index=self.slice_end_index, + ) diff --git a/tests/datasource/gwas_catalog/test_gwas_catalog_associations.py b/tests/datasource/gwas_catalog/test_gwas_catalog_associations.py index ec4575d51..187519ed1 100644 --- a/tests/datasource/gwas_catalog/test_gwas_catalog_associations.py +++ b/tests/datasource/gwas_catalog/test_gwas_catalog_associations.py @@ -2,19 +2,21 @@ from __future__ import annotations +from otg.dataset.variant_annotation import VariantAnnotation +from otg.datasource.gwas_catalog.associations import ( + GWASCatalogCuratedAssociationsParser, + StudyLocusGWASCatalog, +) from pyspark.sql import DataFrame from pyspark.sql import functions as f from pyspark.sql.types import LongType -from otg.dataset.variant_annotation import VariantAnnotation -from otg.datasource.gwas_catalog.associations import GWASCatalogAssociations - def test_study_locus_gwas_catalog_creation( - mock_study_locus_gwas_catalog: GWASCatalogAssociations, + mock_study_locus_gwas_catalog: StudyLocusGWASCatalog, ) -> None: """Test study locus creation with mock data.""" - assert isinstance(mock_study_locus_gwas_catalog, GWASCatalogAssociations) + assert isinstance(mock_study_locus_gwas_catalog, StudyLocusGWASCatalog) def test_qc_all(sample_gwas_catalog_associations: DataFrame) -> None: @@ -23,14 +25,14 @@ def test_qc_all(sample_gwas_catalog_associations: DataFrame) -> None: sample_gwas_catalog_associations.withColumn( # Perform all quality control checks: "qualityControls", - GWASCatalogAssociations._qc_all( + GWASCatalogCuratedAssociationsParser._qc_all( f.array().alias("qualityControls"), f.col("CHR_ID"), f.col("CHR_POS"), f.lit("A").alias("referenceAllele"), f.lit("T").alias("referenceAllele"), f.col("STRONGEST SNP-RISK ALLELE"), - *GWASCatalogAssociations._parse_pvalue(f.col("P-VALUE")), + *GWASCatalogCuratedAssociationsParser._parse_pvalue(f.col("P-VALUE")), 5e-8, ), ), @@ -39,16 +41,16 @@ def test_qc_all(sample_gwas_catalog_associations: DataFrame) -> None: def test_qc_ambiguous_study( - mock_study_locus_gwas_catalog: GWASCatalogAssociations, + mock_study_locus_gwas_catalog: StudyLocusGWASCatalog, ) -> None: """Test qc ambiguous.""" assert isinstance( - mock_study_locus_gwas_catalog._qc_ambiguous_study(), GWASCatalogAssociations + mock_study_locus_gwas_catalog.qc_ambiguous_study(), StudyLocusGWASCatalog ) def test_qc_unresolved_ld( - mock_study_locus_gwas_catalog: GWASCatalogAssociations, + mock_study_locus_gwas_catalog: StudyLocusGWASCatalog, ) -> None: """Test qc unresolved LD by making sure the flag is added when ldSet is null.""" mock_study_locus_gwas_catalog.df = mock_study_locus_gwas_catalog.df.filter( @@ -73,10 +75,10 @@ def test_study_locus_gwas_catalog_from_source( ) -> None: """Test study locus from gwas catalog mock data.""" assert isinstance( - GWASCatalogAssociations.from_source( + GWASCatalogCuratedAssociationsParser.from_source( sample_gwas_catalog_associations, mock_variant_annotation ), - GWASCatalogAssociations, + StudyLocusGWASCatalog, ) @@ -86,7 +88,7 @@ def test__map_to_variant_annotation_variants( ) -> None: """Test mapping to variant annotation variants.""" assert isinstance( - GWASCatalogAssociations._map_to_variant_annotation_variants( + GWASCatalogCuratedAssociationsParser._map_to_variant_annotation_variants( sample_gwas_catalog_associations.withColumn( "studyLocusId", f.monotonically_increasing_id().cast(LongType()) ), diff --git a/tests/datasource/gwas_catalog/test_gwas_catalog_study_index.py b/tests/datasource/gwas_catalog/test_gwas_catalog_study_index.py index 17195b0d7..66c614403 100644 --- a/tests/datasource/gwas_catalog/test_gwas_catalog_study_index.py +++ b/tests/datasource/gwas_catalog/test_gwas_catalog_study_index.py @@ -1,35 +1,37 @@ -"""Test StudyIndexGWASCatalog.""" +"""Test GWASCatalogStudyIndex.""" from __future__ import annotations +from otg.datasource.gwas_catalog.study_index import ( + StudyIndexGWASCatalog, + StudyIndexGWASCatalogParser, +) from pyspark.sql import DataFrame -from otg.datasource.gwas_catalog.study_index import GWASCatalogStudyIndex - def test_annotate_discovery_sample_sizes( - mock_study_index_gwas_catalog: GWASCatalogStudyIndex, + mock_study_index_gwas_catalog: StudyIndexGWASCatalog, ) -> None: """Test annotate discovery sample sizes.""" mock_study_index_gwas_catalog.df = mock_study_index_gwas_catalog.df.drop( "nCases", "nControls", "nSamples" ) assert isinstance( - mock_study_index_gwas_catalog._annotate_discovery_sample_sizes(), - GWASCatalogStudyIndex, + mock_study_index_gwas_catalog.annotate_discovery_sample_sizes(), + StudyIndexGWASCatalog, ) def test_parse_study_table(sample_gwas_catalog_studies: DataFrame) -> None: """Test parse study table.""" assert isinstance( - GWASCatalogStudyIndex._parse_study_table(sample_gwas_catalog_studies), - GWASCatalogStudyIndex, + StudyIndexGWASCatalogParser._parse_study_table(sample_gwas_catalog_studies), + StudyIndexGWASCatalog, ) def test_annotate_sumstats( - mock_study_index_gwas_catalog: GWASCatalogStudyIndex, + mock_study_index_gwas_catalog: StudyIndexGWASCatalog, sample_gwas_catalog_harmonised_sumstats_list: DataFrame, ) -> None: """Test annotate sumstats of GWASCatalogStudyIndex.""" @@ -37,10 +39,10 @@ def test_annotate_sumstats( "summarystatsLocation" ) assert isinstance( - mock_study_index_gwas_catalog._annotate_sumstats_info( + mock_study_index_gwas_catalog.annotate_sumstats_info( sample_gwas_catalog_harmonised_sumstats_list ), - GWASCatalogStudyIndex, + StudyIndexGWASCatalog, ) @@ -51,10 +53,10 @@ def test_study_index_from_source( ) -> None: """Test study index from source.""" assert isinstance( - GWASCatalogStudyIndex.from_source( + StudyIndexGWASCatalogParser.from_source( sample_gwas_catalog_studies, sample_gwas_catalog_ancestries_lut, sample_gwas_catalog_harmonised_sumstats_list, ), - GWASCatalogStudyIndex, + StudyIndexGWASCatalog, ) diff --git a/tests/datasource/gwas_catalog/test_gwas_catalog_study_splitter.py b/tests/datasource/gwas_catalog/test_gwas_catalog_study_splitter.py index a79f9eb4c..eb77c1ab8 100644 --- a/tests/datasource/gwas_catalog/test_gwas_catalog_study_splitter.py +++ b/tests/datasource/gwas_catalog/test_gwas_catalog_study_splitter.py @@ -1,19 +1,88 @@ """Tests GWAS Catalog study splitter.""" from __future__ import annotations -from otg.datasource.gwas_catalog.associations import GWASCatalogAssociations -from otg.datasource.gwas_catalog.study_index import GWASCatalogStudyIndex +from typing import TYPE_CHECKING, Any + +import pyspark.sql.functions as f +import pytest +from otg.datasource.gwas_catalog.associations import StudyLocusGWASCatalog +from otg.datasource.gwas_catalog.study_index import StudyIndexGWASCatalog from otg.datasource.gwas_catalog.study_splitter import GWASCatalogStudySplitter +if TYPE_CHECKING: + from pyspark.sql import SparkSession + def test_gwas_catalog_splitter_split( - mock_study_index_gwas_catalog: GWASCatalogStudyIndex, - mock_study_locus_gwas_catalog: GWASCatalogAssociations, + mock_study_index_gwas_catalog: StudyIndexGWASCatalog, + mock_study_locus_gwas_catalog: StudyLocusGWASCatalog, ) -> None: """Test GWASCatalogStudyIndex, GWASCatalogAssociations creation with mock data.""" d1, d2 = GWASCatalogStudySplitter.split( mock_study_index_gwas_catalog, mock_study_locus_gwas_catalog ) - assert isinstance(d1, GWASCatalogStudyIndex) - assert isinstance(d2, GWASCatalogAssociations) + assert isinstance(d1, StudyIndexGWASCatalog) + assert isinstance(d2, StudyLocusGWASCatalog) + + +@pytest.mark.parametrize( + "observed, expected", + [ + # Test 1 - it shouldn't split + ( + # observed - 2 associations with the same subStudy annotation + [ + ( + "varA", + "GCST003436", + "Endometrial cancer|no_pvalue_text|EFO_1001512", + ), + ( + "varB", + "GCST003436", + "Endometrial cancer|no_pvalue_text|EFO_1001512", + ), + ], + # expected - 2 associations with the same unsplit updatedStudyId + [ + ("GCST003436",), + ("GCST003436",), + ], + ), + # Test 2 - it should split + ( + # observed - 2 associations with the different subStudy annotation + [ + ( + "varA", + "GCST003436", + "Endometrial cancer|no_pvalue_text|EFO_1001512", + ), + ( + "varB", + "GCST003436", + "Uterine carcinoma|no_pvalue_text|EFO_0002919", + ), + ], + # expected - 2 associations with the same unsplit updatedStudyId + [ + ("GCST003436",), + ("GCST003436_2",), + ], + ), + ], +) +def test__resolve_study_id( + spark: SparkSession, observed: list[Any], expected: list[Any] +) -> None: + """Test _resolve_study_id.""" + observed_df = spark.createDataFrame( + observed, schema=["variantId", "studyId", "subStudyDescription"] + ).select( + GWASCatalogStudySplitter._resolve_study_id( + f.col("studyId"), f.col("subStudyDescription").alias("updatedStudyId") + ) + ) + expected_df = spark.createDataFrame(expected, schema=["updatedStudyId"]) + assert observed_df.collect() == expected_df.collect() diff --git a/tests/datasource/gwas_catalog/test_gwas_catalog_summary_statistics.py b/tests/datasource/gwas_catalog/test_gwas_catalog_summary_statistics.py index 0fc3ad5bf..6cace5b70 100644 --- a/tests/datasource/gwas_catalog/test_gwas_catalog_summary_statistics.py +++ b/tests/datasource/gwas_catalog/test_gwas_catalog_summary_statistics.py @@ -2,16 +2,110 @@ from __future__ import annotations +from typing import TYPE_CHECKING + +import pyspark.sql.functions as f +import pytest +from otg.dataset.summary_statistics import SummaryStatistics from otg.datasource.gwas_catalog.summary_statistics import GWASCatalogSummaryStatistics +if TYPE_CHECKING: + from pyspark.sql import SparkSession + from pytest import FixtureRequest + + +class TestGWASCatalogSummaryStatistics: + """Test suite for GWAS Catalog summary stats ingestion.""" + + @pytest.fixture(scope="class") + def gwas_catalog_summary_statistics__new_format( + self: TestGWASCatalogSummaryStatistics, + spark: SparkSession, + ) -> GWASCatalogSummaryStatistics: + """Test GWASCatalogSummaryStatistics creation with mock data.""" + return GWASCatalogSummaryStatistics.from_gwas_harmonized_summary_stats( + spark, "tests/data_samples/new_format_GCST90293086.h.tsv.gz" + ) + + @pytest.fixture(scope="class") + def gwas_catalog_summary_statistics__old_format( + self: TestGWASCatalogSummaryStatistics, + spark: SparkSession, + ) -> GWASCatalogSummaryStatistics: + """Test GWASCatalogSummaryStatistics creation with mock data.""" + return GWASCatalogSummaryStatistics.from_gwas_harmonized_summary_stats( + spark, "tests/data_samples/old_format_GCST006090.h.tsv.gz" + ) + + @pytest.fixture(scope="class") + def test_dataset_instance( + self: TestGWASCatalogSummaryStatistics, request: FixtureRequest + ) -> GWASCatalogSummaryStatistics: + """Meta fixture to return the value of any requested fixture.""" + return request.getfixturevalue(request.param) + + @pytest.mark.parametrize( + "test_dataset_instance", + [ + "gwas_catalog_summary_statistics__old_format", + "gwas_catalog_summary_statistics__new_format", + ], + indirect=True, + ) + def test_return_type( + self: TestGWASCatalogSummaryStatistics, + test_dataset_instance: SummaryStatistics, + ) -> None: + """Testing return type.""" + assert isinstance(test_dataset_instance, SummaryStatistics) + + @pytest.mark.parametrize( + "test_dataset_instance", + [ + "gwas_catalog_summary_statistics__old_format", + "gwas_catalog_summary_statistics__new_format", + ], + indirect=True, + ) + def test_p_value_parsed_correctly( + self: TestGWASCatalogSummaryStatistics, + test_dataset_instance: SummaryStatistics, + ) -> None: + """Testing parsed p-value.""" + assert ( + test_dataset_instance.df.filter(f.col("pValueMantissa").isNotNull()).count() + > 1 + ) + + @pytest.mark.parametrize( + "test_dataset_instance", + [ + "gwas_catalog_summary_statistics__old_format", + "gwas_catalog_summary_statistics__new_format", + ], + indirect=True, + ) + def test_effect_parsed_correctly( + self: TestGWASCatalogSummaryStatistics, + test_dataset_instance: SummaryStatistics, + ) -> None: + """Testing properly parsed effect.""" + assert test_dataset_instance.df.filter(f.col("beta").isNotNull()).count() > 1 -def test_gwas_catalog_summary_statistics_from_gwas_harmonized_summary_stats( - sample_gwas_catalog_harmonised_sumstats: GWASCatalogSummaryStatistics, -) -> None: - """Test GWASCatalogSummaryStatistics creation with mock data.""" - assert isinstance( - GWASCatalogSummaryStatistics.from_gwas_harmonized_summary_stats( - sample_gwas_catalog_harmonised_sumstats, "GCST000000" - ), - GWASCatalogSummaryStatistics, + @pytest.mark.parametrize( + "test_dataset_instance", + [ + "gwas_catalog_summary_statistics__old_format", + "gwas_catalog_summary_statistics__new_format", + ], + indirect=True, ) + def test_study_id( + self: TestGWASCatalogSummaryStatistics, + test_dataset_instance: SummaryStatistics, + ) -> None: + """Testing properly parsed effect.""" + assert ( + test_dataset_instance.df.filter(f.col("studyId").startswith("GCST")).count() + == test_dataset_instance.df.count() + ) diff --git a/tests/datasource/intervals/test_andersson.py b/tests/datasource/intervals/test_andersson.py index e269d74e4..cbb0265c9 100644 --- a/tests/datasource/intervals/test_andersson.py +++ b/tests/datasource/intervals/test_andersson.py @@ -2,23 +2,21 @@ from __future__ import annotations import pytest -from pyspark.sql import DataFrame, SparkSession - from otg.common.Liftover import LiftOverSpark from otg.dataset.gene_index import GeneIndex +from otg.dataset.intervals import Intervals from otg.datasource.intervals.andersson import IntervalsAndersson +from pyspark.sql import DataFrame, SparkSession @pytest.fixture(scope="module") def sample_intervals_andersson(spark: SparkSession) -> DataFrame: """Sample Andersson intervals.""" - return IntervalsAndersson.read_andersson( - spark, "tests/data_samples/andersson_sample.bed" - ) + return IntervalsAndersson.read(spark, "tests/data_samples/andersson_sample.bed") def test_read_andersson(sample_intervals_andersson: DataFrame) -> None: - """Test read_andersson.""" + """Test read Andersson data.""" assert isinstance(sample_intervals_andersson, DataFrame) @@ -27,10 +25,10 @@ def test_andersson_intervals_from_source( mock_gene_index: GeneIndex, liftover_chain_37_to_38: LiftOverSpark, ) -> None: - """Test JavierreIntervals creation with mock data.""" + """Test AnderssonIntervals creation with mock data.""" assert isinstance( IntervalsAndersson.parse( sample_intervals_andersson, mock_gene_index, liftover_chain_37_to_38 ), - IntervalsAndersson, + Intervals, ) diff --git a/tests/datasource/intervals/test_javierre.py b/tests/datasource/intervals/test_javierre.py index f2be1e5bb..90dd34a69 100644 --- a/tests/datasource/intervals/test_javierre.py +++ b/tests/datasource/intervals/test_javierre.py @@ -2,23 +2,21 @@ from __future__ import annotations import pytest -from pyspark.sql import DataFrame, SparkSession - from otg.common.Liftover import LiftOverSpark from otg.dataset.gene_index import GeneIndex +from otg.dataset.intervals import Intervals from otg.datasource.intervals.javierre import IntervalsJavierre +from pyspark.sql import DataFrame, SparkSession @pytest.fixture(scope="module") def sample_intervals_javierre(spark: SparkSession) -> DataFrame: """Sample Javierre intervals.""" - return IntervalsJavierre.read_javierre( - spark, "tests/data_samples/javierre_sample.parquet" - ) + return IntervalsJavierre.read(spark, "tests/data_samples/javierre_sample.parquet") def test_read_javierre(sample_intervals_javierre: DataFrame) -> None: - """Test read_jung.""" + """Test read javierre data.""" assert isinstance(sample_intervals_javierre, DataFrame) @@ -32,5 +30,5 @@ def test_javierre_intervals_from_source( IntervalsJavierre.parse( sample_intervals_javierre, mock_gene_index, liftover_chain_37_to_38 ), - IntervalsJavierre, + Intervals, ) diff --git a/tests/datasource/intervals/test_jung.py b/tests/datasource/intervals/test_jung.py index 3fe50a7f8..5dd6ef2f0 100644 --- a/tests/datasource/intervals/test_jung.py +++ b/tests/datasource/intervals/test_jung.py @@ -2,21 +2,21 @@ from __future__ import annotations import pytest -from pyspark.sql import DataFrame, SparkSession - from otg.common.Liftover import LiftOverSpark from otg.dataset.gene_index import GeneIndex +from otg.dataset.intervals import Intervals from otg.datasource.intervals.jung import IntervalsJung +from pyspark.sql import DataFrame, SparkSession @pytest.fixture(scope="module") def sample_intervals_jung(spark: SparkSession) -> DataFrame: - """Sample Andersson intervals.""" - return IntervalsJung.read_jung(spark, "tests/data_samples/jung_sample.bed") + """Sample Jung intervals.""" + return IntervalsJung.read(spark, "tests/data_samples/jung_sample.bed") def test_read_jung(sample_intervals_jung: DataFrame) -> None: - """Test read_jung.""" + """Test read Jung data.""" assert isinstance(sample_intervals_jung, DataFrame) @@ -30,5 +30,5 @@ def test_jung_intervals_from_source( IntervalsJung.parse( sample_intervals_jung, mock_gene_index, liftover_chain_37_to_38 ), - IntervalsJung, + Intervals, ) diff --git a/tests/datasource/intervals/test_thurman.py b/tests/datasource/intervals/test_thurman.py new file mode 100644 index 000000000..245516e47 --- /dev/null +++ b/tests/datasource/intervals/test_thurman.py @@ -0,0 +1,34 @@ +"""Test Thurman.""" +from __future__ import annotations + +import pytest +from otg.common.Liftover import LiftOverSpark +from otg.dataset.gene_index import GeneIndex +from otg.dataset.intervals import Intervals +from otg.datasource.intervals.thurman import IntervalsThurman +from pyspark.sql import DataFrame, SparkSession + + +@pytest.fixture(scope="module") +def sample_intervals_thurman(spark: SparkSession) -> DataFrame: + """Sample Thurman intervals.""" + return IntervalsThurman.read(spark, "tests/data_samples/thurman_sample.bed8") + + +def test_read_thurman(sample_intervals_thurman: DataFrame) -> None: + """Test read Thurman data.""" + assert isinstance(sample_intervals_thurman, DataFrame) + + +def test_thurman_intervals_from_source( + sample_intervals_thurman: DataFrame, + mock_gene_index: GeneIndex, + liftover_chain_37_to_38: LiftOverSpark, +) -> None: + """Test IntervalsThurman creation with mock data.""" + assert isinstance( + IntervalsThurman.parse( + sample_intervals_thurman, mock_gene_index, liftover_chain_37_to_38 + ), + Intervals, + ) diff --git a/tests/datasource/intervals/test_thurnman.py b/tests/datasource/intervals/test_thurnman.py deleted file mode 100644 index 7b4f03995..000000000 --- a/tests/datasource/intervals/test_thurnman.py +++ /dev/null @@ -1,36 +0,0 @@ -"""Test Thurman.""" -from __future__ import annotations - -import pytest -from pyspark.sql import DataFrame, SparkSession - -from otg.common.Liftover import LiftOverSpark -from otg.dataset.gene_index import GeneIndex -from otg.datasource.intervals.thurnman import IntervalsThurnman - - -@pytest.fixture(scope="module") -def sample_intervals_thurnman(spark: SparkSession) -> DataFrame: - """Sample Andersson intervals.""" - return IntervalsThurnman.read_thurnman( - spark, "tests/data_samples/thurnman_sample.bed8" - ) - - -def test_read_thurnman(sample_intervals_thurnman: DataFrame) -> None: - """Test read_jung.""" - assert isinstance(sample_intervals_thurnman, DataFrame) - - -def test_thurnman_intervals_from_source( - sample_intervals_thurnman: DataFrame, - mock_gene_index: GeneIndex, - liftover_chain_37_to_38: LiftOverSpark, -) -> None: - """Test IntervalsThurnman creation with mock data.""" - assert isinstance( - IntervalsThurnman.parse( - sample_intervals_thurnman, mock_gene_index, liftover_chain_37_to_38 - ), - IntervalsThurnman, - ) diff --git a/tests/datasource/open_targets/test_l2g_gold_standard.py b/tests/datasource/open_targets/test_l2g_gold_standard.py new file mode 100644 index 000000000..8b89fc21a --- /dev/null +++ b/tests/datasource/open_targets/test_l2g_gold_standard.py @@ -0,0 +1,102 @@ +"""Test Open Targets L2G gold standards data source.""" +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pytest +from otg.dataset.l2g_gold_standard import L2GGoldStandard +from otg.dataset.v2g import V2G +from otg.datasource.open_targets.l2g_gold_standard import OpenTargetsL2GGoldStandard +from pyspark.sql import DataFrame + +if TYPE_CHECKING: + from pyspark.sql.session import SparkSession + + +def test_open_targets_as_l2g_gold_standard( + sample_l2g_gold_standard: DataFrame, + mock_v2g: V2G, +) -> None: + """Test L2G gold standard from OTG curation.""" + assert isinstance( + OpenTargetsL2GGoldStandard.as_l2g_gold_standard( + sample_l2g_gold_standard, + mock_v2g, + ), + L2GGoldStandard, + ) + + +def test_parse_positive_curation( + sample_l2g_gold_standard: DataFrame, +) -> None: + """Test parsing curation as the positive set.""" + expected_cols = ["studyLocusId", "studyId", "variantId", "geneId", "sources"] + df = OpenTargetsL2GGoldStandard.parse_positive_curation(sample_l2g_gold_standard) + assert df.columns == expected_cols, "GS parsing has a different schema." + + +class TestExpandGoldStandardWithNegatives: + """Test expanding positive set with negative set.""" + + observed_df: DataFrame + expected_expanded_gs: DataFrame + sample_positive_set: DataFrame + + def test_expand_gold_standard_with_negatives_logic( + self: TestExpandGoldStandardWithNegatives, spark: SparkSession + ) -> None: + """Test expanding positive set with negative set coincides with expected results.""" + assert ( + self.observed_df.collect() == self.expected_expanded_gs.collect() + ), "GS expansion is not as expected." + + def test_expand_gold_standard_with_negatives_same_positives( + self: TestExpandGoldStandardWithNegatives, spark: SparkSession + ) -> None: + """Test expanding positive set with negative set doesn't remove any positives.""" + assert ( + self.observed_df.filter("goldStandardSet == 'positive'").count() + == self.sample_positive_set.count() + ), "GS expansion has removed positives." + + @pytest.fixture(autouse=True) + def _setup(self: TestExpandGoldStandardWithNegatives, spark: SparkSession) -> None: + """Prepare fixtures for TestExpandGoldStandardWithNegatives.""" + self.sample_positive_set = spark.createDataFrame( + [ + ("variant1", "gene1", "study1"), + ("variant2", "gene2", "study1"), + ], + ["variantId", "geneId", "studyId"], + ) + + sample_v2g_df = spark.createDataFrame( + [ + ("variant1", "gene1", 5, "X", "X", "X"), + ("variant1", "gene3", 10, "X", "X", "X"), + ], + [ + "variantId", + "geneId", + "distance", + "chromosome", + "datatypeId", + "datasourceId", + ], + ) + + self.expected_expanded_gs = spark.createDataFrame( + [ + ("variant1", "study1", "negative", "gene3"), + ("variant1", "study1", "positive", "gene1"), + ("variant2", "study1", "positive", "gene2"), + ], + ["variantId", "geneId", "goldStandardSet", "studyId"], + ) + self.observed_df = ( + OpenTargetsL2GGoldStandard.expand_gold_standard_with_negatives( + self.sample_positive_set, + V2G(_df=sample_v2g_df, _schema=V2G.get_schema()), + ) + ) diff --git a/tests/datasource/open_targets/test_target.py b/tests/datasource/open_targets/test_target.py index a7035e26a..7029973bc 100644 --- a/tests/datasource/open_targets/test_target.py +++ b/tests/datasource/open_targets/test_target.py @@ -1,10 +1,9 @@ """Test Open Targets target data source.""" from __future__ import annotations -from pyspark.sql import DataFrame - from otg.dataset.gene_index import GeneIndex from otg.datasource.open_targets.target import OpenTargetsTarget +from pyspark.sql import DataFrame def test_open_targets_as_gene_index(sample_target_index: DataFrame) -> None: diff --git a/tests/datasource/ukbiobank/test_ukbiobank_study_index.py b/tests/datasource/ukbiobank/test_ukbiobank_study_index.py index 2637563fa..a3c7d08b1 100644 --- a/tests/datasource/ukbiobank/test_ukbiobank_study_index.py +++ b/tests/datasource/ukbiobank/test_ukbiobank_study_index.py @@ -2,10 +2,9 @@ from __future__ import annotations -from pyspark.sql import DataFrame - from otg.dataset.study_index import StudyIndex from otg.datasource.ukbiobank.study_index import UKBiobankStudyIndex +from pyspark.sql import DataFrame def test_ukbiobank_study_index_from_source( diff --git a/tests/method/test_clump.py b/tests/method/test_clump.py index ef9e560a8..3e4556a54 100644 --- a/tests/method/test_clump.py +++ b/tests/method/test_clump.py @@ -2,12 +2,11 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any import pyspark.sql.functions as f import pyspark.sql.types as t import pytest - from otg.dataset.study_locus import StudyLocus from otg.method.clump import LDclumping @@ -148,7 +147,7 @@ def test_clump(mock_study_locus: StudyLocus) -> None: ], ) def test_is_lead_linked( - spark: SparkSession, observed_data: list, expected_data: list + spark: SparkSession, observed_data: list[Any], expected_data: list[Any] ) -> None: """Test function that annotates whether a studyLocusId is linked to a more statistically significant studyLocusId.""" schema = t.StructType( diff --git a/tests/method/test_ld.py b/tests/method/test_ld.py index 7dc18f863..5886faac9 100644 --- a/tests/method/test_ld.py +++ b/tests/method/test_ld.py @@ -7,16 +7,14 @@ import pyspark.sql.functions as f import pyspark.sql.types as t import pytest -from pyspark.sql import Row - from otg.dataset.study_locus import StudyLocus from otg.method.ld import LDAnnotator +from pyspark.sql import Row if TYPE_CHECKING: - from pyspark.sql import SparkSession - from otg.dataset.ld_index import LDIndex from otg.dataset.study_index import StudyIndex + from pyspark.sql import SparkSession class TestLDAnnotator: diff --git a/tests/method/test_locus_to_gene.py b/tests/method/test_locus_to_gene.py new file mode 100644 index 000000000..ff7a7b8a7 --- /dev/null +++ b/tests/method/test_locus_to_gene.py @@ -0,0 +1,144 @@ +"""Test locus-to-gene model training.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pytest +from otg.dataset.l2g_feature import L2GFeature +from otg.dataset.l2g_feature_matrix import L2GFeatureMatrix +from otg.method.l2g.feature_factory import ColocalisationFactory, StudyLocusFactory +from otg.method.l2g.model import LocusToGeneModel +from otg.method.l2g.trainer import LocusToGeneTrainer +from pyspark.ml import PipelineModel +from pyspark.ml.tuning import ParamGridBuilder +from xgboost.spark import SparkXGBClassifier + +if TYPE_CHECKING: + from otg.dataset.colocalisation import Colocalisation + from otg.dataset.study_index import StudyIndex + from otg.dataset.study_locus import StudyLocus + from otg.dataset.v2g import V2G + + +@pytest.fixture(scope="module") +def model() -> LocusToGeneModel: + """Creates an instance of the LocusToGene class.""" + estimator = SparkXGBClassifier( + eval_metric="logloss", + features_col="features", + label_col="label", + max_depth=5, + ) + return LocusToGeneModel(estimator=estimator, features_list=["distanceTssMean"]) + + +class TestLocusToGeneTrainer: + """Test the L2GTrainer methods using a logistic regression model as estimation algorithm.""" + + def test_cross_validate( + self: TestLocusToGeneTrainer, + mock_l2g_feature_matrix: L2GFeatureMatrix, + model: LocusToGeneModel, + ) -> None: + """Test the k-fold cross-validation function.""" + param_grid = ( + ParamGridBuilder() + .addGrid(model.estimator.learning_rate, [0.1, 0.01]) + .build() + ) + best_model = LocusToGeneTrainer.cross_validate( + model, mock_l2g_feature_matrix.fill_na(), num_folds=2, param_grid=param_grid + ) + assert isinstance( + best_model, LocusToGeneModel + ), "Unexpected model type returned from cross_validate" + # Check that the best model's hyperparameters are among those in the param_grid + assert best_model.model.getOrDefault("learning_rate") in [ # type: ignore + 0.1, + 0.01, + ], "Unexpected learning rate in the best model" + + def test_train( + self: TestLocusToGeneTrainer, + mock_l2g_feature_matrix: L2GFeatureMatrix, + model: LocusToGeneModel, + ) -> None: + """Test the training function.""" + trained_model = LocusToGeneTrainer.train( + mock_l2g_feature_matrix.fill_na(), + model, + features_list=["distanceTssMean"], + evaluate=False, + ) + # Check that `model` is a PipelineModel object and not None + assert isinstance( + trained_model.model, PipelineModel + ), "Model is not a PipelineModel object." + + +class TestColocalisationFactory: + """Test the ColocalisationFactory methods.""" + + @pytest.mark.parametrize( + "colocalisation_method", + [ + "COLOC", + "eCAVIAR", + ], + ) + def test_get_max_coloc_per_study_locus( + self: TestColocalisationFactory, + mock_study_locus: StudyLocus, + mock_study_index: StudyIndex, + mock_colocalisation: Colocalisation, + colocalisation_method: str, + ) -> None: + """Test the function that extracts the maximum log likelihood ratio for each pair of overlapping study-locus.""" + coloc_llr = ColocalisationFactory._get_max_coloc_per_study_locus( + mock_study_locus, + mock_study_index, + mock_colocalisation, + colocalisation_method, + ) + assert isinstance( + coloc_llr, L2GFeature + ), "Unexpected model type returned from _get_max_coloc_per_study_locus" + + def test_get_coloc_features( + self: TestColocalisationFactory, + mock_study_locus: StudyLocus, + mock_study_index: StudyIndex, + mock_colocalisation: Colocalisation, + ) -> None: + """Test the function that calls all the methods to produce colocalisation features.""" + coloc_features = ColocalisationFactory._get_coloc_features( + mock_study_locus, mock_study_index, mock_colocalisation + ) + assert isinstance( + coloc_features, L2GFeature + ), "Unexpected model type returned from _get_coloc_features" + + +class TestStudyLocusFactory: + """Test the StudyLocusFactory methods.""" + + def test_get_tss_distance_features( + self: TestStudyLocusFactory, mock_study_locus: StudyLocus, mock_v2g: V2G + ) -> None: + """Test the function that extracts the distance to the TSS.""" + tss_distance = StudyLocusFactory._get_tss_distance_features( + mock_study_locus, mock_v2g + ) + assert isinstance( + tss_distance, L2GFeature + ), "Unexpected model type returned from _get_tss_distance_features" + + def test_get_vep_features( + self: TestStudyLocusFactory, mock_study_locus: StudyLocus, mock_v2g: V2G + ) -> None: + """Test the function that extracts the VEP features.""" + vep_features = StudyLocusFactory._get_vep_features(mock_study_locus, mock_v2g) + assert isinstance( + vep_features, L2GFeature + ), "Unexpected model type returned from _get_vep_features" diff --git a/tests/method/test_pics.py b/tests/method/test_pics.py index 1bef39750..41c9c5c20 100644 --- a/tests/method/test_pics.py +++ b/tests/method/test_pics.py @@ -3,10 +3,9 @@ from __future__ import annotations import pyspark.sql.functions as f -from pyspark.sql import Row - from otg.dataset.study_locus import StudyLocus from otg.method.pics import PICS +from pyspark.sql import Row class TestFinemap: @@ -26,18 +25,31 @@ def test_finemap_empty_array( f.when(f.col("ldSet").isNull(), f.array()).otherwise(f.col("ldSet")), ).filter(f.size("ldSet") == 0) observed_df = PICS.finemap(mock_study_locus).df.limit(1) - print("TEST_FINEMAP_EMPTY_ARRAY", observed_df.show(truncate=False)) assert observed_df.collect()[0]["locus"] == [] def test_finemap_null_ld_set( self: TestFinemap, mock_study_locus: StudyLocus ) -> None: - """Test how we apply `finemap` when `locus` is null by returning a null field.""" + """Test how we apply `finemap` when `ldSet` is null by returning a null field.""" mock_study_locus.df = mock_study_locus.df.filter(f.col("ldSet").isNull()) observed_df = PICS.finemap(mock_study_locus).df.limit(1) - print("TEST_FINEMAP_NULL", observed_df.show(truncate=False)) assert observed_df.collect()[0]["locus"] is None + def test_finemap_quality_control( + self: TestFinemap, mock_study_locus: StudyLocus + ) -> None: + """Test that we add a `empty locus` flag when any variant in the locus meets PICS criteria.""" + mock_study_locus.df = mock_study_locus.df.withColumn( + # Association with an empty ldSet + "ldSet", + f.when(f.col("ldSet").isNull(), f.array()).otherwise(f.col("ldSet")), + ).filter(f.size("ldSet") == 0) + observed_df = PICS.finemap(mock_study_locus).df.limit(1) + qc_flag = "LD block does not contain variants at the required R^2 threshold" + assert ( + qc_flag in observed_df.collect()[0]["qualityControls"] + ), "Empty locus QC flag is missing." + def test__finemap_udf() -> None: """Test the _finemap UDF with a simple case.""" diff --git a/tests/method/test_window_based_clumping.py b/tests/method/test_window_based_clumping.py index 0a5ad5208..cd31fc65b 100644 --- a/tests/method/test_window_based_clumping.py +++ b/tests/method/test_window_based_clumping.py @@ -3,18 +3,16 @@ from typing import TYPE_CHECKING +from otg.dataset.study_locus import StudyLocus +from otg.method.window_based_clumping import WindowBasedClumping from pyspark.ml import functions as fml from pyspark.ml.linalg import VectorUDT from pyspark.sql import functions as f from pyspark.sql.window import Window -from otg.dataset.study_locus import StudyLocus -from otg.method.window_based_clumping import WindowBasedClumping - if TYPE_CHECKING: - from pyspark.sql import SparkSession - from otg.dataset.summary_statistics import SummaryStatistics + from pyspark.sql import SparkSession def test_window_based_clump__return_type( @@ -44,7 +42,9 @@ def test_window_based_clump_with_locus__correctness( sample_summary_satistics: SummaryStatistics, ) -> None: """Test window-based clumping.""" - clumped = sample_summary_satistics.window_based_clumping(250_000, with_locus=True) + clumped = sample_summary_satistics.window_based_clumping( + distance=250_000, locus_collect_distance=250_000 + ) # Asserting the presence of locus key: assert "locus" in clumped.df.columns @@ -59,8 +59,12 @@ def test_window_based_clump_with_locus__correctness( assert (clumped.df.select(f.explode_outer("locus").alias("loci")).count()) == 132 -def test_prune_peak(spark: SparkSession): - """Test the pruning of peaks.""" +def test_prune_peak(spark: SparkSession) -> None: + """Test the pruning of peaks. + + Args: + spark (SparkSession): Spark session + """ data = [ ("c", 3, 4.0), ("c", 4, 2.0), diff --git a/tests/step/test_clump_step.py b/tests/step/test_clump_step.py new file mode 100644 index 000000000..d5f706f9c --- /dev/null +++ b/tests/step/test_clump_step.py @@ -0,0 +1,26 @@ +"""Test clump step.""" +from __future__ import annotations + +import tempfile +from pathlib import Path +from typing import TYPE_CHECKING + +from otg.clump import ClumpStep + +if TYPE_CHECKING: + from otg.common.session import Session + + +class TestClumpStep: + """Test clump step.""" + + def test_clumpstep_summary_stats(self, session: Session) -> None: + """Test clump step on summary statistics writes results to a temporary directory.""" + with tempfile.TemporaryDirectory() as temp_dir: + clumped_study_locus_path = Path(temp_dir, "GCST005523_chr18_clumped") + ClumpStep( + session=session, + input_path="tests/data_samples/GCST005523_chr18.parquet", + clumped_study_locus_path=str(clumped_study_locus_path), + ) + assert Path(clumped_study_locus_path).exists(), "Output directory exists." diff --git a/tests/test_docs.py b/tests/test_docs.py index fd0d0b5d0..ec9c4fb36 100644 --- a/tests/test_docs.py +++ b/tests/test_docs.py @@ -10,7 +10,7 @@ # Pytest fixture to build the MkDocs documentation before running tests. @pytest.fixture(scope="module") -def mkdocs_build(): +def mkdocs_build() -> None: """Fixture to build documentation.""" try: cfg = load_config("mkdocs.yml", strict=False) @@ -22,13 +22,12 @@ def mkdocs_build(): raise AssertionError(f"MkDocs build failed: {e}") from e -# Test -def test_mkdocs_build(mkdocs_build): +def test_mkdocs_build() -> None: """Function to check if MkDocs build succeeded.""" pass -def test_check_missing_files(mkdocs_build): +def test_check_missing_files(mkdocs_build: None) -> None: """Test function to check for missing files in the documentation build.""" import os diff --git a/tests/test_schemas.py b/tests/test_schemas.py index 19d85cf1b..8cc4b4334 100644 --- a/tests/test_schemas.py +++ b/tests/test_schemas.py @@ -1,5 +1,4 @@ """Tests on spark schemas.""" -# type: ignore from __future__ import annotations import json @@ -14,7 +13,6 @@ if TYPE_CHECKING: from _pytest.fixtures import FixtureRequest - from otg.dataset.gene_index import GeneIndex from otg.dataset.v2g import V2G @@ -27,7 +25,7 @@ def pytest_generate_tests(metafunc: pytest.Metafunc) -> None: Pytest hook to parametrise testing Args: - metafunc (Metafunc): _description_ + metafunc (pytest.Metafunc): pytest metafunc """ if "schema_json" in metafunc.fixturenames: schemas = [f for f in os.listdir(SCHEMA_DIR) if f.endswith(".json")] diff --git a/tests/test_spark_helpers.py b/tests/test_spark_helpers.py index a38e8d5bf..22c39e49f 100644 --- a/tests/test_spark_helpers.py +++ b/tests/test_spark_helpers.py @@ -1,17 +1,16 @@ """Tests on helper spark functions.""" from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any import pyspark.sql.functions as f import pytest -from pyspark.sql.types import ArrayType, DoubleType, StructField, StructType - from otg.common.spark_helpers import ( get_record_with_maximum_value, get_record_with_minimum_value, order_array_of_structs_by_field, ) +from pyspark.sql.types import ArrayType, DoubleType, StructField, StructType if TYPE_CHECKING: from pyspark.sql import DataFrame, SparkSession @@ -72,7 +71,7 @@ def test_get_record_with_maximum_value_group_two_cols( ], ) def test_order_array_of_structs_by_field( - spark: SparkSession, observed: list, expected: list + spark: SparkSession, observed: list[Any], expected: list[Any] ) -> None: """Test the util that returns an array of structs ordered by a field.""" mock_schema = StructType( diff --git a/utils/configure.py b/utils/configure.py deleted file mode 100644 index 7fbaf5461..000000000 --- a/utils/configure.py +++ /dev/null @@ -1,19 +0,0 @@ -"""Configuration helper.""" -from __future__ import annotations - -import hydra -from omegaconf import DictConfig, OmegaConf - - -@hydra.main(version_base=None, config_path="../configs/", config_name="config") -def configure(cfg: DictConfig) -> None: - """Prints the configuration. - - Args: - cfg (DictConfig): configuration object - """ - print(OmegaConf.to_yaml(cfg)) - - -if __name__ == "__main__": - configure() diff --git a/utils/install_dependencies_on_cluster.sh b/utils/install_dependencies_on_cluster.sh index 39a61e5a6..26cd835e5 100644 --- a/utils/install_dependencies_on_cluster.sh +++ b/utils/install_dependencies_on_cluster.sh @@ -39,6 +39,15 @@ function install_pip() { } function main() { + # Define a specific directory to download the files + local work_dir="/" + cd "${work_dir}" || err "Failed to change to working directory" + echo "Working directory: $(pwd)" + + # more meaningful errors from hydra + echo "export HYDRA_FULL_ERROR=1" | tee --append /etc/profile + source /etc/profile + if [[ -z "${PACKAGE}" ]]; then echo "ERROR: Must specify PACKAGE metadata key" exit 1 @@ -46,7 +55,7 @@ function main() { install_pip echo "Downloading package..." - gsutil cp ${PACKAGE} . + gsutil cp ${PACKAGE} . || err "Failed to download PACKAGE" PACKAGENAME=$(basename ${PACKAGE}) echo "Uninstalling previous version if it exists" @@ -55,8 +64,8 @@ function main() { run_with_retry pip install --upgrade ${PACKAGENAME} echo "Downloading and uncompressing config..." - gsutil cp ${CONFIGTAR} . - tar -xvf $(basename ${CONFIGTAR}) + gsutil cp ${CONFIGTAR} . || err "Failed to download CONFIGTAR" + tar -xvf $(basename ${CONFIGTAR}) || err "Failed to extract CONFIGTAR" } main diff --git a/utils/update_GWAS_Catalog_data.sh b/utils/update_GWAS_Catalog_data.sh index 667e995c4..98ac4cc36 100755 --- a/utils/update_GWAS_Catalog_data.sh +++ b/utils/update_GWAS_Catalog_data.sh @@ -55,17 +55,28 @@ wget -q ${RELEASE_URL}/gwas-catalog-download-studies-v1.0.3.txt \ -O gwas-catalog-v1.0.3-studies-r${YEAR}-${MONTH}-${DAY}.tsv logging "File gwas-catalog-v1.0.3-studies-r${YEAR}-${MONTH}-${DAY}.tsv saved." +wget -q ${RELEASE_URL}/gwas-catalog-unpublished-studies-v1.0.3.tsv \ + -O gwas-catalog-v1.0.3-unpublished-studies-r${YEAR}-${MONTH}-${DAY}.tsv +logging "File gwas-catalog-v1.0.3-unpublished-studies-r${YEAR}-${MONTH}-${DAY}.tsv saved." + wget -q ${RELEASE_URL}/gwas-catalog-download-ancestries-v1.0.3.txt \ -O gwas-catalog-v1.0.3-ancestries-r${YEAR}-${MONTH}-${DAY}.tsv logging "File gwas-catalog-v1.0.3-ancestries-r${YEAR}-${MONTH}-${DAY}.tsv saved." +wget -q ${RELEASE_URL}/gwas-catalog-unpublished-ancestries-v1.0.3.tsv \ + -O gwas-catalog-v1.0.3-unpublished-ancestries-r${YEAR}-${MONTH}-${DAY}.tsv +logging "File gwas-catalog-v1.0.3-unpublished-ancestries-r${YEAR}-${MONTH}-${DAY}.tsv saved." + + wget -q ${BASE_URL}/summary_statistics/harmonised_list.txt -O harmonised_list-r${YEAR}-${MONTH}-${DAY}.txt logging "File harmonised_list-r${YEAR}-${MONTH}-${DAY}.txt saved." logging "Copying files to GCP..." -gsutil -q cp file://$(pwd)/gwas_catalog_v1.0.2-associations_e${ENSEMBL}_r${YEAR}-${MONTH}-${DAY}.tsv ${GCP_TARGET}/ -gsutil -q cp file://$(pwd)/gwas-catalog-v1.0.3-studies-r${YEAR}-${MONTH}-${DAY}.tsv ${GCP_TARGET}/ -gsutil -q cp file://$(pwd)/gwas-catalog-v1.0.3-ancestries-r${YEAR}-${MONTH}-${DAY}.tsv ${GCP_TARGET}/ -gsutil -q cp file://$(pwd)/harmonised_list-r${YEAR}-${MONTH}-${DAY}.txt ${GCP_TARGET}/ +gsutil -mq cp file://$(pwd)/gwas_catalog_v1.0.2-associations_e${ENSEMBL}_r${YEAR}-${MONTH}-${DAY}.tsv ${GCP_TARGET}/ +gsutil -mq cp file://$(pwd)/gwas-catalog-v1.0.3-studies-r${YEAR}-${MONTH}-${DAY}.tsv ${GCP_TARGET}/ +gsutil -mq cp file://$(pwd)/gwas-catalog-v1.0.3-ancestries-r${YEAR}-${MONTH}-${DAY}.tsv ${GCP_TARGET}/ +gsutil -mq cp file://$(pwd)/harmonised_list-r${YEAR}-${MONTH}-${DAY}.txt ${GCP_TARGET}/ +gsutil -mq cp file://$(pwd)/gwas-catalog-v1.0.3-unpublished-studies-r${YEAR}-${MONTH}-${DAY}.tsv ${GCP_TARGET}/ +gsutil -mq cp file://$(pwd)/gwas-catalog-v1.0.3-unpublished-ancestries-r${YEAR}-${MONTH}-${DAY}.tsv ${GCP_TARGET}/ logging "Done." diff --git a/workflow/__init__.py b/workflow/__init__.py deleted file mode 100644 index 0205aa8e7..000000000 --- a/workflow/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -"""Google Cloud Dataproc Workflow.""" - -from __future__ import annotations diff --git a/workflow/dag.yaml b/workflow/dag.yaml deleted file mode 100644 index a9416b774..000000000 --- a/workflow/dag.yaml +++ /dev/null @@ -1,18 +0,0 @@ -- id: "my_gene_index" -- id: "my_variant_annotation" -- id: "my_ld_index" -- id: "my_gwas_catalog" - prerequisites: - - "my_variant_annotation" - - "my_ld_index" -- id: "my_variant_index" - prerequisites: - - "my_variant_annotation" - - "my_gwas_catalog" -- id: "my_v2g" - prerequisites: - - "my_variant_index" - - "my_variant_annotation" - - "my_gene_index" -- id: "my_finngen" -- id: "my_ukbiobank" diff --git a/workflow/workflow_template.py b/workflow/workflow_template.py deleted file mode 100644 index 043733119..000000000 --- a/workflow/workflow_template.py +++ /dev/null @@ -1,260 +0,0 @@ -"""Generate jinja2 template for workflow.""" -from __future__ import annotations - -import argparse -import subprocess - -import yaml -from google.cloud import dataproc_v1 as dataproc -from google.cloud.dataproc_v1.types import ( - NodeInitializationAction, - OrderedJob, - WorkflowTemplate, - WorkflowTemplatePlacement, -) -from google.protobuf.duration_pb2 import Duration - -# Command line arguments -parser = argparse.ArgumentParser(description="Submit the workflow to Dataproc.") -parser.add_argument( - "cluster_prefix", - metavar="cluster_prefix", - type=str, - help="A prefix to use for cluster and template name construction. It's a good idea to use your initials.", -) -parser.add_argument( - "--machine-type", - metavar="machine_type", - type=str, - default="n1-highmem-8", - help="Google Dataproc machine type, default: %(default)s.", -) -parser.add_argument( - "--num-ssds", - metavar="num_local_ssds", - type=int, - default=1, - help="Number of local SSDs that supplement the boot disk, default: %(default)s.", -) -parser.add_argument( - "--boot-disk-size", - metavar="boot_disk_size", - type=int, - default=500, - help="Size in GB of the primary disk attached to each node, default: %(default)s.", -) - - -# Google Cloud configuration -project_id = "open-targets-genetics-dev" -region = "europe-west1" -zone = "europe-west1-d" - -# Managed cluster -code_version = ( - subprocess.check_output(["poetry", "version", "--short"]).decode("utf-8").strip() -) -assert ( - code_version -), "Could not fetch code version from the current Poetry configuration" -initialisation_base_path = ( - f"gs://genetics_etl_python_playground/initialisation/{code_version}" -) -python_cli = f"{initialisation_base_path}/cli.py" -config_name = "my_config" -config_tar = f"{initialisation_base_path}/config.tar.gz" -package_wheel = f"{initialisation_base_path}/otgenetics-{code_version}-py3-none-any.whl" -initialisation_executable_file = ( - f"{initialisation_base_path}/install_dependencies_on_cluster.sh" -) -image_version = "2.1" - -# Available cluster -cluster_uuid = "eba42738-2ea3-4b0a-ba1d-38428427e838" - -# job -python_cli = "gs://genetics_etl_python_playground/initialisation/cli.py" -cluster_config_dir = "/config" - -# template -dag_yaml = "workflow/dag.yaml" - - -def generate_available_placement_template( - cluster_uuid: str, -) -> WorkflowTemplatePlacement: - """Generates placement using available clusters. - - Args: - cluster_uuid (str): Cluster UUID to use for placement. - - Returns: - WorkflowTemplatePlacement: Placement template. - """ - placement = dataproc.WorkflowTemplatePlacement() - placement.cluster_selector.cluster_labels = { - "goog-dataproc-cluster-uuid": cluster_uuid - } - return placement - - -def generate_managed_placement_template( - cluster_name: str, - config_tar: str, - package_wheel: str, - zone: str, - machine_type: str, - initialisation_executable_file: str, - image_version: str, - num_local_ssds: int = 0, - boot_disk_size_gb: int = 500, - initialisation_execution_timeout: str = "600s", -) -> WorkflowTemplatePlacement: - """Generates placement using managed clusters. - - Args: - cluster_name (str): Cluster name to use for placement. - config_tar (str): Path to GS location with config tarball to use for cluster creation. - package_wheel (str): Path to GS location with package wheel to use for cluster creation. - zone (str): Zone to use for cluster creation. - machine_type (str): Machine type to use for cluster creation. - initialisation_executable_file (str): Path to GS location with initialisation script. - image_version (str): Dataproc image version to use for cluster creation. - num_local_ssds (int): Number of local SSDs to use for cluster creation. Defaults to 0. - boot_disk_size_gb (int): Size in GB of the primary disk attached to each node. Defaults to 500. - initialisation_execution_timeout (str): Initialisation script execution timeout. Defaults to "600s". - - Returns: - WorkflowTemplatePlacement: Placement template. - """ - placement = dataproc.WorkflowTemplatePlacement() - placement.managed_cluster.cluster_name = cluster_name - placement.managed_cluster.config.endpoint_config.enable_http_port_access = True - placement.managed_cluster.config.gce_cluster_config.zone_uri = zone - placement.managed_cluster.config.gce_cluster_config.metadata = { - "CONFIGTAR": config_tar, - "PACKAGE": package_wheel, - } - if num_local_ssds > 0: - placement.managed_cluster.config.master_config.disk_config.num_local_ssds = ( - num_local_ssds - ) - initialisation_node = NodeInitializationAction() - initialisation_node.executable_file = initialisation_executable_file - duration = Duration() - duration.FromJsonString(initialisation_execution_timeout) - initialisation_node.execution_timeout = duration - placement.managed_cluster.config.initialization_actions = [initialisation_node] - - placement.managed_cluster.config.master_config.machine_type_uri = machine_type - placement.managed_cluster.config.master_config.disk_config.boot_disk_type = ( - "pd-ssd" if num_local_ssds > 0 else "pd-standard" - ) - placement.managed_cluster.config.master_config.disk_config.boot_disk_size_gb = ( - boot_disk_size_gb - ) - placement.managed_cluster.config.software_config.image_version = image_version - placement.managed_cluster.config.software_config.properties = { - "dataproc:dataproc.allow.zero.workers": "true", - "yarn:yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage": "98", - } - return placement - - -def pyspark_job_template( - step: dict, - cluster_config_dir: str, - config_name: str, -) -> OrderedJob: - """Generates a pyspark job template. - - Args: - step (dict): Step to generate job for. - cluster_config_dir (str): Local path in the cluster where the config tarball is extracted. - config_name (str): Name of the config file to use. - - Returns: - OrderedJob: Pyspark job template. - """ - job = OrderedJob() - job.step_id = step["id"] - job.pyspark_job.main_python_file_uri = python_cli - job.pyspark_job.args = [ - f"step={ step['id'] }", - f"--config-dir={ cluster_config_dir }", - f"--config-name={ config_name }", - ] - # to provide hail support - job.pyspark_job.properties = { - "spark.jars": "/opt/conda/miniconda3/lib/python3.10/site-packages/hail/backend/hail-all-spark.jar", - "spark.driver.extraClassPath": "/opt/conda/miniconda3/lib/python3.10/site-packages/hail/backend/hail-all-spark.jar", - "spark.executor.extraClassPath": "./hail-all-spark.jar", - "spark.serializer": "org.apache.spark.serializer.KryoSerializer", - "spark.kryo.registrator": "is.hail.kryo.HailKryoRegistrator", - } - # dependency steps - if "prerequisites" in step: - job.prerequisite_step_ids = step["prerequisites"] - return job - - -def instantiate_inline_workflow_template( - project_id: str, region: str, template: WorkflowTemplate -) -> None: - """Submits a workflow for a Cloud Dataproc using the Python client library. - - Args: - project_id (str): Project to use for running the workflow. - region (str): Region where the workflow resources should live. - template (WorkflowTemplate): Workflow template to submit. - """ - # Create a client with the endpoint set to the desired region. - workflow_template_client = dataproc.WorkflowTemplateServiceClient( - client_options={"api_endpoint": f"{region}-dataproc.googleapis.com:443"} - ) - # Submit the request to instantiate the workflow from an inline template. - operation = workflow_template_client.instantiate_inline_workflow_template( - request={ - "parent": f"projects/{project_id}/regions/{region}", - "template": template, - } - ) - operation.result() - - # Output a success message. - print("Workflow ran successfully.") - - -def main(args: argparse.Namespace) -> None: - """Submit dataproc workflow.""" - template = dataproc.WorkflowTemplate() - - # Initialize request argument(s) - template.id = f"{args.cluster_prefix}-ot-genetics-workflow" - cluster_name = f"{args.cluster_prefix}-otg-cluster" - # template.placement = generate_available_placement_template(cluster_uuid) - template.placement = generate_managed_placement_template( - cluster_name, - config_tar, - package_wheel, - zone, - args.machine_type, - initialisation_executable_file, - image_version, - num_local_ssds=args.num_ssds, - boot_disk_size_gb=args.boot_disk_size, - ) - - # Load steps from yaml file - with open(dag_yaml, "r") as file: - steps = yaml.safe_load(file) - - template.jobs = [ - pyspark_job_template(step, cluster_config_dir, config_name) for step in steps - ] - - instantiate_inline_workflow_template(project_id, region, template) - - -if __name__ == "__main__": - main(parser.parse_args())