diff --git a/CHANGELOG.md b/CHANGELOG.md index d360fc3..a14121f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,29 @@ +## v1.1.0 (2024-07-21) + +### Feat + +- **kpi**: add key performance indicators +- **mlproject**: add mlflow project and tasks +- **monitoring**: add mlflow.evaluate API +- **lineage**: add lineage features through mlflow data api +- **explanations**: add explainability features and tooling +- **data**: add train, test, and sample data +- **notification**: add service and alerts with plyer +- **observability**: add alerting with plyer notifications +- **observability**: add infrastructure through mlflow system metrics + +### Fix + +- **kpi**: add key performance indicators +- **projects**: change naming convention +- **evaluation**: add evaluation files +- **loading**: use version or alias for loading models +- **warnings**: improve styles and remove warnings +- **mlflow**: remove input examples following the addition of lineage +- **paths**: fix path for explanation job +- **data**: fix models explanations name +- **data**: add parquet data + ## v1.0.1 (2024-06-28) ### Fix diff --git a/MLproject b/MLproject new file mode 100644 index 0000000..1cba85a --- /dev/null +++ b/MLproject @@ -0,0 +1,9 @@ +# https://mlflow.org/docs/latest/projects.html + +name: bikes +python_env: python_env.yaml +entry_points: + main: + parameters: + conf_file: path + command: "PYTHONPATH=src python -m bikes {conf_file}" diff --git a/README.md b/README.md index cfcaa27..0fc2137 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,13 @@ You can use this package as part of your MLOps toolkit or platform (e.g., Model - [Programming](#programming) - [Language: Python](#language-python) - [Version: Pyenv](#version-pyenv) + - [Observability](#observability) + - [Reproducibility: Mlflow Project](#reproducibility-mlflow-project) + - [Monitoring : Mlflow Evaluate](#monitoring--mlflow-evaluate) + - [Alerting: Plyer](#alerting-plyer) + - [Lineage: Mlflow Dataset](#lineage-mlflow-dataset) + - [Explainability: SHAP](#explainability-shap) + - [Infrastructure: Mlflow System Metrics](#infrastructure-mlflow-system-metrics) - [Tips](#tips) - [AI/ML Practices](#aiml-practices) - [Data Catalog](#data-catalog) @@ -150,10 +157,10 @@ job: KIND: TrainingJob inputs: KIND: ParquetReader - path: data/inputs.parquet + path: data/inputs_train.parquet targets: KIND: ParquetReader - path: data/targets.parquet + path: data/targets_train.parquet ``` This config file instructs the program to start a `TrainingJob` with 2 parameters: @@ -173,6 +180,8 @@ $ poetry run [package] confs/tuning.yaml $ poetry run [package] confs/training.yaml $ poetry run [package] confs/promotion.yaml $ poetry run [package] confs/inference.yaml +$ poetry run [package] confs/evaluations.yaml +$ poetry run [package] confs/explanations.yaml ``` In production, you can build, ship, and run the project as a Python package: @@ -210,7 +219,7 @@ You can invoke the actions from the [command-line](https://www.pyinvoke.org/) or ```bash # execute the project DAG -$ inv dags +$ inv projects # create a code archive $ inv packages # list other actions @@ -231,13 +240,16 @@ $ inv --list - **cleans.coverage** - Clean the coverage tool. - **cleans.dist** - Clean the dist folder. - **cleans.docs** - Clean the docs folder. +- **cleans.environment** - Clean the project environment file. - **cleans.folders** - Run all folders tasks. - **cleans.mlruns** - Clean the mlruns folder. - **cleans.mypy** - Clean the mypy tool. - **cleans.outputs** - Clean the outputs folder. - **cleans.poetry** - Clean poetry lock file. - **cleans.pytest** - Clean the pytest tool. +- **cleans.projects** - Run all projects tasks. - **cleans.python** - Clean python caches and bytecodes. +- **cleans.requirements** - Clean the project requirements file. - **cleans.reset** - Run all tools, folders, and sources tasks. - **cleans.ruff** - Clean the ruff tool. - **cleans.sources** - Run all sources tasks. @@ -251,8 +263,6 @@ $ inv --list - **containers.build** - Build the container image with the given tag. - **containers.compose** - Start up docker compose. - **containers.run** - Run the container image with the given tag. -- **dags.all (dags)** - Run all DAG tasks. -- **dags.job** - Run the project for the given job name. - **docs.all (docs)** - Run all docs tasks. - **docs.api** - Document the API with pdoc using the given format and output directory. - **docs.serve** - Serve the API docs with pdoc using the given format and computer port. @@ -267,6 +277,10 @@ $ inv --list - **mlflow.serve** - Start mlflow server with the given host, port, and backend uri. - **packages.all (packages)** - Run all package tasks. - **packages.build** - Build a python package with the given format. +- **projects.all (projects)** - Run all project tasks. +- **projects.environment** - Export the project environment file. +- **projects.requirements** - Export the project requirements file. +- **projects.run** - Run an mlflow project from MLproject file. ## Workflows @@ -719,6 +733,82 @@ Select your programming environment. - **Alternatives**: - Manual installation: time consuming +## Observability + +### Reproducibility: [Mlflow Project](https://mlflow.org/docs/latest/projects.html) + +- **Motivations**: + - Share common project formats. + - Ensure the project can be reused. + - Avoid randomness in project execution. +- **Limitations**: + - Mlflow Project is best suited for small projects. +- **Alternatives**: + - [DVC](https://dvc.org/): both data and models. + - [Metaflow](https://metaflow.org/): focus on machine learning. + - **[Apache Airflow](https://airflow.apache.org/)**: for large scale projects. + +### Monitoring : [Mlflow Evaluate](https://mlflow.org/docs/latest/model-evaluation/index.html) + +- **Motivations**: + - Compute the model metrics. + - Validate model with thresholds. + - Perform post-training evaluations. +- **Limitations**: + - Mlflow Evaluate is less feature-rich as alternatives. +- **Alternatives**: + - **[Giskard](https://www.giskard.ai/)**: open-core and super complete. + - **[Evidently](https://www.evidentlyai.com/)**: open-source with more metrics. + - [Arize AI](https://arize.com/): more feature-rich but less flexible. + - [Graphana](https://grafana.com/): you must do everything yourself. + +### Alerting: [Plyer](https://github.com/kivy/plyer) + +- **Motivations**: + - Simple solution. + - Send notifications on system. + - Cross-system: Mac, Linux, Windows. +- **Limitations**: + - Should not be used for large scale projects. +- **Alternatives**: + - [Slack](https://slack.com/): for chat-oriented solutions. + - [Datadog](https://www.datadoghq.com/): for infrastructure oriented solutions. + +### Lineage: [Mlflow Dataset](https://mlflow.org/docs/latest/tracking/data-api.html) + +- **Motivations**: + - Store information in Mlflow. + - Track metadata about run datasets. + - Keep URI of the dataset source (e.g., website). +- **Limitations**: + - Not as feature-rich as alternative solutions. +- **Alternatives**: + - [Databricks Lineage](https://docs.databricks.com/en/admin/system-tables/lineage.html): limited to Databricks. + - [OpenLineage and Marquez](https://marquezproject.github.io/): open-source and flexible. + +### Explainability: [SHAP](https://shap.readthedocs.io/en/latest/) + +- **Motivations**: + - Most popular toolkit. + - Support various models (linear, model, ...). + - Integration with Mlflow through the [SHAP module](https://mlflow.org/docs/latest/python_api/mlflow.shap.html). +- **Limitations**: + - Super slow on large dataset. + - Mlflow SHAP module is not mature enough. +- **Alternatives**: + - [LIME](https://github.com/marcotcr/lime): not maintained anymore. + +### Infrastructure: [Mlflow System Metrics](https://mlflow.org/docs/latest/system-metrics/index.html) + +- **Motivations**: + - Track infrastructure information (RAM, CPU, ...). + - Integrated with Mlflow tracking. + - Provide hardware insights. +- **Limitations**: + - Not as mature as alternative solutions. +- **Alternatives**: + - [Datadog](https://www.datadoghq.com/): popular and mature solution. + # Tips This sections gives some tips and tricks to enrich the develop experience. @@ -736,10 +826,10 @@ This tag can then be associated to a reader/writer implementation in a configura ```yaml inputs: KIND: ParquetReader - path: data/inputs.parquet + path: data/inputs_train.parquet targets: KIND: ParquetReader - path: data/targets.parquet + path: data/targets_train.parquet ``` In this package, the implementation are described in `src/[package]/io/datasets.py` and selected by `KIND`. diff --git a/confs/evaluations.yaml b/confs/evaluations.yaml new file mode 100644 index 0000000..40bee1f --- /dev/null +++ b/confs/evaluations.yaml @@ -0,0 +1,8 @@ +job: + KIND: EvaluationsJob + inputs: + KIND: ParquetReader + path: data/inputs_train.parquet + targets: + KIND: ParquetReader + path: data/targets_train.parquet diff --git a/confs/explanations.yaml b/confs/explanations.yaml new file mode 100644 index 0000000..12d8474 --- /dev/null +++ b/confs/explanations.yaml @@ -0,0 +1,12 @@ +job: + KIND: ExplanationsJob + inputs_samples: + KIND: ParquetReader + path: data/inputs_test.parquet + limit: 100 + models_explanations: + KIND: ParquetWriter + path: outputs/models_explanations.parquet + samples_explanations: + KIND: ParquetWriter + path: outputs/samples_explanations.parquet diff --git a/confs/inference.yaml b/confs/inference.yaml index 0aa6c2f..38febbc 100644 --- a/confs/inference.yaml +++ b/confs/inference.yaml @@ -2,7 +2,7 @@ job: KIND: InferenceJob inputs: KIND: ParquetReader - path: data/inputs.parquet + path: data/inputs_test.parquet outputs: KIND: ParquetWriter - path: outputs/predictions.parquet + path: outputs/predictions_test.parquet diff --git a/confs/training.yaml b/confs/training.yaml index ca80fdc..e037286 100644 --- a/confs/training.yaml +++ b/confs/training.yaml @@ -2,7 +2,7 @@ job: KIND: TrainingJob inputs: KIND: ParquetReader - path: data/inputs.parquet + path: data/inputs_train.parquet targets: KIND: ParquetReader - path: data/targets.parquet + path: data/targets_train.parquet diff --git a/confs/tuning.yaml b/confs/tuning.yaml index 920a3ec..f09fba8 100644 --- a/confs/tuning.yaml +++ b/confs/tuning.yaml @@ -2,7 +2,7 @@ job: KIND: TuningJob inputs: KIND: ParquetReader - path: data/inputs.parquet + path: data/inputs_train.parquet targets: KIND: ParquetReader - path: data/targets.parquet + path: data/targets_train.parquet diff --git a/data/inputs_test.parquet b/data/inputs_test.parquet new file mode 100644 index 0000000..1e40787 Binary files /dev/null and b/data/inputs_test.parquet differ diff --git a/data/inputs.parquet b/data/inputs_train.parquet similarity index 63% rename from data/inputs.parquet rename to data/inputs_train.parquet index 1cdbbad..da347d9 100644 Binary files a/data/inputs.parquet and b/data/inputs_train.parquet differ diff --git a/data/targets_test.parquet b/data/targets_test.parquet new file mode 100644 index 0000000..10c3c20 Binary files /dev/null and b/data/targets_test.parquet differ diff --git a/data/targets.parquet b/data/targets_train.parquet similarity index 58% rename from data/targets.parquet rename to data/targets_train.parquet index eed421e..de9a2b9 100644 Binary files a/data/targets.parquet and b/data/targets_train.parquet differ diff --git a/notebooks/explain.ipynb b/notebooks/explain.ipynb new file mode 100644 index 0000000..69a6507 --- /dev/null +++ b/notebooks/explain.ipynb @@ -0,0 +1,4576 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Analyze model and sample explanations from feature importances and SHAP values.**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# IMPORTS" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/fmind/mlops-python-package/.venv/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], + "source": [ + "import shap\n", + "import pandas as pd\n", + "import plotly.express as px" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# CONFIGS" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# note: you must run the explanations job first to generate the output\n", + "MODELS_EXPLANATIONS = '../outputs/models_explanations.parquet'\n", + "SAMPLES_EXPLANATIONS = '../outputs/samples_explanations.parquet'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# DATASETS" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(19, 2)\n" + ] + }, + { + "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", + "
featureimportance
18numericals__casual0.579146
10numericals__hr0.250726
13numericals__workingday0.078542
8numericals__yr0.038600
9numericals__mnth0.012079
\n", + "
" + ], + "text/plain": [ + " feature importance\n", + "18 numericals__casual 0.579146\n", + "10 numericals__hr 0.250726\n", + "13 numericals__workingday 0.078542\n", + "8 numericals__yr 0.038600\n", + "9 numericals__mnth 0.012079" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "models_explanations = pd.read_parquet(MODELS_EXPLANATIONS).sort_values(\n", + " \"importance\", ascending=False\n", + ")\n", + "print(models_explanations.shape)\n", + "models_explanations.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(100, 19)\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \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", + "
categoricals__season_1categoricals__season_2categoricals__season_3categoricals__season_4categoricals__weathersit_1categoricals__weathersit_2categoricals__weathersit_3categoricals__weathersit_4numericals__yrnumericals__mnthnumericals__hrnumericals__holidaynumericals__weekdaynumericals__workingdaynumericals__tempnumericals__atempnumericals__humnumericals__windspeednumericals__casual
00.169155-0.124650-0.203503-0.758982-1.474484-1.0763490.8019560.00051331.4951342.905728-74.036369-0.019947-7.11896818.6407952.6138961.898717-1.322058-0.210363147.338089
10.142295-0.242301-0.061819-0.650959-1.001739-0.5237190.8241410.00050132.2514922.752874-68.468292-0.037579-4.27233519.7231661.8124521.4621430.3695320.374412117.786423
20.168699-0.173419-0.054359-0.723623-1.554552-1.0339790.7629420.00053432.2454303.195950-82.5151670.009938-2.85652919.8243031.4989752.0467801.5594382.603706127.694664
30.253636-0.791483-0.218226-0.6126110.4995810.0397980.7789880.00051830.9053542.808645-70.1802220.097680-6.69985719.2064724.4686947.614378-0.7768831.582501180.403839
40.130902-0.788029-0.395371-0.614574-1.5584090.111731-3.9279000.00090447.1910676.631704-4.3152430.029141-0.15762029.4014264.7042894.135256-3.7745230.583940202.349609
\n", + "
" + ], + "text/plain": [ + " categoricals__season_1 categoricals__season_2 categoricals__season_3 \\\n", + "0 0.169155 -0.124650 -0.203503 \n", + "1 0.142295 -0.242301 -0.061819 \n", + "2 0.168699 -0.173419 -0.054359 \n", + "3 0.253636 -0.791483 -0.218226 \n", + "4 0.130902 -0.788029 -0.395371 \n", + "\n", + " categoricals__season_4 categoricals__weathersit_1 \\\n", + "0 -0.758982 -1.474484 \n", + "1 -0.650959 -1.001739 \n", + "2 -0.723623 -1.554552 \n", + "3 -0.612611 0.499581 \n", + "4 -0.614574 -1.558409 \n", + "\n", + " categoricals__weathersit_2 categoricals__weathersit_3 \\\n", + "0 -1.076349 0.801956 \n", + "1 -0.523719 0.824141 \n", + "2 -1.033979 0.762942 \n", + "3 0.039798 0.778988 \n", + "4 0.111731 -3.927900 \n", + "\n", + " categoricals__weathersit_4 numericals__yr numericals__mnth \\\n", + "0 0.000513 31.495134 2.905728 \n", + "1 0.000501 32.251492 2.752874 \n", + "2 0.000534 32.245430 3.195950 \n", + "3 0.000518 30.905354 2.808645 \n", + "4 0.000904 47.191067 6.631704 \n", + "\n", + " numericals__hr numericals__holiday numericals__weekday \\\n", + "0 -74.036369 -0.019947 -7.118968 \n", + "1 -68.468292 -0.037579 -4.272335 \n", + "2 -82.515167 0.009938 -2.856529 \n", + "3 -70.180222 0.097680 -6.699857 \n", + "4 -4.315243 0.029141 -0.157620 \n", + "\n", + " numericals__workingday numericals__temp numericals__atemp \\\n", + "0 18.640795 2.613896 1.898717 \n", + "1 19.723166 1.812452 1.462143 \n", + "2 19.824303 1.498975 2.046780 \n", + "3 19.206472 4.468694 7.614378 \n", + "4 29.401426 4.704289 4.135256 \n", + "\n", + " numericals__hum numericals__windspeed numericals__casual \n", + "0 -1.322058 -0.210363 147.338089 \n", + "1 0.369532 0.374412 117.786423 \n", + "2 1.559438 2.603706 127.694664 \n", + "3 -0.776883 1.582501 180.403839 \n", + "4 -3.774523 0.583940 202.349609 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples_explanations = pd.read_parquet(SAMPLES_EXPLANATIONS)\n", + "print(samples_explanations.shape)\n", + "samples_explanations.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + ".values =\n", + " categoricals__season_1 categoricals__season_2 categoricals__season_3 \\\n", + "0 0.169155 -0.124650 -0.203503 \n", + "1 0.142295 -0.242301 -0.061819 \n", + "2 0.168699 -0.173419 -0.054359 \n", + "3 0.253636 -0.791483 -0.218226 \n", + "4 0.130902 -0.788029 -0.395371 \n", + ".. ... ... ... \n", + "95 0.032898 0.004389 -0.022684 \n", + "96 -0.039833 -0.035329 -0.022280 \n", + "97 -0.029910 -0.054200 -0.015400 \n", + "98 0.002795 -0.055408 -0.033671 \n", + "99 0.001024 -0.061020 -0.034896 \n", + "\n", + " categoricals__season_4 categoricals__weathersit_1 \\\n", + "0 -0.758982 -1.474484 \n", + "1 -0.650959 -1.001739 \n", + "2 -0.723623 -1.554552 \n", + "3 -0.612611 0.499581 \n", + "4 -0.614574 -1.558409 \n", + ".. ... ... \n", + "95 -0.615178 0.264237 \n", + "96 -0.627357 0.463110 \n", + "97 -0.607787 0.455338 \n", + "98 -0.623416 0.560994 \n", + "99 -0.625861 0.542756 \n", + "\n", + " categoricals__weathersit_2 categoricals__weathersit_3 \\\n", + "0 -1.076349 0.801956 \n", + "1 -0.523719 0.824141 \n", + "2 -1.033979 0.762942 \n", + "3 0.039798 0.778988 \n", + "4 0.111731 -3.927900 \n", + ".. ... ... \n", + "95 -0.054727 0.568837 \n", + "96 -0.015223 0.565861 \n", + "97 0.003094 0.551169 \n", + "98 0.020387 0.537736 \n", + "99 0.013132 0.532625 \n", + "\n", + " categoricals__weathersit_4 numericals__yr numericals__mnth \\\n", + "0 0.000513 31.495134 2.905728 \n", + "1 0.000501 32.251492 2.752874 \n", + "2 0.000534 32.245430 3.195950 \n", + "3 0.000518 30.905354 2.808645 \n", + "4 0.000904 47.191067 6.631704 \n", + ".. ... ... ... \n", + "95 0.000399 40.124039 6.724072 \n", + "96 0.000403 35.804981 20.436369 \n", + "97 0.000411 32.999043 26.067795 \n", + "98 0.000392 32.314198 23.293106 \n", + "99 0.000388 32.588284 24.576950 \n", + "\n", + " numericals__hr numericals__holiday numericals__weekday \\\n", + "0 -74.036369 -0.019947 -7.118968 \n", + "1 -68.468292 -0.037579 -4.272335 \n", + "2 -82.515167 0.009938 -2.856529 \n", + "3 -70.180222 0.097680 -6.699857 \n", + "4 -4.315243 0.029141 -0.157620 \n", + ".. ... ... ... \n", + "95 -3.901324 0.138933 0.979801 \n", + "96 4.877304 -0.027108 2.595324 \n", + "97 5.580533 -0.012089 2.779204 \n", + "98 1.114409 0.254242 2.357220 \n", + "99 1.200160 0.254306 2.411582 \n", + "\n", + " numericals__workingday numericals__temp numericals__atemp \\\n", + "0 18.640795 2.613896 1.898717 \n", + "1 19.723166 1.812452 1.462143 \n", + "2 19.824303 1.498975 2.046780 \n", + "3 19.206472 4.468694 7.614378 \n", + "4 29.401426 4.704289 4.135256 \n", + ".. ... ... ... \n", + "95 -21.420794 -1.613000 -4.774735 \n", + "96 -20.015820 -0.422287 -6.170654 \n", + "97 -19.195932 -3.357377 -8.327322 \n", + "98 -18.854221 -0.914422 -15.955507 \n", + "99 -19.075937 -1.693157 -12.839770 \n", + "\n", + " numericals__hum numericals__windspeed numericals__casual \n", + "0 -1.322058 -0.210363 147.338089 \n", + "1 0.369532 0.374412 117.786423 \n", + "2 1.559438 2.603706 127.694664 \n", + "3 -0.776883 1.582501 180.403839 \n", + "4 -3.774523 0.583940 202.349609 \n", + ".. ... ... ... \n", + "95 -2.793116 1.410505 319.295746 \n", + "96 -1.366720 -0.086119 363.113678 \n", + "97 1.297852 0.499207 374.674683 \n", + "98 1.504436 -0.023106 381.828125 \n", + "99 3.381457 -0.181553 378.957825 \n", + "\n", + "[100 rows x 19 columns]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "shap_values = shap.Explanation(samples_explanations, feature_names=samples_explanations.columns.to_list())\n", + "shap_values.feature_names\n", + "shap_values" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# EXPLANATIONS" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "alignmentgroup": "True", + "hovertemplate": "feature=%{x}
importance=%{y}", + "legendgroup": "", + "marker": { + "color": "#636efa", + "pattern": { + "shape": "" + } + }, + "name": "", + "offsetgroup": "", + "orientation": "v", + "showlegend": false, + "textposition": "auto", + "type": "bar", + "x": [ + "numericals__casual", + "numericals__hr", + "numericals__workingday", + "numericals__yr", + "numericals__mnth", + "numericals__hum", + "numericals__atemp", + "numericals__temp", + "numericals__weekday", + "numericals__windspeed", + "categoricals__weathersit_3", + "categoricals__season_4", + "categoricals__season_1", + "numericals__holiday", + "categoricals__weathersit_1", + "categoricals__weathersit_2", + "categoricals__season_2", + "categoricals__season_3", + "categoricals__weathersit_4" + ], + "xaxis": "x", + "y": [ + 0.5791462063789368, + 0.2507259249687195, + 0.0785420835018158, + 0.038599804043769836, + 0.0120792705565691, + 0.008070561103522778, + 0.006674219388514757, + 0.006322493776679039, + 0.00494948448613286, + 0.004703037440776825, + 0.0028446626383811235, + 0.002690249355509877, + 0.0013275929959490895, + 0.0011345595121383667, + 0.0009102495387196541, + 0.0005809680442325771, + 0.0005128193879500031, + 0.00018277487833984196, + 0.0000030518597213813337 + ], + "yaxis": "y" + } + ], + "layout": { + "barmode": "relative", + "legend": { + "tracegroupgap": 0 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Feature Importances" + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "feature" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "importance" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "px.bar(models_explanations, x='feature', y='importance', title='Feature Importances')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Samples" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "coloraxis": "coloraxis", + "hovertemplate": "x: %{x}
y: %{y}
color: %{z}", + "name": "0", + "type": "heatmap", + "x": [ + "categoricals__season_1", + "categoricals__season_2", + "categoricals__season_3", + "categoricals__season_4", + "categoricals__weathersit_1", + "categoricals__weathersit_2", + "categoricals__weathersit_3", + "categoricals__weathersit_4", + "numericals__yr", + "numericals__mnth", + "numericals__hr", + "numericals__holiday", + "numericals__weekday", + "numericals__workingday", + "numericals__temp", + "numericals__atemp", + "numericals__hum", + "numericals__windspeed", + "numericals__casual" + ], + "xaxis": "x", + "y": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99 + ], + "yaxis": "y", + "z": [ + [ + 0.169154554605484, + -0.12465005367994308, + -0.20350304245948792, + -0.7589821815490723, + -1.4744840860366821, + -1.0763494968414307, + 0.8019556403160095, + 0.0005125635070726275, + 31.495134353637695, + 2.905728340148926, + -74.03636932373047, + -0.01994742453098297, + -7.118968486785889, + 18.64079475402832, + 2.613896131515503, + 1.898716688156128, + -1.322058081626892, + -0.21036271750926971, + 147.3380889892578 + ], + [ + 0.14229492843151093, + -0.24230052530765533, + -0.06181931495666504, + -0.6509594321250916, + -1.0017391443252563, + -0.523719310760498, + 0.8241411447525024, + 0.0005005813436582685, + 32.25149154663086, + 2.7528738975524902, + -68.46829223632812, + -0.037578750401735306, + -4.272334575653076, + 19.72316551208496, + 1.8124518394470215, + 1.4621434211730957, + 0.3695316016674042, + 0.37441232800483704, + 117.78642272949219 + ], + [ + 0.16869859397411346, + -0.17341940104961395, + -0.054359059780836105, + -0.7236232757568359, + -1.5545519590377808, + -1.0339789390563965, + 0.762941837310791, + 0.0005341940559446812, + 32.24542999267578, + 3.1959495544433594, + -82.51516723632812, + 0.009938172064721584, + -2.8565289974212646, + 19.824302673339844, + 1.4989748001098633, + 2.0467801094055176, + 1.55943763256073, + 2.603705883026123, + 127.69466400146484 + ], + [ + 0.25363633036613464, + -0.7914834022521973, + -0.2182263433933258, + -0.6126111149787903, + 0.4995812475681305, + 0.03979773819446564, + 0.7789877653121948, + 0.0005178267601877451, + 30.905353546142578, + 2.808645009994507, + -70.18022155761719, + 0.09768002480268478, + -6.699856758117676, + 19.206472396850586, + 4.46869421005249, + 7.614377975463867, + -0.7768831253051758, + 1.5825011730194092, + 180.40383911132812 + ], + [ + 0.13090188801288605, + -0.7880292534828186, + -0.3953709006309509, + -0.6145736575126648, + -1.5584088563919067, + 0.11173088103532791, + -3.9278995990753174, + 0.0009037204436026514, + 47.19106674194336, + 6.631704330444336, + -4.315243244171143, + 0.029140517115592957, + -0.1576196849346161, + 29.401426315307617, + 4.704289436340332, + 4.135255813598633, + -3.7745230197906494, + 0.583940327167511, + 202.349609375 + ], + [ + 0.09980977326631546, + -0.1289137452840805, + 0.04262050241231918, + -1.0114322900772095, + -1.5444451570510864, + -0.3063795566558838, + 1.2926396131515503, + 0.007032076362520456, + 77.94355010986328, + 5.943662643432617, + 176.00094604492188, + 0.0029676654376089573, + 4.077856063842773, + 77.48359680175781, + 2.1760151386260986, + -4.81910514831543, + -3.676065444946289, + 0.42632120847702026, + 252.67762756347656 + ], + [ + 0.17066802084445953, + -0.2959515154361725, + -0.11001028120517731, + -1.0064359903335571, + -1.6547470092773438, + -0.7146743535995483, + 1.3593095541000366, + 0.006959938909858465, + 67.61687469482422, + 7.270330429077148, + 177.5045623779297, + -0.15282031893730164, + 6.387446403503418, + 96.7355728149414, + 2.823650360107422, + -3.538238763809204, + -3.534722089767456, + 1.1455564498901367, + 236.20997619628906 + ], + [ + 0.21100318431854248, + -0.5323825478553772, + -0.11136386543512344, + -0.7844051122665405, + -3.295231342315674, + -4.226391315460205, + 1.0265041589736938, + 0.006217549089342356, + 52.71641540527344, + 5.100271701812744, + 64.47308349609375, + -0.13248220086097717, + 6.663832187652588, + 58.35783386230469, + 3.418996572494507, + 2.1445350646972656, + -2.514310836791992, + 1.3115136623382568, + 195.78465270996094 + ], + [ + 0.15828295052051544, + -0.10273899137973785, + -0.23303288221359253, + -0.7537844181060791, + -1.0537359714508057, + -0.3776755928993225, + 0.923829197883606, + 0.0001359017041977495, + 39.298519134521484, + 1.023025631904602, + -0.3841829001903534, + -0.09258145093917847, + 3.8694167137145996, + 46.602294921875, + 3.19360613822937, + 3.103475332260132, + -3.797464370727539, + -1.9199837446212769, + 138.60589599609375 + ], + [ + 0.15737031400203705, + 0.0520184300839901, + -0.4065300226211548, + -0.6695138812065125, + -0.9999762773513794, + -0.3622300326824188, + 0.7322946190834045, + 0.0005345836980268359, + 41.25462341308594, + 0.020151332020759583, + -39.13706970214844, + -0.08169162273406982, + 4.318027496337891, + 40.69746780395508, + 2.7966856956481934, + 2.3097407817840576, + -4.547541618347168, + -1.7421387434005737, + 140.1410675048828 + ], + [ + 0.2103569209575653, + -0.6580501794815063, + -0.018581287935376167, + -0.5772673487663269, + 0.5382667779922485, + 0.07692182064056396, + 0.7319211959838867, + 0.0004881093336734921, + 36.82917022705078, + 2.3916404247283936, + -56.327823638916016, + -0.10369519889354706, + -3.7037088871002197, + 17.519577026367188, + 3.3487110137939453, + 4.850150108337402, + -1.7671900987625122, + 0.2815130054950714, + 62.255897521972656 + ], + [ + 0.23457731306552887, + -0.3182263970375061, + -0.03401074558496475, + -0.5962135195732117, + 0.6905218958854675, + 0.0343155562877655, + 0.6870012283325195, + 0.0006443400052376091, + 21.72657585144043, + 2.088026762008667, + -64.06810760498047, + -0.028121035546064377, + -2.425230026245117, + 10.60973072052002, + 1.6931196451187134, + 1.4571316242218018, + -2.226402521133423, + 0.7569981217384338, + -37.61403274536133 + ], + [ + 0.1959066241979599, + -0.18706031143665314, + -0.02977874130010605, + -0.5241200923919678, + 0.7009141445159912, + 0.07782352715730667, + 0.6562888622283936, + 0.0007873308495618403, + 18.619783401489258, + 1.6802222728729248, + -87.85552978515625, + 0.008099825121462345, + -2.5846824645996094, + 2.4992663860321045, + 1.3333842754364014, + 1.8203318119049072, + -3.4116618633270264, + 0.13050484657287598, + -54.8721809387207 + ], + [ + 0.22012750804424286, + -0.1243598610162735, + 0.04713971167802811, + -0.4951706528663635, + 0.5279565453529358, + 0.006826077122241259, + 1.2234665155410767, + 0.0020947991870343685, + 16.840295791625977, + 1.5345487594604492, + -78.14442443847656, + 0.06610047072172165, + -0.40369319915771484, + 6.414614200592041, + 1.874184489250183, + 1.5743393898010254, + -1.5664819478988647, + 0.8207980394363403, + -93.91680145263672 + ], + [ + 0.23642316460609436, + -0.07295327633619308, + 0.02021026983857155, + -0.46774348616600037, + 0.5260272026062012, + -0.0433531254529953, + 1.3350751399993896, + 0.0008117177058011293, + 16.031938552856445, + 1.671962857246399, + -78.07720947265625, + 0.022589685395359993, + -0.31112754344940186, + 7.640243053436279, + 1.160016655921936, + 1.7891626358032227, + -2.236783981323242, + 0.45728132128715515, + -104.49085235595703 + ], + [ + 0.24079622328281403, + -0.04550537094473839, + 0.10600541532039642, + -0.4731599688529968, + 0.5193852782249451, + -0.02344142273068428, + 1.3347171545028687, + 0.000648858433123678, + 15.789037704467773, + 1.5652916431427002, + -80.2547836303711, + -0.0102729182690382, + -0.08482003957033157, + 8.450746536254883, + 1.0162487030029297, + 1.6323434114456177, + -2.069530487060547, + 0.407787561416626, + -104.59845733642578 + ], + [ + 0.2427425980567932, + -0.0384024940431118, + 0.10925472527742386, + -0.4685764014720917, + 0.6121373176574707, + -0.010323641821742058, + 1.344220519065857, + 0.000648858433123678, + 17.439502716064453, + 1.6917942762374878, + -73.54963684082031, + -0.021768908947706223, + -0.015513437800109386, + 10.325225830078125, + 0.9995515942573547, + 1.6338378190994263, + -1.988153100013733, + 0.34100043773651123, + -114.72674560546875 + ], + [ + 0.19245152175426483, + -0.08253858983516693, + -0.0036932018119841814, + -0.47749078273773193, + -0.778639554977417, + -0.12267234921455383, + 1.2741750478744507, + 0.0017355340532958508, + 19.329111099243164, + 1.9788233041763306, + -49.32539367675781, + -0.014683695510029793, + 0.3591795265674591, + 14.508062362670898, + 1.2764817476272583, + 1.9689347743988037, + -3.1787121295928955, + -0.0871240571141243, + -117.06720733642578 + ], + [ + 0.26470598578453064, + -0.20068220794200897, + 0.04700566455721855, + -0.5295122861862183, + -2.3159399032592773, + -0.5527059435844421, + 1.4427541494369507, + 0.002121501136571169, + 23.01054573059082, + 4.577113151550293, + 4.840754985809326, + -0.04685033857822418, + 1.0733647346496582, + 24.8539981842041, + 2.3293471336364746, + 2.876255512237549, + -2.0436370372772217, + 0.4947572350502014, + -95.24009704589844 + ], + [ + 0.6009383797645569, + -0.53944331407547, + 0.07307998836040497, + -0.5650307536125183, + -1.6178886890411377, + -1.9659442901611328, + 1.523211121559143, + 0.0005157730774953961, + 55.051509857177734, + 11.02030086517334, + 134.98486328125, + -0.21013426780700684, + 1.3449642658233643, + 48.54542541503906, + 4.885603427886963, + 7.470324516296387, + -3.7808265686035156, + -0.40304115414619446, + 21.054868698120117 + ], + [ + 1.0368555784225464, + -4.67413330078125, + -0.0035402767825871706, + -0.6122829914093018, + -1.3186876773834229, + -0.3487352132797241, + 2.466224431991577, + 0.0005312719731591642, + 84.37887573242188, + 6.363649368286133, + 223.41319274902344, + -0.32166752219200134, + 1.1088142395019531, + 57.85630798339844, + -3.1717469692230225, + 0.9009676575660706, + 1.3160041570663452, + 1.3381297588348389, + 127.35955047607422 + ], + [ + 0.12387402355670929, + 0.07819881290197372, + -0.009967210702598095, + -0.7128632664680481, + -0.6675121784210205, + 0.03523243963718414, + 1.462039589881897, + 0.0005336896283552051, + 54.256168365478516, + 2.884908437728882, + 24.965435028076172, + -0.05086776614189148, + 1.2107491493225098, + 28.869901657104492, + -0.03788652643561363, + 0.46800532937049866, + 0.19632861018180847, + 1.7283220291137695, + 36.397701263427734 + ], + [ + 0.15390318632125854, + -0.24831996858119965, + -0.005272223148494959, + -0.5715996026992798, + -0.8208709955215454, + -0.1594245284795761, + 0.7970048189163208, + 0.0005079301190562546, + 31.991912841796875, + 2.542576551437378, + -94.4873275756836, + -0.09413846582174301, + -1.5950297117233276, + 12.353922843933105, + 3.599046468734741, + 2.71368408203125, + 1.3042409420013428, + 0.17937436699867249, + 94.56910705566406 + ], + [ + 0.12881344556808472, + -0.23975999653339386, + -0.11960572004318237, + -0.7206676602363586, + -1.1241790056228638, + -0.6253287196159363, + 0.7455617189407349, + 0.0005503954016603529, + 27.759973526000977, + 2.76396107673645, + -93.7419662475586, + 0.02968677505850792, + -0.7746119499206543, + 19.718368530273438, + 2.5528836250305176, + 1.075609564781189, + 0.22086085379123688, + 2.4454987049102783, + 129.79888916015625 + ], + [ + 0.12905992567539215, + -0.2558153569698334, + -0.021835684776306152, + -0.5680426955223083, + -1.2032192945480347, + -0.269516259431839, + 0.8631099462509155, + 0.0005503954016603529, + 41.81741714477539, + 3.8032913208007812, + -56.884029388427734, + -0.1119290143251419, + 0.18008644878864288, + 14.842578887939453, + 3.691838026046753, + 2.833195447921753, + 0.746959924697876, + 2.0351486206054688, + 112.8614273071289 + ], + [ + 0.25078874826431274, + -0.7432373762130737, + 0.15399301052093506, + -0.5888906717300415, + -0.9327319860458374, + -0.34541767835617065, + 0.8261586427688599, + 0.0005503954016603529, + 31.770305633544922, + 2.8528950214385986, + -65.05724334716797, + 0.10114981979131699, + -4.877957344055176, + 19.00931167602539, + 4.283749580383301, + 7.261184215545654, + -0.10680069774389267, + 1.2539360523223877, + 181.61904907226562 + ], + [ + 0.16916249692440033, + -0.3376086950302124, + -0.017634164541959763, + -0.5719799995422363, + -0.8471976518630981, + -0.2293485701084137, + 0.8150206208229065, + 0.00047357301809825003, + 37.48652648925781, + 3.877255439758301, + -68.99298858642578, + -0.11778315156698227, + -0.25162991881370544, + 13.409579277038574, + 3.3177073001861572, + 2.5264971256256104, + 0.631689190864563, + -0.2489928901195526, + 105.84652709960938 + ], + [ + 0.2764410376548767, + -0.5664715766906738, + -0.22968539595603943, + -0.572463870048523, + -0.6430850028991699, + 0.0533578097820282, + 0.785500168800354, + 0.00045881280675530434, + 33.81791687011719, + 2.6530468463897705, + -68.8091812133789, + 0.40473902225494385, + -5.343265533447266, + 16.448652267456055, + 5.755948543548584, + 8.034867286682129, + 1.9738346338272095, + 0.8543528914451599, + 193.16583251953125 + ], + [ + 0.19928956031799316, + -0.7926640510559082, + -0.33886241912841797, + -0.6365681886672974, + -1.6411441564559937, + -0.41482436656951904, + 0.953245222568512, + 0.0018760856473818421, + 48.95395278930664, + 6.103858470916748, + -5.4297051429748535, + 0.1609586477279663, + 0.6505838632583618, + 23.07547950744629, + 5.43159818649292, + 4.431673526763916, + 0.35956060886383057, + 0.3377896845340729, + 203.73019409179688 + ], + [ + 0.12561261653900146, + -0.31200775504112244, + -0.12821342051029205, + -0.9878201484680176, + -1.5346041917800903, + -0.7124462723731995, + 1.3390915393829346, + 0.0067122639156877995, + 68.63040924072266, + 8.366534233093262, + 181.4793243408203, + -0.048752136528491974, + 5.048268795013428, + 87.0127944946289, + 3.649786949157715, + -1.8663026094436646, + -1.0483384132385254, + 0.7698644399642944, + 246.24838256835938 + ], + [ + 0.14318406581878662, + -0.16817134618759155, + 0.044656164944171906, + -1.000720500946045, + -1.4363611936569214, + -0.39889147877693176, + 1.3321622610092163, + 0.006973070092499256, + 69.49068450927734, + 6.908123016357422, + 178.58457946777344, + 0.028811536729335785, + 6.33791971206665, + 78.09114837646484, + 2.4604194164276123, + -5.162672996520996, + -1.9589805603027344, + 1.2794933319091797, + 250.82594299316406 + ], + [ + 0.25990957021713257, + -0.45059436559677124, + 0.06157448887825012, + -0.7794139385223389, + 0.6918620467185974, + 0.44951292872428894, + 1.0499746799468994, + 0.005841830279678106, + 56.292964935302734, + 5.9671502113342285, + 66.78968811035156, + 0.03751257807016373, + 8.603753089904785, + 47.94328689575195, + 3.6040074825286865, + 1.6773055791854858, + -2.9190239906311035, + -1.7982277870178223, + 209.1162109375 + ], + [ + 0.15738365054130554, + -0.1990543156862259, + -0.21096879243850708, + -0.7437237501144409, + 0.5962345600128174, + 0.12838692963123322, + 0.9325858354568481, + 0.00018758232181426138, + 41.38226318359375, + 1.345165729522705, + -2.0313286781311035, + -0.07635390013456345, + 5.108170986175537, + 47.13261795043945, + 3.0720739364624023, + 3.1783692836761475, + -3.6837525367736816, + 0.8788055777549744, + 142.00624084472656 + ], + [ + 0.17235073447227478, + 0.01019226387143135, + -0.35296082496643066, + -0.6621893048286438, + 0.5560445189476013, + 0.11236726492643356, + 0.7399334907531738, + 0.0004884038353338838, + 41.968544006347656, + 0.2141100913286209, + -38.599220275878906, + -0.06284061074256897, + 5.414779186248779, + 39.87111282348633, + 3.059467315673828, + 2.390272378921509, + -3.2591283321380615, + -3.486874580383301, + 138.43185424804688 + ], + [ + 0.23794770240783691, + -0.4900645613670349, + -0.011707608588039875, + -0.6704952716827393, + 0.5372632741928101, + 0.051002152264118195, + 0.7467884421348572, + 0.0004856945888604969, + 40.592533111572266, + 2.753553867340088, + -42.574153900146484, + -0.07540760189294815, + 3.0798721313476562, + 20.167428970336914, + 3.7870593070983887, + 4.918464660644531, + -0.7026727199554443, + 1.1029096841812134, + 51.432491302490234 + ], + [ + 0.2759004533290863, + -0.5924070477485657, + 0.020931249484419823, + -0.5460458993911743, + 0.6820108890533447, + 0.09886196255683899, + 0.7167019248008728, + 0.0005002596299163997, + 21.094329833984375, + 2.4871826171875, + -60.72250747680664, + -0.03376798704266548, + 1.3835946321487427, + 10.921226501464844, + 1.651340365409851, + 1.753352403640747, + -1.0688366889953613, + 0.4954444169998169, + -39.085052490234375 + ], + [ + 0.2188735157251358, + -0.3142482340335846, + -0.014533264562487602, + -0.5839090347290039, + 0.518755316734314, + 0.000005135694664204493, + 0.6131640672683716, + 0.0006211507134139538, + 20.23552703857422, + 2.1691536903381348, + -94.65522003173828, + 0.03900580108165741, + 3.6193885803222656, + 2.670538902282715, + 1.6299409866333008, + 1.5473499298095703, + -0.8562081456184387, + 0.4622454047203064, + -39.50715255737305 + ], + [ + 0.198481485247612, + -0.07439839094877243, + 0.06274367868900299, + -0.5037127137184143, + 0.5450150966644287, + 0.04884336516261101, + 1.023443341255188, + 0.0030024913139641285, + 16.98451042175293, + 1.5871094465255737, + -81.69155883789062, + 0.050032585859298706, + 2.0760021209716797, + 5.364504337310791, + 1.3132153749465942, + 1.8380100727081299, + -1.8052141666412354, + 0.11141256988048553, + -87.30631256103516 + ], + [ + 0.2194717824459076, + -0.11921803653240204, + 0.019222011789679527, + -0.47156256437301636, + 0.5185927748680115, + 0.005403690971434116, + 1.1428186893463135, + 0.0012586560333147645, + 16.242998123168945, + 1.5087487697601318, + -79.564453125, + 0.027658730745315552, + 0.8004121780395508, + 7.296459674835205, + 1.0413297414779663, + 1.63692045211792, + -2.1477887630462646, + 0.16242094337940216, + -102.68614196777344 + ], + [ + 0.24611498415470123, + -0.05045967549085617, + 0.09174752235412598, + -0.46277180314064026, + 0.5304945111274719, + -0.012623950839042664, + 1.2979978322982788, + 0.000569057185202837, + 15.881168365478516, + 1.5359578132629395, + -79.95002746582031, + -0.00878177210688591, + 0.9832655191421509, + 8.446954727172852, + 0.997465968132019, + 1.639317512512207, + -1.9241515398025513, + 0.2967201769351959, + -105.7148666381836 + ], + [ + 0.23592261970043182, + -0.056163568049669266, + 0.04964485019445419, + -0.4659730792045593, + -0.7095680236816406, + 0.048651017248630524, + 1.2980189323425293, + 0.0007347611244767904, + 16.73440933227539, + 1.762690544128418, + -70.92251586914062, + -0.032373104244470596, + 1.05104398727417, + 10.196749687194824, + 1.0973315238952637, + 1.7885221242904663, + -2.9193472862243652, + 0.2187758833169937, + -115.69583129882812 + ], + [ + 0.15151800215244293, + -0.09102077037096024, + 0.014796901494264603, + -0.4803575873374939, + -0.7396679520606995, + -0.0007302318117581308, + 1.1593388319015503, + 0.0025926027446985245, + 20.630054473876953, + 1.8797599077224731, + -52.01689910888672, + -0.03619256988167763, + 1.1444971561431885, + 15.103338241577148, + 1.2100002765655518, + 1.3989856243133545, + -3.14176082611084, + 0.16095776855945587, + -110.93091583251953 + ], + [ + 0.3331563174724579, + -0.5375060439109802, + 0.07809200137853622, + -0.5034290552139282, + 1.7812379598617554, + 0.2593395709991455, + 1.1528451442718506, + 0.0026077369693666697, + 27.796009063720703, + 6.520780563354492, + 10.290216445922852, + -0.047430116683244705, + 1.8525245189666748, + 26.498050689697266, + 2.599048137664795, + 2.684617519378662, + -1.538456916809082, + 0.2234235405921936, + -85.03682708740234 + ], + [ + 0.6148445010185242, + -0.5458109974861145, + 0.07436816394329071, + -0.5558772683143616, + -1.6022089719772339, + -1.8660619258880615, + 1.4260317087173462, + 0.0005109156481921673, + 55.66039276123047, + 10.748068809509277, + 133.65122985839844, + -0.20039774477481842, + 2.7093417644500732, + 47.711605072021484, + 4.897413730621338, + 7.3790411949157715, + -3.70729398727417, + -0.4770473539829254, + 20.235145568847656 + ], + [ + 1.219691514968872, + -3.930114984512329, + -0.05820227786898613, + -0.7105394601821899, + 1.1356737613677979, + 0.3353612422943115, + 2.251840114593506, + 0.00047251631622202694, + 85.90479278564453, + 6.80287504196167, + 229.81942749023438, + -0.07705919444561005, + 2.6597917079925537, + 64.78392791748047, + -2.5225374698638916, + 1.3843309879302979, + 1.1906018257141113, + -0.05136825144290924, + 86.52433013916016 + ], + [ + 0.20475554466247559, + -0.21365594863891602, + -0.00399854127317667, + -0.5768263339996338, + 0.4638493061065674, + -0.025749268010258675, + 1.2562960386276245, + 0.00046094285789877176, + 65.2007827758789, + 3.486802816390991, + 11.989641189575195, + -0.14037208259105682, + 1.885317325592041, + 18.04607582092285, + 2.0254745483398438, + 2.0944604873657227, + -0.48780372738838196, + 0.42370009422302246, + 81.5890884399414 + ], + [ + 0.10137239098548889, + -0.37388700246810913, + -0.020501015707850456, + -0.6074191927909851, + 0.4287753403186798, + 0.115017831325531, + 0.7555304169654846, + 0.00048564354074187577, + 29.506513595581055, + 2.9056577682495117, + -94.57997131347656, + 0.03204174339771271, + 3.9000699520111084, + 19.290468215942383, + 1.8547735214233398, + 1.6670939922332764, + 0.32219696044921875, + -0.3370084762573242, + 123.68209075927734 + ], + [ + 0.18710395693778992, + -0.19680142402648926, + -0.32244470715522766, + -0.5688077807426453, + 0.4720882475376129, + 0.0397401861846447, + 0.7683758735656738, + 0.0005462547997012734, + 31.28867530822754, + 3.731929063796997, + -90.71562957763672, + -0.03494120389223099, + 0.08460897952318192, + 17.6873836517334, + 3.125368118286133, + 3.4693655967712402, + 2.5074703693389893, + 2.282147169113159, + 160.0921173095703 + ], + [ + 0.1529584527015686, + -0.0030397260561585426, + -0.1533682495355606, + -0.709664523601532, + 0.893938422203064, + 0.5760723352432251, + 0.8047239184379578, + 0.0004966786364093423, + 36.98611068725586, + 3.146008014678955, + -71.38362121582031, + 0.018817907199263573, + 3.2452728748321533, + 19.201480865478516, + 2.6668121814727783, + 1.8272329568862915, + 3.000004291534424, + 0.04630224406719208, + 150.34600830078125 + ], + [ + 0.12564659118652344, + -0.10856067389249802, + -0.13760994374752045, + -0.6819873452186584, + 0.985526442527771, + 0.5328243970870972, + 0.8184333443641663, + 0.0004991660825908184, + 36.06460952758789, + 2.3818607330322266, + -67.15582275390625, + 0.06724181771278381, + 4.003010272979736, + 20.30370330810547, + 1.7372372150421143, + 0.7887271046638489, + 3.711036205291748, + -0.16165831685066223, + 140.82354736328125 + ], + [ + 0.2156868875026703, + -0.21970093250274658, + -0.17157238721847534, + -0.582151472568512, + 0.7571473121643066, + 0.34388917684555054, + 0.8021156191825867, + 0.0004671056231018156, + 35.37557601928711, + 3.965250015258789, + -80.08492279052734, + -0.020001837983727455, + -0.5407283902168274, + 18.760866165161133, + 2.503405809402466, + 1.832324504852295, + 2.6140968799591064, + -0.19020792841911316, + 150.99533081054688 + ], + [ + 0.1412637084722519, + -0.30071574449539185, + -0.022506190463900566, + -0.5232022404670715, + 0.5742732882499695, + 0.07827191799879074, + 0.8163344860076904, + 0.0004601764085236937, + 40.39252471923828, + 3.7928383350372314, + -66.60188293457031, + -0.05314407870173454, + 1.8710877895355225, + 12.72307300567627, + 2.8527181148529053, + 2.524333953857422, + 2.7482614517211914, + 0.30411258339881897, + 106.4751968383789 + ], + [ + 0.21904438734054565, + -0.9796338081359863, + -0.20808185636997223, + -0.6725241541862488, + 0.76905757188797, + 0.1507904976606369, + 0.9582247138023376, + 0.0018147160299122334, + 51.486236572265625, + 8.145078659057617, + 2.00826358795166, + -0.02299480140209198, + 1.78370201587677, + 28.655366897583008, + 3.6398465633392334, + 3.2651970386505127, + 3.6815109252929688, + 0.6304918527603149, + 186.10191345214844 + ], + [ + 0.14291352033615112, + -0.4092702567577362, + -0.016462016850709915, + -1.0074352025985718, + 0.7507007122039795, + 0.0233329888433218, + 1.2622381448745728, + 0.00662043783813715, + 76.708984375, + 9.956892013549805, + 188.7099609375, + -0.10155251622200012, + 3.933154344558716, + 78.10543823242188, + 4.067844390869141, + -2.402595281600952, + 6.157655715942383, + 0.5734622478485107, + 253.45640563964844 + ], + [ + 0.020308295264840126, + -0.12989488244056702, + 0.012950842268764973, + -1.0508146286010742, + -1.8382384777069092, + -0.18744176626205444, + 1.3021883964538574, + 0.007097089663147926, + 64.22801971435547, + 5.043331623077393, + 185.12010192871094, + -0.11849214881658554, + 5.452884197235107, + 99.28350067138672, + 6.566226959228516, + 2.2203423976898193, + 3.2472586631774902, + -0.5647582411766052, + 199.72872924804688 + ], + [ + 0.3228916525840759, + -0.3939247727394104, + -0.07691303640604019, + -0.835760772228241, + 0.7163823246955872, + 0.5999462008476257, + 1.0237541198730469, + 0.005271204747259617, + 60.66386795043945, + 6.487387657165527, + 80.66358947753906, + -0.23649781942367554, + 6.688722610473633, + 65.82988739013672, + 4.051763534545898, + 1.3767602443695068, + 1.2283387184143066, + -1.5445997714996338, + 189.17742919921875 + ], + [ + 0.22933758795261383, + -0.5853457450866699, + -0.40808942914009094, + -0.7420495748519897, + 0.5262842774391174, + 0.12272506207227707, + 0.8630633354187012, + 0.0002305197558598593, + 45.97563552856445, + 1.6473886966705322, + 0.2738247513771057, + -0.25354090332984924, + 5.018074989318848, + 49.321250915527344, + 4.49329948425293, + 3.769881010055542, + 0.5061792135238647, + 2.4303884506225586, + 171.16476440429688 + ], + [ + 0.10595784336328506, + -0.3034239709377289, + 0.004209194332361221, + -0.5913828015327454, + -0.6290345191955566, + -0.1300378441810608, + 0.795529842376709, + 0.0004703139129560441, + 38.556922912597656, + 2.611149787902832, + -29.965702056884766, + -0.2867933511734009, + 3.7744107246398926, + 19.35792350769043, + 4.308314323425293, + 5.401734352111816, + -1.5967721939086914, + 1.1559562683105469, + 80.67886352539062 + ], + [ + 0.18422643840312958, + -0.61520916223526, + 0.00014860428927931935, + -0.5726089477539062, + -0.8390034437179565, + -0.28560081124305725, + 0.7249773144721985, + 0.00046326289884746075, + 36.372188568115234, + 2.6457676887512207, + -49.63511276245117, + -0.1284542679786682, + 2.8439812660217285, + 17.921478271484375, + 4.430426597595215, + 5.805295467376709, + -0.828450620174408, + -0.8559787273406982, + 57.3697624206543 + ], + [ + 0.3403075337409973, + -0.49216631054878235, + 0.03154202178120613, + -0.5617940425872803, + 0.6211637854576111, + 0.0806439071893692, + 0.7029438614845276, + 0.0005348918493837118, + 21.42361831665039, + 2.2635087966918945, + -63.300052642822266, + -0.04405362904071808, + 5.08213472366333, + 11.197439193725586, + 1.9858449697494507, + 2.1883108615875244, + -1.1526974439620972, + 1.0649752616882324, + -30.624439239501953 + ], + [ + 0.25372663140296936, + -0.320645272731781, + -0.07507364451885223, + -0.5897619724273682, + 0.5589356422424316, + 0.04340376704931259, + 0.5946183800697327, + 0.0006588282412849367, + 20.094369888305664, + 1.8859014511108398, + -93.14723205566406, + 0.04088236391544342, + 4.745431900024414, + 3.4518299102783203, + 2.009272336959839, + 2.3444361686706543, + 0.32627999782562256, + -0.770842432975769, + -38.7278938293457 + ], + [ + 0.21943247318267822, + -0.12726733088493347, + 0.037228118628263474, + -0.534363865852356, + 0.5164883732795715, + 0.03384561836719513, + 0.8946473002433777, + 0.002717023016884923, + 17.320478439331055, + 1.5989444255828857, + -83.35277557373047, + 0.04878876730799675, + 2.4009861946105957, + 5.762009620666504, + 1.32908034324646, + 1.8349647521972656, + -0.21863609552383423, + -0.023395920172333717, + -84.03746795654297 + ], + [ + 0.20040203630924225, + -0.11559498310089111, + 0.06417270004749298, + -0.5235376954078674, + 0.4606982469558716, + -0.03526902571320534, + 0.9255168437957764, + 0.0023979234974831343, + 16.93575096130371, + 1.9022513628005981, + -88.30435943603516, + 0.0501277782022953, + 0.9381177425384521, + 5.077188014984131, + 1.1604444980621338, + 1.5118155479431152, + -1.317555546760559, + 0.08588874340057373, + -85.24915313720703 + ], + [ + 0.18269747495651245, + -0.07605229318141937, + 0.07173091173171997, + -0.4844357669353485, + -0.5732073783874512, + 0.007844681851565838, + 1.12010657787323, + 0.0014891471946612, + 16.58222198486328, + 1.64606511592865, + -83.35057067871094, + -0.01078686024993658, + 0.7091659903526306, + 8.082894325256348, + 1.1329712867736816, + 1.1000499725341797, + -1.6158696413040161, + -0.04177570715546608, + -96.3712387084961 + ], + [ + 0.1609257012605667, + -0.05698171257972717, + 0.04584861919283867, + -0.43657249212265015, + -0.9378309845924377, + -0.03391912952065468, + -4.230218887329102, + 0.0004189460596535355, + 16.555925369262695, + 1.4549293518066406, + -62.00870895385742, + -0.03154341131448746, + 0.8709114193916321, + 9.55553913116455, + 0.9311321973800659, + 1.621904730796814, + -2.1065187454223633, + -0.09628447890281677, + -117.97828674316406 + ], + [ + 0.08872067928314209, + -0.08316853642463684, + 0.0016095149330794811, + -0.45677241683006287, + -0.7193160057067871, + -0.004891686141490936, + -4.217394828796387, + 0.0008948497707024217, + 19.923673629760742, + 1.6255260705947876, + -43.96807098388672, + -0.023817621171474457, + 0.6935403347015381, + 14.397486686706543, + 1.1161388158798218, + 1.7200865745544434, + -2.053905487060547, + -0.18823200464248657, + -113.9238052368164 + ], + [ + 0.0777093768119812, + 0.013259045779705048, + 0.03686278313398361, + -0.5079013109207153, + -2.0132761001586914, + 0.0010254626395180821, + -6.094466209411621, + 0.000774412474129349, + 20.7618408203125, + 3.0023746490478516, + 0.21572139859199524, + -0.04260637238621712, + -0.36693641543388367, + 19.99711799621582, + 1.3040275573730469, + 1.5885565280914307, + -3.245990514755249, + -1.6222633123397827, + -111.28253173828125 + ], + [ + 1.3190847635269165, + -0.5746856927871704, + 0.17855508625507355, + -0.4402800500392914, + -0.9835253357887268, + -0.10344929993152618, + -23.086894989013672, + 0.0010899447370320559, + 33.84690856933594, + 6.115768909454346, + 89.60429382324219, + -0.07197070121765137, + 7.1410698890686035, + 31.115278244018555, + -0.05915360897779465, + 0.12214836478233337, + -7.519678592681885, + 0.6514346599578857, + -114.10769653320312 + ], + [ + 1.2231159210205078, + -0.9607287645339966, + 0.11360731720924377, + -0.8973789811134338, + -3.622178554534912, + -0.04175031557679176, + -31.327651977539062, + 0.00081804976798594, + 55.58741760253906, + 7.034365653991699, + 180.90435791015625, + -0.1258937418460846, + 5.686140060424805, + 43.01454544067383, + -2.399845838546753, + -6.53320837020874, + -8.385109901428223, + -0.6005556583404541, + -81.34176635742188 + ], + [ + 0.1511291116476059, + -0.14357897639274597, + -0.040454570204019547, + -0.6771087646484375, + -0.9349943995475769, + -0.18844249844551086, + 1.8697611093521118, + 0.0005906057194806635, + 48.79141616821289, + 3.4771835803985596, + 64.20134735107422, + -0.07858435064554214, + 1.188006043434143, + 29.33063316345215, + 2.216262102127075, + 2.483311891555786, + -2.1261587142944336, + 1.5241737365722656, + -3.6361958980560303 + ], + [ + 0.08736417442560196, + -0.08311426639556885, + -0.01806890033185482, + -0.624649703502655, + 0.6050037741661072, + -0.02681633271276951, + 1.0923813581466675, + 0.0006138867465779185, + 32.609310150146484, + 1.8777395486831665, + -67.16415405273438, + -0.06076953560113907, + 1.5194796323776245, + 12.951915740966797, + 3.7513234615325928, + 1.5240014791488647, + -8.173264503479004, + 0.45639482140541077, + 18.55360984802246 + ], + [ + 0.04419853538274765, + -0.4252106249332428, + -0.06638911366462708, + -0.5873331427574158, + -0.6901756525039673, + 0.05158567801117897, + -3.1602203845977783, + 0.00033470726339146495, + 27.93245506286621, + 2.6492807865142822, + -81.19194030761719, + 0.005892109125852585, + 2.6808066368103027, + 19.46100425720215, + 1.354649305343628, + 2.2994210720062256, + -3.287984609603882, + -0.13685253262519836, + 129.00477600097656 + ], + [ + 0.11973437666893005, + -0.10793077945709229, + -0.10786595940589905, + -0.6045520305633545, + -1.2147974967956543, + -0.9284350872039795, + 0.7844049334526062, + 0.00048030438483692706, + 32.625423431396484, + 2.515143632888794, + -56.58749771118164, + 0.0021387909073382616, + 4.255259990692139, + 19.609878540039062, + 2.299473524093628, + 2.23740553855896, + -1.2034484148025513, + 0.1916126310825348, + 136.5943603515625 + ], + [ + 0.1082364097237587, + -0.21223677694797516, + -0.05490153655409813, + -0.545283854007721, + -1.429426908493042, + -0.3627423346042633, + 0.8043985962867737, + 0.0004843123606406152, + 34.36043167114258, + 2.9854509830474854, + -57.13039016723633, + -0.08268441259860992, + 3.9013848304748535, + 18.15716552734375, + 3.1370790004730225, + 2.550403594970703, + -0.14497748017311096, + 0.07626056671142578, + 119.68839263916016 + ], + [ + 0.12623703479766846, + -0.09981473535299301, + -0.022092686966061592, + -0.6123619675636292, + 0.6960574984550476, + 0.17629790306091309, + 0.7644410729408264, + 0.0004500673967413604, + 31.243064880371094, + 2.7847800254821777, + -71.42472076416016, + 0.029871594160795212, + 1.6017038822174072, + 18.788877487182617, + 1.5603853464126587, + 2.075836181640625, + -0.5787506103515625, + -0.8384397029876709, + 123.85447692871094 + ], + [ + 0.30559927225112915, + -0.6843422055244446, + -0.5509061217308044, + -0.5843949317932129, + 0.49212977290153503, + 0.05200646445155144, + 0.7462283372879028, + 0.0004433387366589159, + 36.03656768798828, + 1.8012105226516724, + -52.44881057739258, + 0.08841561526060104, + 4.25314474105835, + 18.274324417114258, + 6.6279802322387695, + 9.095296859741211, + 1.1217288970947266, + -1.7296305894851685, + 186.48130798339844 + ], + [ + 0.19026543200016022, + -0.9811125993728638, + -0.24197007715702057, + -0.6790480017662048, + 0.826160728931427, + 0.1361076533794403, + 0.9567856788635254, + 0.0017447572899982333, + 44.38533020019531, + 6.729168891906738, + 8.35029125213623, + -0.008922005072236061, + -0.3479408025741577, + 27.414697647094727, + 4.110133647918701, + 3.7592267990112305, + -2.021366596221924, + -0.2974810302257538, + 183.8362274169922 + ], + [ + 0.11138199269771576, + -0.21216361224651337, + -0.07062851637601852, + -1.0341061353683472, + 0.7042338252067566, + -0.03752940893173218, + 1.26123046875, + 0.006767518352717161, + 65.3997802734375, + 5.077115058898926, + 168.5412139892578, + -0.07065502554178238, + -21.741933822631836, + 66.58692932128906, + 3.9180402755737305, + -2.6938364505767822, + -0.8006421327590942, + 0.15820886194705963, + 232.139892578125 + ], + [ + 0.11156803369522095, + -0.14972706139087677, + -0.03701518103480339, + -1.0750479698181152, + 0.7851226925849915, + 0.05880920961499214, + 1.2723593711853027, + 0.006968651432543993, + 71.91404724121094, + 5.302643775939941, + 160.10682678222656, + -0.32071197032928467, + -27.322114944458008, + 81.18883514404297, + 3.3621318340301514, + -2.1586947441101074, + -3.7938132286071777, + -0.14915278553962708, + 197.42027282714844 + ], + [ + 0.204599067568779, + -0.2461235225200653, + -0.21333153545856476, + -0.7938452959060669, + 0.4815913140773773, + 0.1256493330001831, + 1.0464138984680176, + 0.00518224760890007, + 49.97133255004883, + 4.894437789916992, + 53.68952941894531, + -0.19911928474903107, + -23.529586791992188, + 55.32871627807617, + 3.3635354042053223, + 1.538684368133545, + -2.1115994453430176, + -0.26926857233047485, + 174.94149780273438 + ], + [ + 0.284850537776947, + -0.7224855422973633, + -0.10599470883607864, + -0.7012123465538025, + 0.6031214594841003, + 0.1194339394569397, + 1.062707781791687, + 0.0002201393072027713, + 47.41392517089844, + 3.0333330631256104, + 15.15195083618164, + -0.16700708866119385, + -11.840907096862793, + 22.97865104675293, + 4.272884368896484, + 3.205537796020508, + 1.213819980621338, + 0.24470829963684082, + 102.32076263427734 + ], + [ + 0.08558260649442673, + -0.26781657338142395, + -0.03651169314980507, + -0.6109598875045776, + 0.4114564061164856, + 0.024791114032268524, + 0.7712389230728149, + 0.00045804245746694505, + 41.705875396728516, + 2.4311540126800537, + -35.981204986572266, + -0.18467994034290314, + -3.1382734775543213, + 16.870887756347656, + 4.5229268074035645, + 4.405489921569824, + -2.3479084968566895, + 0.03791113942861557, + 82.2328872680664 + ], + [ + 0.18889480829238892, + -0.7775468826293945, + -0.034241363406181335, + -0.4900377690792084, + 0.4668247401714325, + 0.03599352017045021, + 0.6572790741920471, + 0.0004563787078950554, + 38.646183013916016, + 2.2688169479370117, + -59.59256362915039, + -0.18536728620529175, + 0.9315031170845032, + 13.838233947753906, + 4.0595269203186035, + 5.059770107269287, + -1.8184020519256592, + 0.10285140573978424, + 80.02012634277344 + ], + [ + 0.11466164141893387, + -0.16193976998329163, + -0.050843071192502975, + -0.5839547514915466, + 0.4238177239894867, + 0.0644395723938942, + 0.6787403225898743, + 0.0004557965148705989, + 29.917152404785156, + 1.2996795177459717, + -81.47754669189453, + -0.07345428317785263, + 2.0325613021850586, + 13.935806274414062, + 0.7567772269248962, + 1.9554189443588257, + -1.8155736923217773, + -0.9485164284706116, + 40.475616455078125 + ], + [ + -0.3174290060997009, + 0.3310340642929077, + -0.12958554923534393, + -1.3448700904846191, + 0.5881621837615967, + -0.004714091308414936, + 0.5277523994445801, + 0.001710362615995109, + 25.41599464416504, + 1.3539729118347168, + -50.08005142211914, + -0.3727305829524994, + 3.743600845336914, + -26.54120445251465, + -1.3080363273620605, + 1.7957813739776611, + -2.2712464332580566, + 0.7923770546913147, + 41.63277816772461 + ], + [ + -0.19238382577896118, + 0.16576017439365387, + -0.06331092119216919, + -0.877108633518219, + 0.5804239511489868, + 0.02127970941364765, + 0.5031863451004028, + 0.002146092476323247, + 22.907079696655273, + 2.157161235809326, + -53.333221435546875, + -0.15660357475280762, + 4.341437339782715, + -30.90949821472168, + -1.8963706493377686, + 0.18700070679187775, + -1.8457233905792236, + 0.1540101170539856, + 31.643033981323242 + ], + [ + 0.04668380692601204, + 0.046534158289432526, + 0.20892439782619476, + -0.6090874671936035, + -0.5739677548408508, + 0.020424511283636093, + -2.284179449081421, + 0.0005521719576790929, + 15.208908081054688, + 0.8874129056930542, + -55.6029167175293, + 0.15441690385341644, + 1.6044375896453857, + -19.737382888793945, + 0.18790587782859802, + 0.5347346067428589, + -1.110144853591919, + -0.07951051741838455, + -30.715444564819336 + ], + [ + 0.0704040378332138, + 0.00306660495698452, + 0.005788542330265045, + -0.5281633138656616, + -0.3896014392375946, + -0.051410697400569916, + -2.4512624740600586, + 0.0005640322342514992, + 14.02071762084961, + 0.9111858606338501, + -42.93519592285156, + 0.022168485447764397, + 1.2551944255828857, + -14.146629333496094, + 0.7183982133865356, + 1.0827301740646362, + -1.948799967765808, + 0.03619908541440964, + -95.28205108642578 + ], + [ + 0.07861907035112381, + -0.041344404220581055, + -0.00439880695194006, + -0.5452210307121277, + 0.32789313793182373, + -0.01280132308602333, + 0.6400336027145386, + 0.0008225631900131702, + 14.963103294372559, + 1.159946084022522, + -51.35942840576172, + -0.10364393144845963, + 1.2107940912246704, + -22.75741958618164, + 0.4763311743736267, + 0.853819727897644, + -1.950206995010376, + 0.16697914898395538, + -95.26329803466797 + ], + [ + 0.13270977139472961, + -0.01503751054406166, + 0.03497190773487091, + -0.5262167453765869, + 0.37883010506629944, + 0.0026681271847337484, + 0.6798986196517944, + 0.0008393845055252314, + 14.390527725219727, + 1.1559127569198608, + -34.342041015625, + -0.2232520431280136, + 0.9509322047233582, + -32.627685546875, + 0.7535831928253174, + 1.1008868217468262, + -2.6093475818634033, + 0.02177518419921398, + -103.45665740966797 + ], + [ + 0.15651755034923553, + -0.15258224308490753, + 0.03707513585686684, + -0.5549656748771667, + -0.8716737031936646, + -0.17876099050045013, + 0.5893511772155762, + 0.0012780610704794526, + 16.52436065673828, + 1.6463030576705933, + -15.422141075134277, + -0.3689005374908447, + 1.9884896278381348, + -55.493408203125, + 0.8239267468452454, + 0.7360613942146301, + -2.750591278076172, + -0.06881178915500641, + -82.84323120117188 + ], + [ + 0.4447348117828369, + -0.4231981933116913, + -0.02228293940424919, + -0.7803685665130615, + 0.7693158984184265, + 0.3406188488006592, + 1.031157374382019, + 0.0005409898003563285, + 26.59900665283203, + 4.324277877807617, + 44.66126251220703, + -0.6762575507164001, + 4.063052177429199, + -120.94087219238281, + 2.1688156127929688, + 2.7925262451171875, + -2.3223366737365723, + 0.47057315707206726, + -57.06726837158203 + ], + [ + 0.3455011546611786, + -0.34853312373161316, + -0.07679200172424316, + -0.7773706316947937, + 0.8298165798187256, + 0.1192348450422287, + 1.2219772338867188, + 0.0004078227502759546, + 40.303794860839844, + 3.6706557273864746, + 87.4390869140625, + -0.5022661089897156, + 5.4427337646484375, + -179.41114807128906, + -2.2335124015808105, + 0.38430309295654297, + -3.290996789932251, + 0.5145955681800842, + 37.80179977416992 + ], + [ + -0.9017656445503235, + 0.4451572299003601, + 0.06388839334249496, + -0.7944748997688293, + 0.6035032272338867, + -0.0905015766620636, + 0.7729612588882446, + 0.00041011886787600815, + 37.274715423583984, + 1.159719467163086, + 14.937543869018555, + -2.050440788269043, + 3.1982452869415283, + -70.25680541992188, + -1.3633711338043213, + 0.7603104114532471, + -5.101544380187988, + -0.42048677802085876, + 83.18323516845703 + ], + [ + 0.11393378674983978, + 0.11304812133312225, + -0.16461777687072754, + -0.7269461154937744, + 0.16770629584789276, + -0.1017497181892395, + 0.5087674260139465, + 0.0004202720010653138, + 27.24408531188965, + 1.5593397617340088, + -28.239973068237305, + 0.4899006187915802, + 1.0886896848678589, + -24.55528450012207, + 2.7483482360839844, + 2.03686785697937, + -0.42894095182418823, + 1.3455692529678345, + 204.861572265625 + ], + [ + 0.03289812058210373, + 0.00438904482871294, + -0.02268366888165474, + -0.6151777505874634, + 0.26423653960227966, + -0.05472677946090698, + 0.5688372254371643, + 0.00039869867032393813, + 40.12403869628906, + 6.724072456359863, + -3.9013240337371826, + 0.13893280923366547, + 0.9798011779785156, + -21.420793533325195, + -1.6129995584487915, + -4.774735450744629, + -2.7931156158447266, + 1.4105048179626465, + 319.2957458496094 + ], + [ + -0.03983254358172417, + -0.03532906994223595, + -0.022279951721429825, + -0.627357006072998, + 0.4631103277206421, + -0.015223309397697449, + 0.5658614635467529, + 0.00040272370097227395, + 35.80498123168945, + 20.436368942260742, + 4.8773040771484375, + -0.02710779756307602, + 2.5953235626220703, + -20.015819549560547, + -0.4222872853279114, + -6.170653820037842, + -1.3667196035385132, + -0.08611901849508286, + 363.1136779785156 + ], + [ + -0.029909580945968628, + -0.054200202226638794, + -0.015400067903101444, + -0.6077865958213806, + 0.45533764362335205, + 0.003094450104981661, + 0.5511691570281982, + 0.00041140950634144247, + 32.99904251098633, + 26.067794799804688, + 5.580532550811768, + -0.01208861917257309, + 2.7792036533355713, + -19.195932388305664, + -3.357377052307129, + -8.327322006225586, + 1.2978521585464478, + 0.4992067217826843, + 374.6746826171875 + ], + [ + 0.002795484848320484, + -0.0554082915186882, + -0.033671021461486816, + -0.6234163641929626, + 0.560994029045105, + 0.020386941730976105, + 0.5377357006072998, + 0.00039178752922452986, + 32.3141975402832, + 23.293106079101562, + 1.1144087314605713, + 0.2542417645454407, + 2.357220411300659, + -18.85422134399414, + -0.9144224524497986, + -15.955507278442383, + 1.5044362545013428, + -0.023106178268790245, + 381.828125 + ], + [ + 0.0010237160604447126, + -0.06102044880390167, + -0.034895896911621094, + -0.625860869884491, + 0.5427557229995728, + 0.013131984509527683, + 0.5326250195503235, + 0.0003884797915816307, + 32.58828353881836, + 24.576950073242188, + 1.2001595497131348, + 0.25430577993392944, + 2.411581516265869, + -19.075937271118164, + -1.6931570768356323, + -12.839770317077637, + 3.3814566135406494, + -0.1815534234046936, + 378.95782470703125 + ] + ] + } + ], + "layout": { + "coloraxis": { + "colorscale": [ + [ + 0, + "rgb(0,0,255)" + ], + [ + 1, + "rgb(255,0,0)" + ] + ] + }, + "height": 700, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Sample Explanations" + }, + "xaxis": { + "anchor": "y", + "constrain": "domain", + "domain": [ + 0, + 1 + ], + "scaleanchor": "y" + }, + "yaxis": { + "anchor": "x", + "autorange": "reversed", + "constrain": "domain", + "domain": [ + 0, + 1 + ] + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "px.imshow(samples_explanations, height=700, color_continuous_scale='Bluered', title=\"Sample Explanations\")" + ] + } + ], + "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.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/indicators.ipynb b/notebooks/indicators.ipynb new file mode 100644 index 0000000..3425fb2 --- /dev/null +++ b/notebooks/indicators.ipynb @@ -0,0 +1,6741 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Compute Key-Performance Indicators (KPIs) from the MLflow server.**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# IMPORTS" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import mlflow\n", + "import pandas as pd\n", + "import plotly.express as px" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# OPTIONS" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "pd.options.display.max_columns = None" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# CONFIGS" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "MAX_RESULTS = 100\n", + "TRACKING_URI = \"http://localhost:5000\"\n", + "REGISTRY_URI = \"http://localhost:5000\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# CLIENTS" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "client = mlflow.tracking.MlflowClient(tracking_uri=TRACKING_URI, registry_uri=REGISTRY_URI)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# INDICATORS" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1, 7)\n" + ] + }, + { + "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", + "
artifact_locationcreation_timeexperiment_idlast_update_timelifecycle_stagenametags
0file:///home/fmind/mlops-python-package/mlruns...2024-07-21 15:02:02.2245984433353360956522024-07-21 15:02:02.224activebikes{}
\n", + "
" + ], + "text/plain": [ + " artifact_location creation_time \\\n", + "0 file:///home/fmind/mlops-python-package/mlruns... 2024-07-21 15:02:02.224 \n", + "\n", + " experiment_id last_update_time lifecycle_stage name tags \n", + "0 598443335336095652 2024-07-21 15:02:02.224 active bikes {} " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "experiments = client.search_experiments(\n", + " view_type=mlflow.entities.ViewType.ALL, max_results=MAX_RESULTS, order_by=[\"creation_time DESC\"]\n", + ")\n", + "experiments = [dict(experiment) for experiment in experiments]\n", + "experiments = pd.DataFrame(experiments).assign(\n", + " creation_time=lambda data: pd.to_datetime(data[\"creation_time\"], unit=\"ms\"),\n", + " last_update_time=lambda data: pd.to_datetime(data[\"last_update_time\"], unit=\"ms\"),\n", + ")\n", + "print(experiments.shape)\n", + "experiments.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(9, 29)\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \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", + "
artifact_uriend_timeexperiment_idlifecycle_stagerun_idrun_namerun_uuidstart_timestatususer_idmetricsparamstagsmlflow.usermlflow.source.namemlflow.source.typemlflow.project.entryPointmlflow.source.git.commitmlflow.source.git.repoURLmlflow.gitRepoURLmlflow.runNamemlflow.project.envmlflow.project.backendmlflow.datasetsestimator_nameestimator_classmlflow.log-model.historymlflow.autologgingmlflow.parentRunId
0file:///home/fmind/mlops-python-package/mlruns...2024-07-21 15:04:07.438598443335336095652active5936b0cb0d9b47b2a1862344a79e55e7Explanations5936b0cb0d9b47b2a1862344a79e55e72024-07-21 15:03:28.331FINISHEDfmind{}{'conf_file': 'confs/explanations.yaml'}{'mlflow.user': 'fmind', 'mlflow.source.name':...fmindfile:///home/fmind/mlops-python-packagePROJECTmainee17d0a9de59efd2eb99d667786ac417ec8b3b63git@github.com:fmind/mlops-python-packagegit@github.com:fmind/mlops-python-packageExplanationsvirtualenvlocalNaNNaNNaNNaNNaNNaN
1file:///home/fmind/mlops-python-package/mlruns...2024-07-21 15:03:25.782598443335336095652activeef5b224b3f4e4dbcb05169cfc4f358f7Evaluationsef5b224b3f4e4dbcb05169cfc4f358f72024-07-21 15:03:19.637FINISHEDfmind{'example_count': 13903.0, 'mean_absolute_erro...{'conf_file': 'confs/evaluations.yaml'}{'mlflow.user': 'fmind', 'mlflow.source.name':...fmindfile:///home/fmind/mlops-python-packagePROJECTmainee17d0a9de59efd2eb99d667786ac417ec8b3b63git@github.com:fmind/mlops-python-packagegit@github.com:fmind/mlops-python-packageEvaluationsvirtualenvlocal[{\"name\":\"ce0fe6e33c74e2fa3659d51482be5f27\",\"h...NaNNaNNaNNaNNaN
2file:///home/fmind/mlops-python-package/mlruns...2024-07-21 15:03:18.035598443335336095652active65f34c799e814cfe82d844b0eff6a16fInference65f34c799e814cfe82d844b0eff6a16f2024-07-21 15:03:13.853FINISHEDfmind{}{'conf_file': 'confs/inference.yaml'}{'mlflow.user': 'fmind', 'mlflow.source.name':...fmindfile:///home/fmind/mlops-python-packagePROJECTmainee17d0a9de59efd2eb99d667786ac417ec8b3b63git@github.com:fmind/mlops-python-packagegit@github.com:fmind/mlops-python-packageInferencevirtualenvlocalNaNNaNNaNNaNNaNNaN
3file:///home/fmind/mlops-python-package/mlruns...2024-07-21 15:03:12.321598443335336095652activea5dbcb3fc6a24fdc863fb31eb0fc4d7aPromotiona5dbcb3fc6a24fdc863fb31eb0fc4d7a2024-07-21 15:03:09.011FINISHEDfmind{}{'conf_file': 'confs/promotion.yaml'}{'mlflow.user': 'fmind', 'mlflow.source.name':...fmindfile:///home/fmind/mlops-python-packagePROJECTmainee17d0a9de59efd2eb99d667786ac417ec8b3b63git@github.com:fmind/mlops-python-packagegit@github.com:fmind/mlops-python-packagePromotionvirtualenvlocalNaNNaNNaNNaNNaNNaN
4file:///home/fmind/mlops-python-package/mlruns...2024-07-21 15:03:07.098598443335336095652active47302e957d8542198a281aad07b2413bTraining47302e957d8542198a281aad07b2413b2024-07-21 15:02:42.090FINISHEDfmind{'training_mean_squared_error': 124.5105461557...{'conf_file': 'confs/training.yaml', 'memory':...{'mlflow.user': 'fmind', 'mlflow.source.name':...fmindfile:///home/fmind/mlops-python-packagePROJECTmainee17d0a9de59efd2eb99d667786ac417ec8b3b63git@github.com:fmind/mlops-python-packagegit@github.com:fmind/mlops-python-packageTrainingvirtualenvlocalNaNPipelinesklearn.pipeline.Pipeline[{\"run_id\": \"47302e957d8542198a281aad07b2413b\"...NaNNaN
\n", + "
" + ], + "text/plain": [ + " artifact_uri end_time \\\n", + "0 file:///home/fmind/mlops-python-package/mlruns... 2024-07-21 15:04:07.438 \n", + "1 file:///home/fmind/mlops-python-package/mlruns... 2024-07-21 15:03:25.782 \n", + "2 file:///home/fmind/mlops-python-package/mlruns... 2024-07-21 15:03:18.035 \n", + "3 file:///home/fmind/mlops-python-package/mlruns... 2024-07-21 15:03:12.321 \n", + "4 file:///home/fmind/mlops-python-package/mlruns... 2024-07-21 15:03:07.098 \n", + "\n", + " experiment_id lifecycle_stage run_id \\\n", + "0 598443335336095652 active 5936b0cb0d9b47b2a1862344a79e55e7 \n", + "1 598443335336095652 active ef5b224b3f4e4dbcb05169cfc4f358f7 \n", + "2 598443335336095652 active 65f34c799e814cfe82d844b0eff6a16f \n", + "3 598443335336095652 active a5dbcb3fc6a24fdc863fb31eb0fc4d7a \n", + "4 598443335336095652 active 47302e957d8542198a281aad07b2413b \n", + "\n", + " run_name run_uuid start_time \\\n", + "0 Explanations 5936b0cb0d9b47b2a1862344a79e55e7 2024-07-21 15:03:28.331 \n", + "1 Evaluations ef5b224b3f4e4dbcb05169cfc4f358f7 2024-07-21 15:03:19.637 \n", + "2 Inference 65f34c799e814cfe82d844b0eff6a16f 2024-07-21 15:03:13.853 \n", + "3 Promotion a5dbcb3fc6a24fdc863fb31eb0fc4d7a 2024-07-21 15:03:09.011 \n", + "4 Training 47302e957d8542198a281aad07b2413b 2024-07-21 15:02:42.090 \n", + "\n", + " status user_id metrics \\\n", + "0 FINISHED fmind {} \n", + "1 FINISHED fmind {'example_count': 13903.0, 'mean_absolute_erro... \n", + "2 FINISHED fmind {} \n", + "3 FINISHED fmind {} \n", + "4 FINISHED fmind {'training_mean_squared_error': 124.5105461557... \n", + "\n", + " params \\\n", + "0 {'conf_file': 'confs/explanations.yaml'} \n", + "1 {'conf_file': 'confs/evaluations.yaml'} \n", + "2 {'conf_file': 'confs/inference.yaml'} \n", + "3 {'conf_file': 'confs/promotion.yaml'} \n", + "4 {'conf_file': 'confs/training.yaml', 'memory':... \n", + "\n", + " tags mlflow.user \\\n", + "0 {'mlflow.user': 'fmind', 'mlflow.source.name':... fmind \n", + "1 {'mlflow.user': 'fmind', 'mlflow.source.name':... fmind \n", + "2 {'mlflow.user': 'fmind', 'mlflow.source.name':... fmind \n", + "3 {'mlflow.user': 'fmind', 'mlflow.source.name':... fmind \n", + "4 {'mlflow.user': 'fmind', 'mlflow.source.name':... fmind \n", + "\n", + " mlflow.source.name mlflow.source.type \\\n", + "0 file:///home/fmind/mlops-python-package PROJECT \n", + "1 file:///home/fmind/mlops-python-package PROJECT \n", + "2 file:///home/fmind/mlops-python-package PROJECT \n", + "3 file:///home/fmind/mlops-python-package PROJECT \n", + "4 file:///home/fmind/mlops-python-package PROJECT \n", + "\n", + " mlflow.project.entryPoint mlflow.source.git.commit \\\n", + "0 main ee17d0a9de59efd2eb99d667786ac417ec8b3b63 \n", + "1 main ee17d0a9de59efd2eb99d667786ac417ec8b3b63 \n", + "2 main ee17d0a9de59efd2eb99d667786ac417ec8b3b63 \n", + "3 main ee17d0a9de59efd2eb99d667786ac417ec8b3b63 \n", + "4 main ee17d0a9de59efd2eb99d667786ac417ec8b3b63 \n", + "\n", + " mlflow.source.git.repoURL \\\n", + "0 git@github.com:fmind/mlops-python-package \n", + "1 git@github.com:fmind/mlops-python-package \n", + "2 git@github.com:fmind/mlops-python-package \n", + "3 git@github.com:fmind/mlops-python-package \n", + "4 git@github.com:fmind/mlops-python-package \n", + "\n", + " mlflow.gitRepoURL mlflow.runName \\\n", + "0 git@github.com:fmind/mlops-python-package Explanations \n", + "1 git@github.com:fmind/mlops-python-package Evaluations \n", + "2 git@github.com:fmind/mlops-python-package Inference \n", + "3 git@github.com:fmind/mlops-python-package Promotion \n", + "4 git@github.com:fmind/mlops-python-package Training \n", + "\n", + " mlflow.project.env mlflow.project.backend \\\n", + "0 virtualenv local \n", + "1 virtualenv local \n", + "2 virtualenv local \n", + "3 virtualenv local \n", + "4 virtualenv local \n", + "\n", + " mlflow.datasets estimator_name \\\n", + "0 NaN NaN \n", + "1 [{\"name\":\"ce0fe6e33c74e2fa3659d51482be5f27\",\"h... NaN \n", + "2 NaN NaN \n", + "3 NaN NaN \n", + "4 NaN Pipeline \n", + "\n", + " estimator_class \\\n", + "0 NaN \n", + "1 NaN \n", + "2 NaN \n", + "3 NaN \n", + "4 sklearn.pipeline.Pipeline \n", + "\n", + " mlflow.log-model.history mlflow.autologging \\\n", + "0 NaN NaN \n", + "1 NaN NaN \n", + "2 NaN NaN \n", + "3 NaN NaN \n", + "4 [{\"run_id\": \"47302e957d8542198a281aad07b2413b\"... NaN \n", + "\n", + " mlflow.parentRunId \n", + "0 NaN \n", + "1 NaN \n", + "2 NaN \n", + "3 NaN \n", + "4 NaN " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "runs = client.search_runs(\n", + " experiment_ids=experiments[\"experiment_id\"].unique(),\n", + " run_view_type=mlflow.entities.ViewType.ALL,\n", + " max_results=MAX_RESULTS,\n", + " order_by=[\"created DESC\"],\n", + ")\n", + "runs = [dict(run.info) | dict(run.data) for run in runs]\n", + "runs = pd.DataFrame(runs).assign(\n", + " end_time=lambda data: pd.to_datetime(data[\"end_time\"], unit=\"ms\"),\n", + " start_time=lambda data: pd.to_datetime(data[\"start_time\"], unit=\"ms\"),\n", + ")\n", + "runs = pd.concat([runs, pd.json_normalize(runs['tags'])], axis=\"columns\")\n", + "print(runs.shape)\n", + "runs.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1, 6)\n" + ] + }, + { + "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", + "
aliasescreation_timestampdescriptionlast_updated_timestampnametags
0{'Champion': '1'}2024-07-21 15:03:06.2082024-07-21 15:03:11.695bikes{}
\n", + "
" + ], + "text/plain": [ + " aliases creation_timestamp description \\\n", + "0 {'Champion': '1'} 2024-07-21 15:03:06.208 \n", + "\n", + " last_updated_timestamp name tags \n", + "0 2024-07-21 15:03:11.695 bikes {} " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "models = client.search_registered_models(\n", + " max_results=MAX_RESULTS, order_by=[\"creation_timestamp DESC\"]\n", + ")\n", + "models = [dict(model) for model in models]\n", + "models = pd.DataFrame(models).assign(\n", + " creation_timestamp=lambda data: pd.to_datetime(data[\"creation_timestamp\"], unit=\"ms\"),\n", + " last_updated_timestamp=lambda data: pd.to_datetime(data[\"last_updated_timestamp\"], unit=\"ms\"),\n", + ").drop(columns=['latest_versions'])\n", + "print(models.shape)\n", + "models" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1, 14)\n" + ] + }, + { + "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", + "
aliasescreation_timestampcurrent_stagedescriptionlast_updated_timestampnamerun_idrun_linksourcestatusstatus_messagetagsuser_idversion
0Champion2024-07-21 15:03:06.212None2024-07-21 15:03:06.212bikes47302e957d8542198a281aad07b2413bfile:///home/fmind/mlops-python-package/mlruns...READY{}1
\n", + "
" + ], + "text/plain": [ + " aliases creation_timestamp current_stage description \\\n", + "0 Champion 2024-07-21 15:03:06.212 None \n", + "\n", + " last_updated_timestamp name run_id run_link \\\n", + "0 2024-07-21 15:03:06.212 bikes 47302e957d8542198a281aad07b2413b \n", + "\n", + " source status status_message \\\n", + "0 file:///home/fmind/mlops-python-package/mlruns... READY \n", + "\n", + " tags user_id version \n", + "0 {} 1 " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "versions = client.search_model_versions(\n", + " max_results=MAX_RESULTS, order_by=[\"creation_timestamp DESC\"]\n", + ")\n", + "versions = [dict(version) for version in versions]\n", + "versions = pd.DataFrame(versions).assign(\n", + " aliases=lambda data: data['aliases'].map(lambda x: x[0] if len(x) else None),\n", + " creation_timestamp=lambda data: pd.to_datetime(data[\"creation_timestamp\"], unit=\"ms\"),\n", + " last_updated_timestamp=lambda data: pd.to_datetime(data[\"last_updated_timestamp\"], unit=\"ms\"),\n", + ")\n", + "print(versions.shape)\n", + "versions.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# DASHBOARDS" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "alignmentgroup": "True", + "boxpoints": "all", + "customdata": [ + [ + "file:///home/fmind/mlops-python-package/mlruns/598443335336095652", + "598443335336095652", + "2024-07-21T15:02:02.224000", + "active", + "bikes", + {} + ] + ], + "fillcolor": "rgba(255,255,255,0)", + "hoveron": "points", + "hovertemplate": "%{hovertext}

lifecycle_stage=%{customdata[3]}
creation_time=%{x}
artifact_location=%{customdata[0]}
experiment_id=%{customdata[1]}
last_update_time=%{customdata[2]}
name=%{customdata[4]}
tags=%{customdata[5]}", + "hovertext": [ + "bikes" + ], + "legendgroup": "active", + "line": { + "color": "rgba(255,255,255,0)" + }, + "marker": { + "color": "#636efa" + }, + "name": "active", + "offsetgroup": "active", + "orientation": "h", + "pointpos": 0, + "showlegend": true, + "type": "box", + "x": [ + "2024-07-21T15:02:02.224000" + ], + "x0": " ", + "xaxis": "x", + "y0": " ", + "yaxis": "y" + } + ], + "layout": { + "boxmode": "group", + "legend": { + "title": { + "text": "lifecycle_stage" + }, + "tracegroupgap": 0 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Experiment Creation Time" + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "creation_time" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ] + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "px.strip(\n", + " experiments,\n", + " x=\"creation_time\",\n", + " color=\"lifecycle_stage\",\n", + " hover_name=\"name\",\n", + " hover_data=experiments.columns,\n", + " title=\"Experiment Creation Time\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "alignmentgroup": "True", + "boxpoints": "all", + "customdata": [ + [ + { + "Champion": "1" + }, + "", + "2024-07-21T15:03:11.695000", + "bikes", + {} + ] + ], + "fillcolor": "rgba(255,255,255,0)", + "hoveron": "points", + "hovertemplate": "%{hovertext}

creation_timestamp=%{x}
aliases=%{customdata[0]}
description=%{customdata[1]}
last_updated_timestamp=%{customdata[2]}
name=%{customdata[3]}
tags=%{customdata[4]}", + "hovertext": [ + "bikes" + ], + "legendgroup": "", + "line": { + "color": "rgba(255,255,255,0)" + }, + "marker": { + "color": "#636efa" + }, + "name": "", + "offsetgroup": "", + "orientation": "h", + "pointpos": 0, + "showlegend": false, + "type": "box", + "x": [ + "2024-07-21T15:03:06.208000" + ], + "x0": " ", + "xaxis": "x", + "y0": " ", + "yaxis": "y" + } + ], + "layout": { + "boxmode": "group", + "legend": { + "tracegroupgap": 0 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Model Creation Timestamp" + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "creation_timestamp" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ] + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "px.strip(\n", + " models,\n", + " x=\"creation_timestamp\",\n", + " hover_name=\"name\",\n", + " hover_data=models.columns,\n", + " title=\"Model Creation Timestamp\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "alignmentgroup": "True", + "boxpoints": "all", + "customdata": [ + [ + { + "Champion": "1" + }, + "", + "2024-07-21T15:03:11.695000", + "bikes", + {} + ] + ], + "fillcolor": "rgba(255,255,255,0)", + "hoveron": "points", + "hovertemplate": "%{hovertext}

creation_timestamp=%{x}
aliases=%{customdata[0]}
description=%{customdata[1]}
last_updated_timestamp=%{customdata[2]}
name=%{customdata[3]}
tags=%{customdata[4]}", + "hovertext": [ + "bikes" + ], + "legendgroup": "", + "line": { + "color": "rgba(255,255,255,0)" + }, + "marker": { + "color": "#636efa" + }, + "name": "", + "offsetgroup": "", + "orientation": "h", + "pointpos": 0, + "showlegend": false, + "type": "box", + "x": [ + "2024-07-21T15:03:06.208000" + ], + "x0": " ", + "xaxis": "x", + "y0": " ", + "yaxis": "y" + } + ], + "layout": { + "boxmode": "group", + "legend": { + "tracegroupgap": 0 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Model Creation Timestamp" + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "creation_timestamp" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ] + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "px.strip(\n", + " models,\n", + " x=\"creation_timestamp\",\n", + " hover_name=\"name\",\n", + " hover_data=models.columns,\n", + " title=\"Model Creation Timestamp\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "alignmentgroup": "True", + "boxpoints": "all", + "customdata": [ + [ + "Champion", + "None", + "", + "2024-07-21T15:03:06.212000", + "bikes", + "47302e957d8542198a281aad07b2413b", + "", + "file:///home/fmind/mlops-python-package/mlruns/598443335336095652/47302e957d8542198a281aad07b2413b/artifacts/model", + "READY", + "", + {}, + "", + "1" + ] + ], + "fillcolor": "rgba(255,255,255,0)", + "hoveron": "points", + "hovertemplate": "%{hovertext}

name=%{customdata[4]}
creation_timestamp=%{x}
aliases=%{customdata[0]}
current_stage=%{customdata[1]}
description=%{customdata[2]}
last_updated_timestamp=%{customdata[3]}
run_id=%{customdata[5]}
run_link=%{customdata[6]}
source=%{customdata[7]}
status=%{customdata[8]}
status_message=%{customdata[9]}
tags=%{customdata[10]}
user_id=%{customdata[11]}
version=%{customdata[12]}", + "hovertext": [ + "bikes" + ], + "legendgroup": "bikes", + "line": { + "color": "rgba(255,255,255,0)" + }, + "marker": { + "color": "#636efa" + }, + "name": "bikes", + "offsetgroup": "bikes", + "orientation": "h", + "pointpos": 0, + "showlegend": true, + "type": "box", + "x": [ + "2024-07-21T15:03:06.212000" + ], + "x0": " ", + "xaxis": "x", + "y0": " ", + "yaxis": "y" + } + ], + "layout": { + "boxmode": "group", + "legend": { + "title": { + "text": "name" + }, + "tracegroupgap": 0 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Version Creation Timestamp" + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "creation_timestamp" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ] + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "px.strip(\n", + " versions,\n", + " x=\"creation_timestamp\",\n", + " color=\"name\",\n", + " hover_name=\"name\",\n", + " hover_data=versions.columns,\n", + " title=\"Version Creation Timestamp\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "alignmentgroup": "True", + "boxpoints": "all", + "customdata": [ + [ + "file:///home/fmind/mlops-python-package/mlruns/598443335336095652/5936b0cb0d9b47b2a1862344a79e55e7/artifacts", + "2024-07-21T15:04:07.438000", + "598443335336095652", + "active", + "5936b0cb0d9b47b2a1862344a79e55e7", + "Explanations", + "5936b0cb0d9b47b2a1862344a79e55e7", + "FINISHED", + "fmind", + {}, + { + "conf_file": "confs/explanations.yaml" + }, + { + "mlflow.gitRepoURL": "git@github.com:fmind/mlops-python-package", + "mlflow.project.backend": "local", + "mlflow.project.entryPoint": "main", + "mlflow.project.env": "virtualenv", + "mlflow.runName": "Explanations", + "mlflow.source.git.commit": "ee17d0a9de59efd2eb99d667786ac417ec8b3b63", + "mlflow.source.git.repoURL": "git@github.com:fmind/mlops-python-package", + "mlflow.source.name": "file:///home/fmind/mlops-python-package", + "mlflow.source.type": "PROJECT", + "mlflow.user": "fmind" + }, + "fmind", + "file:///home/fmind/mlops-python-package", + "PROJECT", + "main", + "ee17d0a9de59efd2eb99d667786ac417ec8b3b63", + "git@github.com:fmind/mlops-python-package", + "git@github.com:fmind/mlops-python-package", + "Explanations", + "virtualenv", + "local", + null, + null, + null, + null, + null, + null + ], + [ + "file:///home/fmind/mlops-python-package/mlruns/598443335336095652/ef5b224b3f4e4dbcb05169cfc4f358f7/artifacts", + "2024-07-21T15:03:25.782000", + "598443335336095652", + "active", + "ef5b224b3f4e4dbcb05169cfc4f358f7", + "Evaluations", + "ef5b224b3f4e4dbcb05169cfc4f358f7", + "FINISHED", + "fmind", + { + "example_count": 13903, + "max_error": 4294967295, + "mean_absolute_error": 2044457567.3205063, + "mean_absolute_percentage_error": 55189262.03890929, + "mean_on_target": 174.63914263108683, + "mean_squared_error": 296.66338200388407, + "r2_score": 0.9893562621162568, + "root_mean_squared_error": 17.223918892165166, + "sum_on_target": 2428008 + }, + { + "conf_file": "confs/evaluations.yaml" + }, + { + "mlflow.datasets": "[{\"name\":\"ce0fe6e33c74e2fa3659d51482be5f27\",\"hash\":\"ce0fe6e33c74e2fa3659d51482be5f27\",\"model\":\"c18c304506ec438c9937a5804b4e19bc\"}]", + "mlflow.gitRepoURL": "git@github.com:fmind/mlops-python-package", + "mlflow.project.backend": "local", + "mlflow.project.entryPoint": "main", + "mlflow.project.env": "virtualenv", + "mlflow.runName": "Evaluations", + "mlflow.source.git.commit": "ee17d0a9de59efd2eb99d667786ac417ec8b3b63", + "mlflow.source.git.repoURL": "git@github.com:fmind/mlops-python-package", + "mlflow.source.name": "file:///home/fmind/mlops-python-package", + "mlflow.source.type": "PROJECT", + "mlflow.user": "fmind" + }, + "fmind", + "file:///home/fmind/mlops-python-package", + "PROJECT", + "main", + "ee17d0a9de59efd2eb99d667786ac417ec8b3b63", + "git@github.com:fmind/mlops-python-package", + "git@github.com:fmind/mlops-python-package", + "Evaluations", + "virtualenv", + "local", + "[{\"name\":\"ce0fe6e33c74e2fa3659d51482be5f27\",\"hash\":\"ce0fe6e33c74e2fa3659d51482be5f27\",\"model\":\"c18c304506ec438c9937a5804b4e19bc\"}]", + null, + null, + null, + null, + null + ], + [ + "file:///home/fmind/mlops-python-package/mlruns/598443335336095652/65f34c799e814cfe82d844b0eff6a16f/artifacts", + "2024-07-21T15:03:18.035000", + "598443335336095652", + "active", + "65f34c799e814cfe82d844b0eff6a16f", + "Inference", + "65f34c799e814cfe82d844b0eff6a16f", + "FINISHED", + "fmind", + {}, + { + "conf_file": "confs/inference.yaml" + }, + { + "mlflow.gitRepoURL": "git@github.com:fmind/mlops-python-package", + "mlflow.project.backend": "local", + "mlflow.project.entryPoint": "main", + "mlflow.project.env": "virtualenv", + "mlflow.runName": "Inference", + "mlflow.source.git.commit": "ee17d0a9de59efd2eb99d667786ac417ec8b3b63", + "mlflow.source.git.repoURL": "git@github.com:fmind/mlops-python-package", + "mlflow.source.name": "file:///home/fmind/mlops-python-package", + "mlflow.source.type": "PROJECT", + "mlflow.user": "fmind" + }, + "fmind", + "file:///home/fmind/mlops-python-package", + "PROJECT", + "main", + "ee17d0a9de59efd2eb99d667786ac417ec8b3b63", + "git@github.com:fmind/mlops-python-package", + "git@github.com:fmind/mlops-python-package", + "Inference", + "virtualenv", + "local", + null, + null, + null, + null, + null, + null + ], + [ + "file:///home/fmind/mlops-python-package/mlruns/598443335336095652/a5dbcb3fc6a24fdc863fb31eb0fc4d7a/artifacts", + "2024-07-21T15:03:12.321000", + "598443335336095652", + "active", + "a5dbcb3fc6a24fdc863fb31eb0fc4d7a", + "Promotion", + "a5dbcb3fc6a24fdc863fb31eb0fc4d7a", + "FINISHED", + "fmind", + {}, + { + "conf_file": "confs/promotion.yaml" + }, + { + "mlflow.gitRepoURL": "git@github.com:fmind/mlops-python-package", + "mlflow.project.backend": "local", + "mlflow.project.entryPoint": "main", + "mlflow.project.env": "virtualenv", + "mlflow.runName": "Promotion", + "mlflow.source.git.commit": "ee17d0a9de59efd2eb99d667786ac417ec8b3b63", + "mlflow.source.git.repoURL": "git@github.com:fmind/mlops-python-package", + "mlflow.source.name": "file:///home/fmind/mlops-python-package", + "mlflow.source.type": "PROJECT", + "mlflow.user": "fmind" + }, + "fmind", + "file:///home/fmind/mlops-python-package", + "PROJECT", + "main", + "ee17d0a9de59efd2eb99d667786ac417ec8b3b63", + "git@github.com:fmind/mlops-python-package", + "git@github.com:fmind/mlops-python-package", + "Promotion", + "virtualenv", + "local", + null, + null, + null, + null, + null, + null + ], + [ + "file:///home/fmind/mlops-python-package/mlruns/598443335336095652/47302e957d8542198a281aad07b2413b/artifacts", + "2024-07-21T15:03:07.098000", + "598443335336095652", + "active", + "47302e957d8542198a281aad07b2413b", + "Training", + "47302e957d8542198a281aad07b2413b", + "FINISHED", + "fmind", + { + "mean_squared_error": -1786.7527777777777, + "system/cpu_utilization_percentage": 15.6, + "system/disk_available_megabytes": 35139.3, + "system/disk_usage_megabytes": 70848.1, + "system/disk_usage_percentage": 66.8, + "system/network_receive_megabytes": 0.001855000000034579, + "system/network_transmit_megabytes": 0.003730000000018663, + "system/system_memory_usage_megabytes": 4143.6, + "system/system_memory_usage_percentage": 27.5, + "training_mean_absolute_error": 6.8051192198812736, + "training_mean_squared_error": 124.51054615575788, + "training_r2_score": 0.9948851411922456, + "training_root_mean_squared_error": 11.158429376742852, + "training_score": 0.9948851411922456 + }, + { + "conf_file": "confs/training.yaml", + "memory": "None", + "regressor": "RandomForestRegressor(max_depth=20, n_estimators=200, random_state=42)", + "regressor__bootstrap": "True", + "regressor__ccp_alpha": "0.0", + "regressor__criterion": "squared_error", + "regressor__max_depth": "20", + "regressor__max_features": "1.0", + "regressor__max_leaf_nodes": "None", + "regressor__max_samples": "None", + "regressor__min_impurity_decrease": "0.0", + "regressor__min_samples_leaf": "1", + "regressor__min_samples_split": "2", + "regressor__min_weight_fraction_leaf": "0.0", + "regressor__monotonic_cst": "None", + "regressor__n_estimators": "200", + "regressor__n_jobs": "None", + "regressor__oob_score": "False", + "regressor__random_state": "42", + "regressor__verbose": "0", + "regressor__warm_start": "False", + "steps": "[('transformer', ColumnTransformer(transformers=[('categoricals',\n OneHotEncoder(handle_unknown='ignore',\n sparse_output=False),\n ['season', 'weathersit']),\n ('numericals', 'passthrough',\n ['yr', 'mnth', 'hr', 'holiday', 'weekday',\n 'workingday', 'temp', 'atemp', 'hum',\n 'windspeed', 'casual'])])), ('regressor', RandomForestRegressor(max_depth=20, n_estimators=200, random_state=42))]", + "transformer": "ColumnTransformer(transformers=[('categoricals',\n OneHotEncoder(handle_unknown='ignore',\n sparse_output=False),\n ['season', 'weathersit']),\n ('numericals', 'passthrough',\n ['yr', 'mnth', 'hr', 'holiday', 'weekday',\n 'workingday', 'temp', 'atemp', 'hum',\n 'windspeed', 'casual'])])", + "transformer__categoricals": "OneHotEncoder(handle_unknown='ignore', sparse_output=False)", + "transformer__categoricals__categories": "auto", + "transformer__categoricals__drop": "None", + "transformer__categoricals__dtype": "", + "transformer__categoricals__feature_name_combiner": "concat", + "transformer__categoricals__handle_unknown": "ignore", + "transformer__categoricals__max_categories": "None", + "transformer__categoricals__min_frequency": "None", + "transformer__categoricals__sparse_output": "False", + "transformer__n_jobs": "None", + "transformer__numericals": "passthrough", + "transformer__remainder": "drop", + "transformer__sparse_threshold": "0.3", + "transformer__transformer_weights": "None", + "transformer__transformers": "[('categoricals', OneHotEncoder(handle_unknown='ignore', sparse_output=False), ['season', 'weathersit']), ('numericals', 'passthrough', ['yr', 'mnth', 'hr', 'holiday', 'weekday', 'workingday', 'temp', 'atemp', 'hum', 'windspeed', 'casual'])]", + "transformer__verbose": "False", + "transformer__verbose_feature_names_out": "True", + "verbose": "False" + }, + { + "estimator_class": "sklearn.pipeline.Pipeline", + "estimator_name": "Pipeline", + "mlflow.gitRepoURL": "git@github.com:fmind/mlops-python-package", + "mlflow.log-model.history": "[{\"run_id\": \"47302e957d8542198a281aad07b2413b\", \"artifact_path\": \"model\", \"utc_time_created\": \"2024-07-21 15:02:54.863113\", \"flavors\": {\"python_function\": {\"model_path\": \"model.pkl\", \"predict_fn\": \"predict\", \"loader_module\": \"mlflow.sklearn\", \"python_version\": \"3.12.4\", \"env\": {\"conda\": \"conda.yaml\", \"virtualenv\": \"python_env.yaml\"}}, \"sklearn\": {\"pickled_model\": \"model.pkl\", \"sklearn_version\": \"1.4.2\", \"serialization_format\": \"cloudpickle\", \"code\": null}}, \"model_uuid\": \"4fd09447dee548f586e05d2edbfbe2d8\", \"mlflow_version\": \"2.14.3\", \"signature\": {\"inputs\": \"[{\\\"type\\\": \\\"datetime\\\", \\\"name\\\": \\\"dteday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"season\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"yr\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"mnth\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"hr\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"boolean\\\", \\\"name\\\": \\\"holiday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"weekday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"boolean\\\", \\\"name\\\": \\\"workingday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"weathersit\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"temp\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"atemp\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"hum\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"windspeed\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"casual\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"registered\\\", \\\"required\\\": true}]\", \"outputs\": \"[{\\\"type\\\": \\\"tensor\\\", \\\"tensor-spec\\\": {\\\"dtype\\\": \\\"float64\\\", \\\"shape\\\": [-1]}}]\", \"params\": null}, \"saved_input_example_info\": {\"artifact_path\": \"input_example.json\", \"type\": \"dataframe\", \"pandas_orient\": \"split\"}, \"model_size_bytes\": 203898413}, {\"run_id\": \"47302e957d8542198a281aad07b2413b\", \"artifact_path\": \"model\", \"utc_time_created\": \"2024-07-21 15:02:59.278448\", \"flavors\": {\"python_function\": {\"streamable\": false, \"cloudpickle_version\": \"3.0.0\", \"python_model\": \"python_model.pkl\", \"loader_module\": \"mlflow.pyfunc.model\", \"python_version\": \"3.12.4\", \"env\": {\"conda\": \"conda.yaml\", \"virtualenv\": \"python_env.yaml\"}, \"code\": null}}, \"model_uuid\": \"c18c304506ec438c9937a5804b4e19bc\", \"mlflow_version\": \"2.14.3\", \"signature\": {\"inputs\": \"[{\\\"type\\\": \\\"datetime\\\", \\\"name\\\": \\\"dteday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"season\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"yr\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"mnth\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"hr\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"boolean\\\", \\\"name\\\": \\\"holiday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"weekday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"boolean\\\", \\\"name\\\": \\\"workingday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"weathersit\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"temp\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"atemp\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"hum\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"windspeed\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"casual\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"registered\\\", \\\"required\\\": true}]\", \"outputs\": \"[{\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"prediction\\\", \\\"required\\\": true}]\", \"params\": null}, \"saved_input_example_info\": {\"artifact_path\": \"input_example.json\", \"type\": \"dataframe\", \"pandas_orient\": \"split\"}, \"model_size_bytes\": 205599260}]", + "mlflow.project.backend": "local", + "mlflow.project.entryPoint": "main", + "mlflow.project.env": "virtualenv", + "mlflow.runName": "Training", + "mlflow.source.git.commit": "ee17d0a9de59efd2eb99d667786ac417ec8b3b63", + "mlflow.source.git.repoURL": "git@github.com:fmind/mlops-python-package", + "mlflow.source.name": "file:///home/fmind/mlops-python-package", + "mlflow.source.type": "PROJECT", + "mlflow.user": "fmind" + }, + "fmind", + "file:///home/fmind/mlops-python-package", + "PROJECT", + "main", + "ee17d0a9de59efd2eb99d667786ac417ec8b3b63", + "git@github.com:fmind/mlops-python-package", + "git@github.com:fmind/mlops-python-package", + "Training", + "virtualenv", + "local", + null, + "Pipeline", + "sklearn.pipeline.Pipeline", + "[{\"run_id\": \"47302e957d8542198a281aad07b2413b\", \"artifact_path\": \"model\", \"utc_time_created\": \"2024-07-21 15:02:54.863113\", \"flavors\": {\"python_function\": {\"model_path\": \"model.pkl\", \"predict_fn\": \"predict\", \"loader_module\": \"mlflow.sklearn\", \"python_version\": \"3.12.4\", \"env\": {\"conda\": \"conda.yaml\", \"virtualenv\": \"python_env.yaml\"}}, \"sklearn\": {\"pickled_model\": \"model.pkl\", \"sklearn_version\": \"1.4.2\", \"serialization_format\": \"cloudpickle\", \"code\": null}}, \"model_uuid\": \"4fd09447dee548f586e05d2edbfbe2d8\", \"mlflow_version\": \"2.14.3\", \"signature\": {\"inputs\": \"[{\\\"type\\\": \\\"datetime\\\", \\\"name\\\": \\\"dteday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"season\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"yr\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"mnth\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"hr\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"boolean\\\", \\\"name\\\": \\\"holiday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"weekday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"boolean\\\", \\\"name\\\": \\\"workingday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"weathersit\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"temp\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"atemp\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"hum\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"windspeed\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"casual\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"registered\\\", \\\"required\\\": true}]\", \"outputs\": \"[{\\\"type\\\": \\\"tensor\\\", \\\"tensor-spec\\\": {\\\"dtype\\\": \\\"float64\\\", \\\"shape\\\": [-1]}}]\", \"params\": null}, \"saved_input_example_info\": {\"artifact_path\": \"input_example.json\", \"type\": \"dataframe\", \"pandas_orient\": \"split\"}, \"model_size_bytes\": 203898413}, {\"run_id\": \"47302e957d8542198a281aad07b2413b\", \"artifact_path\": \"model\", \"utc_time_created\": \"2024-07-21 15:02:59.278448\", \"flavors\": {\"python_function\": {\"streamable\": false, \"cloudpickle_version\": \"3.0.0\", \"python_model\": \"python_model.pkl\", \"loader_module\": \"mlflow.pyfunc.model\", \"python_version\": \"3.12.4\", \"env\": {\"conda\": \"conda.yaml\", \"virtualenv\": \"python_env.yaml\"}, \"code\": null}}, \"model_uuid\": \"c18c304506ec438c9937a5804b4e19bc\", \"mlflow_version\": \"2.14.3\", \"signature\": {\"inputs\": \"[{\\\"type\\\": \\\"datetime\\\", \\\"name\\\": \\\"dteday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"season\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"yr\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"mnth\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"hr\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"boolean\\\", \\\"name\\\": \\\"holiday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"weekday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"boolean\\\", \\\"name\\\": \\\"workingday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"weathersit\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"temp\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"atemp\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"hum\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"windspeed\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"casual\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"registered\\\", \\\"required\\\": true}]\", \"outputs\": \"[{\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"prediction\\\", \\\"required\\\": true}]\", \"params\": null}, \"saved_input_example_info\": {\"artifact_path\": \"input_example.json\", \"type\": \"dataframe\", \"pandas_orient\": \"split\"}, \"model_size_bytes\": 205599260}]", + null, + null + ], + [ + "file:///home/fmind/mlops-python-package/mlruns/598443335336095652/38a4df3abf194e06b5eeaaa0bb383ee8/artifacts", + "2024-07-21T15:02:40.466000", + "598443335336095652", + "active", + "38a4df3abf194e06b5eeaaa0bb383ee8", + "Tuning", + "38a4df3abf194e06b5eeaaa0bb383ee8", + "FINISHED", + "fmind", + { + "best_cv_score": -5517.252604166667, + "system/cpu_utilization_percentage": 17.1, + "system/disk_available_megabytes": 35143.4, + "system/disk_usage_megabytes": 70843.7, + "system/disk_usage_percentage": 66.8, + "system/network_receive_megabytes": 0.012593999999978678, + "system/network_transmit_megabytes": 0.006136999999995396, + "system/system_memory_usage_megabytes": 4245, + "system/system_memory_usage_percentage": 28.1, + "training_score": -1951.0630079838884 + }, + { + "best_max_depth": "7", + "conf_file": "confs/tuning.yaml", + "cv": "KIND='TimeSeriesSplitter' gap=0 n_splits=4 test_size=1440", + "error_score": "raise", + "estimator": "KIND='BaselineSklearnModel' max_depth=20 n_estimators=200 random_state=42", + "n_jobs": "None", + "param_grid": "{'max_depth': [3, 5, 7]}", + "pre_dispatch": "2*n_jobs", + "refit": "True", + "return_train_score": "False", + "scoring": "", + "verbose": "3" + }, + { + "estimator_class": "sklearn.model_selection._search.GridSearchCV", + "estimator_name": "GridSearchCV", + "mlflow.gitRepoURL": "git@github.com:fmind/mlops-python-package", + "mlflow.log-model.history": "[{\"run_id\": \"38a4df3abf194e06b5eeaaa0bb383ee8\", \"artifact_path\": \"model\", \"utc_time_created\": \"2024-07-21 15:02:33.521812\", \"flavors\": {\"python_function\": {\"model_path\": \"model.pkl\", \"predict_fn\": \"predict\", \"loader_module\": \"mlflow.sklearn\", \"python_version\": \"3.12.4\", \"env\": {\"conda\": \"conda.yaml\", \"virtualenv\": \"python_env.yaml\"}}, \"sklearn\": {\"pickled_model\": \"model.pkl\", \"sklearn_version\": \"1.4.2\", \"serialization_format\": \"cloudpickle\", \"code\": null}}, \"model_uuid\": \"67c6c33385b04cb5ad03402d17d4e377\", \"mlflow_version\": \"2.14.3\", \"signature\": {\"inputs\": \"[{\\\"type\\\": \\\"datetime\\\", \\\"name\\\": \\\"dteday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"season\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"yr\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"mnth\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"hr\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"boolean\\\", \\\"name\\\": \\\"holiday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"weekday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"boolean\\\", \\\"name\\\": \\\"workingday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"weathersit\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"temp\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"atemp\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"hum\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"windspeed\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"casual\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"registered\\\", \\\"required\\\": true}]\", \"outputs\": \"[{\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"prediction\\\", \\\"required\\\": true}]\", \"params\": null}, \"saved_input_example_info\": {\"artifact_path\": \"input_example.json\", \"type\": \"dataframe\", \"pandas_orient\": \"split\"}, \"model_size_bytes\": 3726525}, {\"run_id\": \"38a4df3abf194e06b5eeaaa0bb383ee8\", \"artifact_path\": \"best_estimator\", \"utc_time_created\": \"2024-07-21 15:02:37.041779\", \"flavors\": {\"python_function\": {\"model_path\": \"model.pkl\", \"predict_fn\": \"predict\", \"loader_module\": \"mlflow.sklearn\", \"python_version\": \"3.12.4\", \"env\": {\"conda\": \"conda.yaml\", \"virtualenv\": \"python_env.yaml\"}}, \"sklearn\": {\"pickled_model\": \"model.pkl\", \"sklearn_version\": \"1.4.2\", \"serialization_format\": \"cloudpickle\", \"code\": null}}, \"model_uuid\": \"301cd67b8f704f2280ce6b59d6846c7c\", \"mlflow_version\": \"2.14.3\", \"signature\": {\"inputs\": \"[{\\\"type\\\": \\\"datetime\\\", \\\"name\\\": \\\"dteday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"season\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"yr\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"mnth\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"hr\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"boolean\\\", \\\"name\\\": \\\"holiday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"weekday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"boolean\\\", \\\"name\\\": \\\"workingday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"weathersit\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"temp\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"atemp\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"hum\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"windspeed\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"casual\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"registered\\\", \\\"required\\\": true}]\", \"outputs\": \"[{\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"prediction\\\", \\\"required\\\": true}]\", \"params\": null}, \"saved_input_example_info\": {\"artifact_path\": \"input_example.json\", \"type\": \"dataframe\", \"pandas_orient\": \"split\"}, \"model_size_bytes\": 3713919}]", + "mlflow.project.backend": "local", + "mlflow.project.entryPoint": "main", + "mlflow.project.env": "virtualenv", + "mlflow.runName": "Tuning", + "mlflow.source.git.commit": "ee17d0a9de59efd2eb99d667786ac417ec8b3b63", + "mlflow.source.git.repoURL": "git@github.com:fmind/mlops-python-package", + "mlflow.source.name": "file:///home/fmind/mlops-python-package", + "mlflow.source.type": "PROJECT", + "mlflow.user": "fmind" + }, + "fmind", + "file:///home/fmind/mlops-python-package", + "PROJECT", + "main", + "ee17d0a9de59efd2eb99d667786ac417ec8b3b63", + "git@github.com:fmind/mlops-python-package", + "git@github.com:fmind/mlops-python-package", + "Tuning", + "virtualenv", + "local", + null, + "GridSearchCV", + "sklearn.model_selection._search.GridSearchCV", + "[{\"run_id\": \"38a4df3abf194e06b5eeaaa0bb383ee8\", \"artifact_path\": \"model\", \"utc_time_created\": \"2024-07-21 15:02:33.521812\", \"flavors\": {\"python_function\": {\"model_path\": \"model.pkl\", \"predict_fn\": \"predict\", \"loader_module\": \"mlflow.sklearn\", \"python_version\": \"3.12.4\", \"env\": {\"conda\": \"conda.yaml\", \"virtualenv\": \"python_env.yaml\"}}, \"sklearn\": {\"pickled_model\": \"model.pkl\", \"sklearn_version\": \"1.4.2\", \"serialization_format\": \"cloudpickle\", \"code\": null}}, \"model_uuid\": \"67c6c33385b04cb5ad03402d17d4e377\", \"mlflow_version\": \"2.14.3\", \"signature\": {\"inputs\": \"[{\\\"type\\\": \\\"datetime\\\", \\\"name\\\": \\\"dteday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"season\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"yr\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"mnth\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"hr\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"boolean\\\", \\\"name\\\": \\\"holiday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"weekday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"boolean\\\", \\\"name\\\": \\\"workingday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"weathersit\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"temp\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"atemp\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"hum\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"windspeed\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"casual\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"registered\\\", \\\"required\\\": true}]\", \"outputs\": \"[{\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"prediction\\\", \\\"required\\\": true}]\", \"params\": null}, \"saved_input_example_info\": {\"artifact_path\": \"input_example.json\", \"type\": \"dataframe\", \"pandas_orient\": \"split\"}, \"model_size_bytes\": 3726525}, {\"run_id\": \"38a4df3abf194e06b5eeaaa0bb383ee8\", \"artifact_path\": \"best_estimator\", \"utc_time_created\": \"2024-07-21 15:02:37.041779\", \"flavors\": {\"python_function\": {\"model_path\": \"model.pkl\", \"predict_fn\": \"predict\", \"loader_module\": \"mlflow.sklearn\", \"python_version\": \"3.12.4\", \"env\": {\"conda\": \"conda.yaml\", \"virtualenv\": \"python_env.yaml\"}}, \"sklearn\": {\"pickled_model\": \"model.pkl\", \"sklearn_version\": \"1.4.2\", \"serialization_format\": \"cloudpickle\", \"code\": null}}, \"model_uuid\": \"301cd67b8f704f2280ce6b59d6846c7c\", \"mlflow_version\": \"2.14.3\", \"signature\": {\"inputs\": \"[{\\\"type\\\": \\\"datetime\\\", \\\"name\\\": \\\"dteday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"season\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"yr\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"mnth\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"hr\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"boolean\\\", \\\"name\\\": \\\"holiday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"weekday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"boolean\\\", \\\"name\\\": \\\"workingday\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"integer\\\", \\\"name\\\": \\\"weathersit\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"temp\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"atemp\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"hum\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"float\\\", \\\"name\\\": \\\"windspeed\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"casual\\\", \\\"required\\\": true}, {\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"registered\\\", \\\"required\\\": true}]\", \"outputs\": \"[{\\\"type\\\": \\\"long\\\", \\\"name\\\": \\\"prediction\\\", \\\"required\\\": true}]\", \"params\": null}, \"saved_input_example_info\": {\"artifact_path\": \"input_example.json\", \"type\": \"dataframe\", \"pandas_orient\": \"split\"}, \"model_size_bytes\": 3713919}]", + null, + null + ], + [ + "file:///home/fmind/mlops-python-package/mlruns/598443335336095652/38c04e59e8344096bf574faf63b10cd1/artifacts", + "2024-07-21T15:02:39.624000", + "598443335336095652", + "active", + "38c04e59e8344096bf574faf63b10cd1", + "charming-boar-572", + "38c04e59e8344096bf574faf63b10cd1", + "FINISHED", + "fmind", + { + "mean_fit_time": 1.0880586504936218, + "mean_score_time": 0.03774416446685791, + "mean_test_score": -16644.957118055558, + "rank_test_score": 3, + "std_fit_time": 0.15489854371698458, + "std_score_time": 0.001806776770578061, + "std_test_score": 5315.459715152708 + }, + { + "max_depth": "3", + "n_estimators": "200", + "random_state": "42" + }, + { + "estimator_class": "bikes.core.models.BaselineSklearnModel", + "estimator_name": "BaselineSklearnModel", + "mlflow.autologging": "sklearn", + "mlflow.parentRunId": "38a4df3abf194e06b5eeaaa0bb383ee8", + "mlflow.runName": "charming-boar-572", + "mlflow.source.git.commit": "ee17d0a9de59efd2eb99d667786ac417ec8b3b63", + "mlflow.source.name": "/home/fmind/mlops-python-package/src/bikes/__main__.py", + "mlflow.source.type": "LOCAL", + "mlflow.user": "fmind" + }, + "fmind", + "/home/fmind/mlops-python-package/src/bikes/__main__.py", + "LOCAL", + null, + "ee17d0a9de59efd2eb99d667786ac417ec8b3b63", + null, + null, + "charming-boar-572", + null, + null, + null, + "BaselineSklearnModel", + "bikes.core.models.BaselineSklearnModel", + null, + "sklearn", + "38a4df3abf194e06b5eeaaa0bb383ee8" + ], + [ + "file:///home/fmind/mlops-python-package/mlruns/598443335336095652/82f77216b8ee4a2d8dc0869d4a6bfc48/artifacts", + "2024-07-21T15:02:39.624000", + "598443335336095652", + "active", + "82f77216b8ee4a2d8dc0869d4a6bfc48", + "luxuriant-bird-233", + "82f77216b8ee4a2d8dc0869d4a6bfc48", + "FINISHED", + "fmind", + { + "mean_fit_time": 2.5814242362976074, + "mean_score_time": 0.04819995164871216, + "mean_test_score": -5517.252604166667, + "rank_test_score": 1, + "std_fit_time": 0.41318261395357886, + "std_score_time": 0.00042696711729265627, + "std_test_score": 1613.520146542553 + }, + { + "max_depth": "7", + "n_estimators": "200", + "random_state": "42" + }, + { + "estimator_class": "bikes.core.models.BaselineSklearnModel", + "estimator_name": "BaselineSklearnModel", + "mlflow.autologging": "sklearn", + "mlflow.parentRunId": "38a4df3abf194e06b5eeaaa0bb383ee8", + "mlflow.runName": "luxuriant-bird-233", + "mlflow.source.git.commit": "ee17d0a9de59efd2eb99d667786ac417ec8b3b63", + "mlflow.source.name": "/home/fmind/mlops-python-package/src/bikes/__main__.py", + "mlflow.source.type": "LOCAL", + "mlflow.user": "fmind" + }, + "fmind", + "/home/fmind/mlops-python-package/src/bikes/__main__.py", + "LOCAL", + null, + "ee17d0a9de59efd2eb99d667786ac417ec8b3b63", + null, + null, + "luxuriant-bird-233", + null, + null, + null, + "BaselineSklearnModel", + "bikes.core.models.BaselineSklearnModel", + null, + "sklearn", + "38a4df3abf194e06b5eeaaa0bb383ee8" + ], + [ + "file:///home/fmind/mlops-python-package/mlruns/598443335336095652/e110400581f846d08f802c970ae25458/artifacts", + "2024-07-21T15:02:39.624000", + "598443335336095652", + "active", + "e110400581f846d08f802c970ae25458", + "capricious-bear-977", + "e110400581f846d08f802c970ae25458", + "FINISHED", + "fmind", + { + "mean_fit_time": 1.7571877837181091, + "mean_score_time": 0.0408632755279541, + "mean_test_score": -8287.860416666666, + "rank_test_score": 2, + "std_fit_time": 0.2750353199252692, + "std_score_time": 0.0028638736758093077, + "std_test_score": 1045.7595024691313 + }, + { + "max_depth": "5", + "n_estimators": "200", + "random_state": "42" + }, + { + "estimator_class": "bikes.core.models.BaselineSklearnModel", + "estimator_name": "BaselineSklearnModel", + "mlflow.autologging": "sklearn", + "mlflow.parentRunId": "38a4df3abf194e06b5eeaaa0bb383ee8", + "mlflow.runName": "capricious-bear-977", + "mlflow.source.git.commit": "ee17d0a9de59efd2eb99d667786ac417ec8b3b63", + "mlflow.source.name": "/home/fmind/mlops-python-package/src/bikes/__main__.py", + "mlflow.source.type": "LOCAL", + "mlflow.user": "fmind" + }, + "fmind", + "/home/fmind/mlops-python-package/src/bikes/__main__.py", + "LOCAL", + null, + "ee17d0a9de59efd2eb99d667786ac417ec8b3b63", + null, + null, + "capricious-bear-977", + null, + null, + null, + "BaselineSklearnModel", + "bikes.core.models.BaselineSklearnModel", + null, + "sklearn", + "38a4df3abf194e06b5eeaaa0bb383ee8" + ] + ], + "fillcolor": "rgba(255,255,255,0)", + "hoveron": "points", + "hovertemplate": "%{hovertext}

experiment_id=%{customdata[2]}
start_time=%{x}
artifact_uri=%{customdata[0]}
end_time=%{customdata[1]}
lifecycle_stage=%{customdata[3]}
run_id=%{customdata[4]}
run_name=%{customdata[5]}
run_uuid=%{customdata[6]}
status=%{customdata[7]}
user_id=%{customdata[8]}
metrics=%{customdata[9]}
params=%{customdata[10]}
tags=%{customdata[11]}
mlflow.user=%{customdata[12]}
mlflow.source.name=%{customdata[13]}
mlflow.source.type=%{customdata[14]}
mlflow.project.entryPoint=%{customdata[15]}
mlflow.source.git.commit=%{customdata[16]}
mlflow.source.git.repoURL=%{customdata[17]}
mlflow.gitRepoURL=%{customdata[18]}
mlflow.runName=%{customdata[19]}
mlflow.project.env=%{customdata[20]}
mlflow.project.backend=%{customdata[21]}
mlflow.datasets=%{customdata[22]}
estimator_name=%{customdata[23]}
estimator_class=%{customdata[24]}
mlflow.log-model.history=%{customdata[25]}
mlflow.autologging=%{customdata[26]}
mlflow.parentRunId=%{customdata[27]}", + "hovertext": [ + "Explanations", + "Evaluations", + "Inference", + "Promotion", + "Training", + "Tuning", + "charming-boar-572", + "luxuriant-bird-233", + "capricious-bear-977" + ], + "legendgroup": "598443335336095652", + "line": { + "color": "rgba(255,255,255,0)" + }, + "marker": { + "color": "#636efa" + }, + "name": "598443335336095652", + "offsetgroup": "598443335336095652", + "orientation": "h", + "pointpos": 0, + "showlegend": true, + "type": "box", + "x": [ + "2024-07-21T15:03:28.331000", + "2024-07-21T15:03:19.637000", + "2024-07-21T15:03:13.853000", + "2024-07-21T15:03:09.011000", + "2024-07-21T15:02:42.090000", + "2024-07-21T15:02:02.378000", + "2024-07-21T15:02:02.378000", + "2024-07-21T15:02:02.378000", + "2024-07-21T15:02:02.378000" + ], + "x0": " ", + "xaxis": "x", + "y0": " ", + "yaxis": "y" + } + ], + "layout": { + "boxmode": "group", + "legend": { + "title": { + "text": "experiment_id" + }, + "tracegroupgap": 0 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Run Start Time" + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "start_time" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ] + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "px.strip(\n", + " runs,\n", + " x=\"start_time\",\n", + " color=\"experiment_id\",\n", + " hover_name=\"run_name\",\n", + " hover_data=runs.columns,\n", + " title=\"Run Start Time\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "alignmentgroup": "True", + "hovertemplate": "estimator_class=%{x}
count=%{y}", + "legendgroup": "", + "marker": { + "color": "#636efa", + "pattern": { + "shape": "" + } + }, + "name": "", + "offsetgroup": "", + "orientation": "v", + "showlegend": false, + "textposition": "auto", + "type": "bar", + "x": [ + null, + null, + null, + null, + "sklearn.pipeline.Pipeline", + "sklearn.model_selection._search.GridSearchCV", + "bikes.core.models.BaselineSklearnModel", + "bikes.core.models.BaselineSklearnModel", + "bikes.core.models.BaselineSklearnModel" + ], + "xaxis": "x", + "y": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "yaxis": "y" + } + ], + "layout": { + "barmode": "relative", + "legend": { + "tracegroupgap": 0 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Run Estimator Class Distribution" + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "estimator_class" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "count" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "px.bar(runs, x=\"estimator_class\", title=\"Run Estimator Class Distribution\")" + ] + } + ], + "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.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/process.ipynb b/notebooks/processing.ipynb similarity index 87% rename from notebooks/process.ipynb rename to notebooks/processing.ipynb index e13f0d5..78f28c4 100644 --- a/notebooks/process.ipynb +++ b/notebooks/processing.ipynb @@ -4,9 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "1. **Extract** inputs data from CSV files.\n", + "1. **Extract** all data from CSV files.\n", "2. **Transform** data into inputs/targets.\n", - "3. **Load** outputs data into parquet files." + "3. **Split** inputs/targets into train/test sets.\n", + "4. **Sample** inputs/targets for the testing sets.\n", + "5. **Load** outputs inputs/targets to parquet files." ] }, { @@ -22,7 +24,8 @@ "metadata": {}, "outputs": [], "source": [ - "import pandas as pd" + "import pandas as pd\n", + "from sklearn.model_selection import train_test_split" ] }, { @@ -69,7 +72,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Load" + "# Split" ] }, { @@ -78,27 +81,58 @@ "metadata": {}, "outputs": [], "source": [ - "INPUTS_FILE = \"../data/inputs.parquet\"\n", - "TARGETS_FILE = \"../data/targets.parquet\"" + "SHUFFLE = False # time-sensitive\n", + "TEST_SIZE = 0.2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# EXTRACT" + "# Sample" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "SAMPLE_RATIO = 0.15\n", + "SAMPLE_RANDOM_STATE = 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Hour" + "## Load" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "INPUTS_TRAIN_FILE = \"../data/inputs_train.parquet\"\n", + "INPUTS_TEST_FILE = \"../data/inputs_test.parquet\"\n", + "TARGETS_TRAIN_FILE = \"../data/targets_train.parquet\"\n", + "TARGETS_TEST_FILE = \"../data/targets_test.parquet\"\n", + "INPUTS_SAMPLE_FILE = \"../tests/data/inputs_sample.parquet\"\n", + "TARGETS_SAMPLE_FILE = \"../tests/data/targets_sample.parquet\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# EXTRACT" + ] + }, + { + "cell_type": "code", + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -284,7 +318,7 @@ "5 1 0.24 0.2879 0.75 0.0 0 1 1 " ] }, - "execution_count": 5, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -302,16 +336,9 @@ "# TRANFORM" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Inputs" - ] - }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -490,7 +517,7 @@ "5 1 0.24 0.2879 0.75 0.0 0 1 " ] }, - "execution_count": 6, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -501,16 +528,9 @@ "inputs.head()" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Targets" - ] - }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -583,7 +603,7 @@ "5 1" ] }, - "execution_count": 7, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -598,39 +618,80 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# LOAD" + "# SPLIT" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((13903, 15), (3476, 15), (13903, 1), (3476, 1))" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs_train, inputs_test, targets_train, targets_test = train_test_split(\n", + " inputs, targets, test_size=TEST_SIZE, shuffle=SHUFFLE\n", + ")\n", + "inputs_train.shape, inputs_test.shape, targets_train.shape, targets_test.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Inputs" + "# SAMPLE" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "((2085, 15), (2085, 1))" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "inputs.to_parquet(INPUTS_FILE)" + "inputs_train_sample = inputs_train.sample(frac=SAMPLE_RATIO, random_state=SAMPLE_RANDOM_STATE)\n", + "targets_train_sample = targets_train.sample(frac=SAMPLE_RATIO, random_state=SAMPLE_RANDOM_STATE)\n", + "inputs_train_sample.shape, targets_train_sample.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Targets" + "# LOAD" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ - "targets.to_parquet(TARGETS_FILE)" + "inputs_train.to_parquet(INPUTS_TRAIN_FILE)\n", + "inputs_test.to_parquet(INPUTS_TEST_FILE)\n", + "targets_train.to_parquet(TARGETS_TRAIN_FILE)\n", + "targets_test.to_parquet(TARGETS_TEST_FILE)\n", + "inputs_train_sample.to_parquet(INPUTS_SAMPLE_FILE)\n", + "targets_train_sample.to_parquet(TARGETS_SAMPLE_FILE)" ] } ], @@ -650,7 +711,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.0" + "version": "3.12.4" } }, "nbformat": 4, diff --git a/notebooks/prototype.ipynb b/notebooks/prototype.ipynb index b457eaf..7d222f6 100644 --- a/notebooks/prototype.ipynb +++ b/notebooks/prototype.ipynb @@ -106737,25 +106737,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/fmind/mlops-python-package/.venv/lib/python3.12/site-packages/sklearn/pipeline.py:408: UserWarning:\n", + "/home/fmind/mlops-python-package/.venv/lib/python3.12/site-packages/joblib/memory.py:577: UserWarning:\n", "\n", - "Persisting input arguments took 0.80s to run.If this happens often in your code, it can cause performance problems (results will be correct in all cases). The reason for this is probably some large input arguments for a wrapped function.\n", - "\n", - "/home/fmind/mlops-python-package/.venv/lib/python3.12/site-packages/sklearn/pipeline.py:408: UserWarning:\n", - "\n", - "Persisting input arguments took 0.78s to run.If this happens often in your code, it can cause performance problems (results will be correct in all cases). The reason for this is probably some large input arguments for a wrapped function.\n", - "\n", - "/home/fmind/mlops-python-package/.venv/lib/python3.12/site-packages/sklearn/pipeline.py:408: UserWarning:\n", - "\n", - "Persisting input arguments took 0.90s to run.If this happens often in your code, it can cause performance problems (results will be correct in all cases). The reason for this is probably some large input arguments for a wrapped function.\n", - "\n", - "/home/fmind/mlops-python-package/.venv/lib/python3.12/site-packages/sklearn/pipeline.py:408: UserWarning:\n", - "\n", - "Persisting input arguments took 0.96s to run.If this happens often in your code, it can cause performance problems (results will be correct in all cases). The reason for this is probably some large input arguments for a wrapped function.\n", - "\n", - "/home/fmind/mlops-python-package/.venv/lib/python3.12/site-packages/sklearn/pipeline.py:408: UserWarning:\n", - "\n", - "Persisting input arguments took 1.04s to run.If this happens often in your code, it can cause performance problems (results will be correct in all cases). The reason for this is probably some large input arguments for a wrapped function.\n", + "Persisting input arguments took 1.02s to run.If this happens often in your code, it can cause performance problems (results will be correct in all cases). The reason for this is probably some large input arguments for a wrapped function.\n", "\n" ] }, @@ -107330,10 +107314,10 @@ " \n", " \n", " 4\n", - " 8.870042\n", - " 1.365375\n", - " 0.056343\n", - " 0.005585\n", + " 9.851526\n", + " 2.065956\n", + " 0.071210\n", + " 0.029418\n", " 20\n", " 200\n", " {'regressor__max_depth': 20, 'regressor__n_est...\n", @@ -107347,10 +107331,10 @@ " \n", " \n", " 1\n", - " 7.606831\n", - " 0.860855\n", - " 0.050878\n", - " 0.003308\n", + " 6.918022\n", + " 0.886340\n", + " 0.043904\n", + " 0.005060\n", " 15\n", " 200\n", " {'regressor__max_depth': 15, 'regressor__n_est...\n", @@ -107364,10 +107348,10 @@ " \n", " \n", " 5\n", - " 10.341928\n", - " 1.903503\n", - " 0.066688\n", - " 0.008134\n", + " 11.964708\n", + " 1.272631\n", + " 0.074480\n", + " 0.013998\n", " 20\n", " 250\n", " {'regressor__max_depth': 20, 'regressor__n_est...\n", @@ -107381,10 +107365,10 @@ " \n", " \n", " 7\n", - " 8.646172\n", - " 1.280304\n", - " 0.057035\n", - " 0.006029\n", + " 8.290697\n", + " 1.105596\n", + " 0.049447\n", + " 0.004403\n", " 25\n", " 200\n", " {'regressor__max_depth': 25, 'regressor__n_est...\n", @@ -107398,10 +107382,10 @@ " \n", " \n", " 2\n", - " 9.656019\n", - " 1.224665\n", - " 0.064132\n", - " 0.006463\n", + " 8.716824\n", + " 1.402426\n", + " 0.055110\n", + " 0.008181\n", " 15\n", " 250\n", " {'regressor__max_depth': 15, 'regressor__n_est...\n", @@ -107419,11 +107403,11 @@ ], "text/plain": [ " mean_fit_time std_fit_time mean_score_time std_score_time \\\n", - "4 8.870042 1.365375 0.056343 0.005585 \n", - "1 7.606831 0.860855 0.050878 0.003308 \n", - "5 10.341928 1.903503 0.066688 0.008134 \n", - "7 8.646172 1.280304 0.057035 0.006029 \n", - "2 9.656019 1.224665 0.064132 0.006463 \n", + "4 9.851526 2.065956 0.071210 0.029418 \n", + "1 6.918022 0.886340 0.043904 0.005060 \n", + "5 11.964708 1.272631 0.074480 0.013998 \n", + "7 8.290697 1.105596 0.049447 0.004403 \n", + "2 8.716824 1.402426 0.055110 0.008181 \n", "\n", " param_regressor__max_depth param_regressor__n_estimators \\\n", "4 20 200 \n", @@ -113455,9 +113439,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/fmind/mlops-python-package/.venv/lib/python3.12/site-packages/sklearn/pipeline.py:408: UserWarning:\n", + "/home/fmind/mlops-python-package/.venv/lib/python3.12/site-packages/joblib/memory.py:577: UserWarning:\n", "\n", - "Persisting input arguments took 0.62s to run.If this happens often in your code, it can cause performance problems (results will be correct in all cases). The reason for this is probably some large input arguments for a wrapped function.\n", + "Persisting input arguments took 0.54s to run.If this happens often in your code, it can cause performance problems (results will be correct in all cases). The reason for this is probably some large input arguments for a wrapped function.\n", "\n" ] }, @@ -116323,7 +116307,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.2" + "version": "3.12.4" }, "orig_nbformat": 4 }, diff --git a/poetry.lock b/poetry.lock index 1d9fbc6..9a13b56 100644 --- a/poetry.lock +++ b/poetry.lock @@ -67,13 +67,13 @@ files = [ [[package]] name = "argcomplete" -version = "3.3.0" +version = "3.4.0" description = "Bash tab completion for argparse" optional = false python-versions = ">=3.8" files = [ - {file = "argcomplete-3.3.0-py3-none-any.whl", hash = "sha256:c168c3723482c031df3c207d4ba8fa702717ccb9fc0bfe4117166c1f537b4a54"}, - {file = "argcomplete-3.3.0.tar.gz", hash = "sha256:fd03ff4a5b9e6580569d34b273f741e85cd9e072f3feeeee3eba4891c70eda62"}, + {file = "argcomplete-3.4.0-py3-none-any.whl", hash = "sha256:69a79e083a716173e5532e0fa3bef45f793f4e61096cf52b5a42c0211c8b8aa5"}, + {file = "argcomplete-3.4.0.tar.gz", hash = "sha256:c2abcdfe1be8ace47ba777d4fce319eb13bf8ad9dace8d085dcad6eded88057f"}, ] [package.extras] @@ -153,24 +153,24 @@ files = [ [[package]] name = "cachetools" -version = "5.3.3" +version = "5.4.0" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, - {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, + {file = "cachetools-5.4.0-py3-none-any.whl", hash = "sha256:3ae3b49a3d5e28a77a0be2b37dbcb89005058959cb2323858c2657c4a8cab474"}, + {file = "cachetools-5.4.0.tar.gz", hash = "sha256:b8adc2e7c07f105ced7bc56dbb6dfbe7c4a00acce20e2227b3f355be89bc6827"}, ] [[package]] name = "certifi" -version = "2024.6.2" +version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, - {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] @@ -402,21 +402,20 @@ test = ["pytest"] [[package]] name = "commitizen" -version = "3.27.0" +version = "3.28.0" description = "Python commitizen client tool" optional = false python-versions = ">=3.8" files = [ - {file = "commitizen-3.27.0-py3-none-any.whl", hash = "sha256:11948fa563d5ad5464baf09eaacff3cf8cbade1ca029ed9c4978f2227f033130"}, - {file = "commitizen-3.27.0.tar.gz", hash = "sha256:5874d0c7e8e1be3b75b1b0a2269cffe3dd5c843b860d84b0bdbb9ea86e3474b8"}, + {file = "commitizen-3.28.0-py3-none-any.whl", hash = "sha256:372dba10bb082be0e571cfa9ac0946f4333c3f4b2e242fbe32ae2f2afea143e4"}, + {file = "commitizen-3.28.0.tar.gz", hash = "sha256:de3a90b3246233260649e423963cd702d56a3b499ea02886a6412ebfb76f9462"}, ] [package.dependencies] -argcomplete = ">=1.12.1,<3.4" +argcomplete = ">=1.12.1,<3.5" charset-normalizer = ">=2.1.0,<4" colorama = ">=0.4.1,<0.5.0" decli = ">=0.6.0,<0.7.0" -importlib_metadata = ">=4.13,<8" jinja2 = ">=2.10.3" packaging = ">=19" pyyaml = ">=3.08" @@ -489,63 +488,63 @@ test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.5.4" +version = "7.6.0" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"}, - {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"}, - {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"}, - {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"}, - {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"}, - {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"}, - {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"}, - {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"}, - {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"}, - {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"}, - {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"}, - {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"}, - {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"}, - {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"}, - {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"}, - {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"}, - {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"}, - {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"}, - {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"}, - {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"}, - {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"}, - {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"}, + {file = "coverage-7.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd"}, + {file = "coverage-7.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb"}, + {file = "coverage-7.6.0-cp310-cp310-win32.whl", hash = "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c"}, + {file = "coverage-7.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169"}, + {file = "coverage-7.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933"}, + {file = "coverage-7.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63"}, + {file = "coverage-7.6.0-cp311-cp311-win32.whl", hash = "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713"}, + {file = "coverage-7.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605"}, + {file = "coverage-7.6.0-cp312-cp312-win32.whl", hash = "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da"}, + {file = "coverage-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67"}, + {file = "coverage-7.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b"}, + {file = "coverage-7.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b"}, + {file = "coverage-7.6.0-cp38-cp38-win32.whl", hash = "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428"}, + {file = "coverage-7.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8"}, + {file = "coverage-7.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c"}, + {file = "coverage-7.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd"}, + {file = "coverage-7.6.0-cp39-cp39-win32.whl", hash = "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2"}, + {file = "coverage-7.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca"}, + {file = "coverage-7.6.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6"}, + {file = "coverage-7.6.0.tar.gz", hash = "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51"}, ] [package.extras] @@ -762,53 +761,53 @@ dotenv = ["python-dotenv"] [[package]] name = "fonttools" -version = "4.53.0" +version = "4.53.1" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.53.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:52a6e0a7a0bf611c19bc8ec8f7592bdae79c8296c70eb05917fd831354699b20"}, - {file = "fonttools-4.53.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:099634631b9dd271d4a835d2b2a9e042ccc94ecdf7e2dd9f7f34f7daf333358d"}, - {file = "fonttools-4.53.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e40013572bfb843d6794a3ce076c29ef4efd15937ab833f520117f8eccc84fd6"}, - {file = "fonttools-4.53.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715b41c3e231f7334cbe79dfc698213dcb7211520ec7a3bc2ba20c8515e8a3b5"}, - {file = "fonttools-4.53.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74ae2441731a05b44d5988d3ac2cf784d3ee0a535dbed257cbfff4be8bb49eb9"}, - {file = "fonttools-4.53.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:95db0c6581a54b47c30860d013977b8a14febc206c8b5ff562f9fe32738a8aca"}, - {file = "fonttools-4.53.0-cp310-cp310-win32.whl", hash = "sha256:9cd7a6beec6495d1dffb1033d50a3f82dfece23e9eb3c20cd3c2444d27514068"}, - {file = "fonttools-4.53.0-cp310-cp310-win_amd64.whl", hash = "sha256:daaef7390e632283051e3cf3e16aff2b68b247e99aea916f64e578c0449c9c68"}, - {file = "fonttools-4.53.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a209d2e624ba492df4f3bfad5996d1f76f03069c6133c60cd04f9a9e715595ec"}, - {file = "fonttools-4.53.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f520d9ac5b938e6494f58a25c77564beca7d0199ecf726e1bd3d56872c59749"}, - {file = "fonttools-4.53.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eceef49f457253000e6a2d0f7bd08ff4e9fe96ec4ffce2dbcb32e34d9c1b8161"}, - {file = "fonttools-4.53.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1f3e34373aa16045484b4d9d352d4c6b5f9f77ac77a178252ccbc851e8b2ee"}, - {file = "fonttools-4.53.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:28d072169fe8275fb1a0d35e3233f6df36a7e8474e56cb790a7258ad822b6fd6"}, - {file = "fonttools-4.53.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4a2a6ba400d386e904fd05db81f73bee0008af37799a7586deaa4aef8cd5971e"}, - {file = "fonttools-4.53.0-cp311-cp311-win32.whl", hash = "sha256:bb7273789f69b565d88e97e9e1da602b4ee7ba733caf35a6c2affd4334d4f005"}, - {file = "fonttools-4.53.0-cp311-cp311-win_amd64.whl", hash = "sha256:9fe9096a60113e1d755e9e6bda15ef7e03391ee0554d22829aa506cdf946f796"}, - {file = "fonttools-4.53.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d8f191a17369bd53a5557a5ee4bab91d5330ca3aefcdf17fab9a497b0e7cff7a"}, - {file = "fonttools-4.53.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:93156dd7f90ae0a1b0e8871032a07ef3178f553f0c70c386025a808f3a63b1f4"}, - {file = "fonttools-4.53.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bff98816cb144fb7b85e4b5ba3888a33b56ecef075b0e95b95bcd0a5fbf20f06"}, - {file = "fonttools-4.53.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:973d030180eca8255b1bce6ffc09ef38a05dcec0e8320cc9b7bcaa65346f341d"}, - {file = "fonttools-4.53.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c4ee5a24e281fbd8261c6ab29faa7fd9a87a12e8c0eed485b705236c65999109"}, - {file = "fonttools-4.53.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bd5bc124fae781a4422f61b98d1d7faa47985f663a64770b78f13d2c072410c2"}, - {file = "fonttools-4.53.0-cp312-cp312-win32.whl", hash = "sha256:a239afa1126b6a619130909c8404070e2b473dd2b7fc4aacacd2e763f8597fea"}, - {file = "fonttools-4.53.0-cp312-cp312-win_amd64.whl", hash = "sha256:45b4afb069039f0366a43a5d454bc54eea942bfb66b3fc3e9a2c07ef4d617380"}, - {file = "fonttools-4.53.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:93bc9e5aaa06ff928d751dc6be889ff3e7d2aa393ab873bc7f6396a99f6fbb12"}, - {file = "fonttools-4.53.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2367d47816cc9783a28645bc1dac07f8ffc93e0f015e8c9fc674a5b76a6da6e4"}, - {file = "fonttools-4.53.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:907fa0b662dd8fc1d7c661b90782ce81afb510fc4b7aa6ae7304d6c094b27bce"}, - {file = "fonttools-4.53.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e0ad3c6ea4bd6a289d958a1eb922767233f00982cf0fe42b177657c86c80a8f"}, - {file = "fonttools-4.53.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:73121a9b7ff93ada888aaee3985a88495489cc027894458cb1a736660bdfb206"}, - {file = "fonttools-4.53.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ee595d7ba9bba130b2bec555a40aafa60c26ce68ed0cf509983e0f12d88674fd"}, - {file = "fonttools-4.53.0-cp38-cp38-win32.whl", hash = "sha256:fca66d9ff2ac89b03f5aa17e0b21a97c21f3491c46b583bb131eb32c7bab33af"}, - {file = "fonttools-4.53.0-cp38-cp38-win_amd64.whl", hash = "sha256:31f0e3147375002aae30696dd1dc596636abbd22fca09d2e730ecde0baad1d6b"}, - {file = "fonttools-4.53.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d6166192dcd925c78a91d599b48960e0a46fe565391c79fe6de481ac44d20ac"}, - {file = "fonttools-4.53.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef50ec31649fbc3acf6afd261ed89d09eb909b97cc289d80476166df8438524d"}, - {file = "fonttools-4.53.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f193f060391a455920d61684a70017ef5284ccbe6023bb056e15e5ac3de11d1"}, - {file = "fonttools-4.53.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba9f09ff17f947392a855e3455a846f9855f6cf6bec33e9a427d3c1d254c712f"}, - {file = "fonttools-4.53.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0c555e039d268445172b909b1b6bdcba42ada1cf4a60e367d68702e3f87e5f64"}, - {file = "fonttools-4.53.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a4788036201c908079e89ae3f5399b33bf45b9ea4514913f4dbbe4fac08efe0"}, - {file = "fonttools-4.53.0-cp39-cp39-win32.whl", hash = "sha256:d1a24f51a3305362b94681120c508758a88f207fa0a681c16b5a4172e9e6c7a9"}, - {file = "fonttools-4.53.0-cp39-cp39-win_amd64.whl", hash = "sha256:1e677bfb2b4bd0e5e99e0f7283e65e47a9814b0486cb64a41adf9ef110e078f2"}, - {file = "fonttools-4.53.0-py3-none-any.whl", hash = "sha256:6b4f04b1fbc01a3569d63359f2227c89ab294550de277fd09d8fca6185669fa4"}, - {file = "fonttools-4.53.0.tar.gz", hash = "sha256:c93ed66d32de1559b6fc348838c7572d5c0ac1e4a258e76763a5caddd8944002"}, + {file = "fonttools-4.53.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397"}, + {file = "fonttools-4.53.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3"}, + {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d"}, + {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0"}, + {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41"}, + {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f"}, + {file = "fonttools-4.53.1-cp310-cp310-win32.whl", hash = "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4"}, + {file = "fonttools-4.53.1-cp310-cp310-win_amd64.whl", hash = "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671"}, + {file = "fonttools-4.53.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1"}, + {file = "fonttools-4.53.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923"}, + {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719"}, + {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3"}, + {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb"}, + {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2"}, + {file = "fonttools-4.53.1-cp311-cp311-win32.whl", hash = "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88"}, + {file = "fonttools-4.53.1-cp311-cp311-win_amd64.whl", hash = "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02"}, + {file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"}, + {file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"}, + {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60"}, + {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f"}, + {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2"}, + {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f"}, + {file = "fonttools-4.53.1-cp312-cp312-win32.whl", hash = "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670"}, + {file = "fonttools-4.53.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab"}, + {file = "fonttools-4.53.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749"}, + {file = "fonttools-4.53.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2"}, + {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb"}, + {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f"}, + {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d"}, + {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169"}, + {file = "fonttools-4.53.1-cp38-cp38-win32.whl", hash = "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d"}, + {file = "fonttools-4.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8"}, + {file = "fonttools-4.53.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a"}, + {file = "fonttools-4.53.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31"}, + {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c"}, + {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407"}, + {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb"}, + {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122"}, + {file = "fonttools-4.53.1-cp39-cp39-win32.whl", hash = "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb"}, + {file = "fonttools-4.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb"}, + {file = "fonttools-4.53.1-py3-none-any.whl", hash = "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d"}, + {file = "fonttools-4.53.1.tar.gz", hash = "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4"}, ] [package.extras] @@ -996,13 +995,13 @@ tornado = ["tornado (>=0.2)"] [[package]] name = "identify" -version = "2.5.36" +version = "2.6.0" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, - {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, + {file = "identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0"}, + {file = "identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf"}, ] [package.extras] @@ -1062,13 +1061,13 @@ files = [ [[package]] name = "ipykernel" -version = "6.29.4" +version = "6.29.5" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.29.4-py3-none-any.whl", hash = "sha256:1181e653d95c6808039c509ef8e67c4126b3b3af7781496c7cbfb5ed938a27da"}, - {file = "ipykernel-6.29.4.tar.gz", hash = "sha256:3d44070060f9475ac2092b760123fadf105d2e2493c24848b6691a7c4f42af5c"}, + {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, + {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, ] [package.dependencies] @@ -1188,13 +1187,13 @@ files = [ [[package]] name = "jsonschema" -version = "4.22.0" +version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, - {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, ] [package.dependencies] @@ -1205,7 +1204,7 @@ rpds-py = ">=0.7.1" [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] [[package]] name = "jsonschema-specifications" @@ -1376,6 +1375,36 @@ files = [ {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, ] +[[package]] +name = "llvmlite" +version = "0.43.0" +description = "lightweight wrapper around basic LLVM functionality" +optional = false +python-versions = ">=3.9" +files = [ + {file = "llvmlite-0.43.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a289af9a1687c6cf463478f0fa8e8aa3b6fb813317b0d70bf1ed0759eab6f761"}, + {file = "llvmlite-0.43.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d4fd101f571a31acb1559ae1af30f30b1dc4b3186669f92ad780e17c81e91bc"}, + {file = "llvmlite-0.43.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d434ec7e2ce3cc8f452d1cd9a28591745de022f931d67be688a737320dfcead"}, + {file = "llvmlite-0.43.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6912a87782acdff6eb8bf01675ed01d60ca1f2551f8176a300a886f09e836a6a"}, + {file = "llvmlite-0.43.0-cp310-cp310-win_amd64.whl", hash = "sha256:14f0e4bf2fd2d9a75a3534111e8ebeb08eda2f33e9bdd6dfa13282afacdde0ed"}, + {file = "llvmlite-0.43.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8d0618cb9bfe40ac38a9633f2493d4d4e9fcc2f438d39a4e854f39cc0f5f98"}, + {file = "llvmlite-0.43.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0a9a1a39d4bf3517f2af9d23d479b4175ead205c592ceeb8b89af48a327ea57"}, + {file = "llvmlite-0.43.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1da416ab53e4f7f3bc8d4eeba36d801cc1894b9fbfbf2022b29b6bad34a7df2"}, + {file = "llvmlite-0.43.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977525a1e5f4059316b183fb4fd34fa858c9eade31f165427a3977c95e3ee749"}, + {file = "llvmlite-0.43.0-cp311-cp311-win_amd64.whl", hash = "sha256:d5bd550001d26450bd90777736c69d68c487d17bf371438f975229b2b8241a91"}, + {file = "llvmlite-0.43.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f99b600aa7f65235a5a05d0b9a9f31150c390f31261f2a0ba678e26823ec38f7"}, + {file = "llvmlite-0.43.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:35d80d61d0cda2d767f72de99450766250560399edc309da16937b93d3b676e7"}, + {file = "llvmlite-0.43.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eccce86bba940bae0d8d48ed925f21dbb813519169246e2ab292b5092aba121f"}, + {file = "llvmlite-0.43.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df6509e1507ca0760787a199d19439cc887bfd82226f5af746d6977bd9f66844"}, + {file = "llvmlite-0.43.0-cp312-cp312-win_amd64.whl", hash = "sha256:7a2872ee80dcf6b5dbdc838763d26554c2a18aa833d31a2635bff16aafefb9c9"}, + {file = "llvmlite-0.43.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cd2a7376f7b3367019b664c21f0c61766219faa3b03731113ead75107f3b66c"}, + {file = "llvmlite-0.43.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18e9953c748b105668487b7c81a3e97b046d8abf95c4ddc0cd3c94f4e4651ae8"}, + {file = "llvmlite-0.43.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74937acd22dc11b33946b67dca7680e6d103d6e90eeaaaf932603bec6fe7b03a"}, + {file = "llvmlite-0.43.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc9efc739cc6ed760f795806f67889923f7274276f0eb45092a1473e40d9b867"}, + {file = "llvmlite-0.43.0-cp39-cp39-win_amd64.whl", hash = "sha256:47e147cdda9037f94b399bf03bfd8a6b6b1f2f90be94a454e3386f006455a9b4"}, + {file = "llvmlite-0.43.0.tar.gz", hash = "sha256:ae2b5b5c3ef67354824fb75517c8db5fbe93bc02cd9671f3c62271626bc041d5"}, +] + [[package]] name = "loguru" version = "0.7.2" @@ -1523,40 +1552,40 @@ files = [ [[package]] name = "matplotlib" -version = "3.9.0" +version = "3.9.1" description = "Python plotting package" optional = false python-versions = ">=3.9" files = [ - {file = "matplotlib-3.9.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2bcee1dffaf60fe7656183ac2190bd630842ff87b3153afb3e384d966b57fe56"}, - {file = "matplotlib-3.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3f988bafb0fa39d1074ddd5bacd958c853e11def40800c5824556eb630f94d3b"}, - {file = "matplotlib-3.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe428e191ea016bb278758c8ee82a8129c51d81d8c4bc0846c09e7e8e9057241"}, - {file = "matplotlib-3.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaf3978060a106fab40c328778b148f590e27f6fa3cd15a19d6892575bce387d"}, - {file = "matplotlib-3.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e7f03e5cbbfacdd48c8ea394d365d91ee8f3cae7e6ec611409927b5ed997ee4"}, - {file = "matplotlib-3.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:13beb4840317d45ffd4183a778685e215939be7b08616f431c7795276e067463"}, - {file = "matplotlib-3.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:063af8587fceeac13b0936c42a2b6c732c2ab1c98d38abc3337e430e1ff75e38"}, - {file = "matplotlib-3.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a2fa6d899e17ddca6d6526cf6e7ba677738bf2a6a9590d702c277204a7c6152"}, - {file = "matplotlib-3.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550cdda3adbd596078cca7d13ed50b77879104e2e46392dcd7c75259d8f00e85"}, - {file = "matplotlib-3.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cce0f31b351e3551d1f3779420cf8f6ec0d4a8cf9c0237a3b549fd28eb4abb"}, - {file = "matplotlib-3.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c53aeb514ccbbcbab55a27f912d79ea30ab21ee0531ee2c09f13800efb272674"}, - {file = "matplotlib-3.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:a5be985db2596d761cdf0c2eaf52396f26e6a64ab46bd8cd810c48972349d1be"}, - {file = "matplotlib-3.9.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c79f3a585f1368da6049318bdf1f85568d8d04b2e89fc24b7e02cc9b62017382"}, - {file = "matplotlib-3.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bdd1ecbe268eb3e7653e04f451635f0fb0f77f07fd070242b44c076c9106da84"}, - {file = "matplotlib-3.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d38e85a1a6d732f645f1403ce5e6727fd9418cd4574521d5803d3d94911038e5"}, - {file = "matplotlib-3.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a490715b3b9984fa609116481b22178348c1a220a4499cda79132000a79b4db"}, - {file = "matplotlib-3.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8146ce83cbc5dc71c223a74a1996d446cd35cfb6a04b683e1446b7e6c73603b7"}, - {file = "matplotlib-3.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:d91a4ffc587bacf5c4ce4ecfe4bcd23a4b675e76315f2866e588686cc97fccdf"}, - {file = "matplotlib-3.9.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:616fabf4981a3b3c5a15cd95eba359c8489c4e20e03717aea42866d8d0465956"}, - {file = "matplotlib-3.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cd53c79fd02f1c1808d2cfc87dd3cf4dbc63c5244a58ee7944497107469c8d8a"}, - {file = "matplotlib-3.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06a478f0d67636554fa78558cfbcd7b9dba85b51f5c3b5a0c9be49010cf5f321"}, - {file = "matplotlib-3.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81c40af649d19c85f8073e25e5806926986806fa6d54be506fbf02aef47d5a89"}, - {file = "matplotlib-3.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52146fc3bd7813cc784562cb93a15788be0b2875c4655e2cc6ea646bfa30344b"}, - {file = "matplotlib-3.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:0fc51eaa5262553868461c083d9adadb11a6017315f3a757fc45ec6ec5f02888"}, - {file = "matplotlib-3.9.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bd4f2831168afac55b881db82a7730992aa41c4f007f1913465fb182d6fb20c0"}, - {file = "matplotlib-3.9.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:290d304e59be2b33ef5c2d768d0237f5bd132986bdcc66f80bc9bcc300066a03"}, - {file = "matplotlib-3.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ff2e239c26be4f24bfa45860c20ffccd118d270c5b5d081fa4ea409b5469fcd"}, - {file = "matplotlib-3.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:af4001b7cae70f7eaacfb063db605280058246de590fa7874f00f62259f2df7e"}, - {file = "matplotlib-3.9.0.tar.gz", hash = "sha256:e6d29ea6c19e34b30fb7d88b7081f869a03014f66fe06d62cc77d5a6ea88ed7a"}, + {file = "matplotlib-3.9.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7ccd6270066feb9a9d8e0705aa027f1ff39f354c72a87efe8fa07632f30fc6bb"}, + {file = "matplotlib-3.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:591d3a88903a30a6d23b040c1e44d1afdd0d778758d07110eb7596f811f31842"}, + {file = "matplotlib-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd2a59ff4b83d33bca3b5ec58203cc65985367812cb8c257f3e101632be86d92"}, + {file = "matplotlib-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fc001516ffcf1a221beb51198b194d9230199d6842c540108e4ce109ac05cc0"}, + {file = "matplotlib-3.9.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:83c6a792f1465d174c86d06f3ae85a8fe36e6f5964633ae8106312ec0921fdf5"}, + {file = "matplotlib-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:421851f4f57350bcf0811edd754a708d2275533e84f52f6760b740766c6747a7"}, + {file = "matplotlib-3.9.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b3fce58971b465e01b5c538f9d44915640c20ec5ff31346e963c9e1cd66fa812"}, + {file = "matplotlib-3.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a973c53ad0668c53e0ed76b27d2eeeae8799836fd0d0caaa4ecc66bf4e6676c0"}, + {file = "matplotlib-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82cd5acf8f3ef43f7532c2f230249720f5dc5dd40ecafaf1c60ac8200d46d7eb"}, + {file = "matplotlib-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab38a4f3772523179b2f772103d8030215b318fef6360cb40558f585bf3d017f"}, + {file = "matplotlib-3.9.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2315837485ca6188a4b632c5199900e28d33b481eb083663f6a44cfc8987ded3"}, + {file = "matplotlib-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:a0c977c5c382f6696caf0bd277ef4f936da7e2aa202ff66cad5f0ac1428ee15b"}, + {file = "matplotlib-3.9.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:565d572efea2b94f264dd86ef27919515aa6d629252a169b42ce5f570db7f37b"}, + {file = "matplotlib-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d397fd8ccc64af2ec0af1f0efc3bacd745ebfb9d507f3f552e8adb689ed730a"}, + {file = "matplotlib-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26040c8f5121cd1ad712abffcd4b5222a8aec3a0fe40bc8542c94331deb8780d"}, + {file = "matplotlib-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12cb1837cffaac087ad6b44399d5e22b78c729de3cdae4629e252067b705e2b"}, + {file = "matplotlib-3.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0e835c6988edc3d2d08794f73c323cc62483e13df0194719ecb0723b564e0b5c"}, + {file = "matplotlib-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:44a21d922f78ce40435cb35b43dd7d573cf2a30138d5c4b709d19f00e3907fd7"}, + {file = "matplotlib-3.9.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0c584210c755ae921283d21d01f03a49ef46d1afa184134dd0f95b0202ee6f03"}, + {file = "matplotlib-3.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11fed08f34fa682c2b792942f8902e7aefeed400da71f9e5816bea40a7ce28fe"}, + {file = "matplotlib-3.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0000354e32efcfd86bda75729716b92f5c2edd5b947200be9881f0a671565c33"}, + {file = "matplotlib-3.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4db17fea0ae3aceb8e9ac69c7e3051bae0b3d083bfec932240f9bf5d0197a049"}, + {file = "matplotlib-3.9.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:208cbce658b72bf6a8e675058fbbf59f67814057ae78165d8a2f87c45b48d0ff"}, + {file = "matplotlib-3.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:dc23f48ab630474264276be156d0d7710ac6c5a09648ccdf49fef9200d8cbe80"}, + {file = "matplotlib-3.9.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3fda72d4d472e2ccd1be0e9ccb6bf0d2eaf635e7f8f51d737ed7e465ac020cb3"}, + {file = "matplotlib-3.9.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:84b3ba8429935a444f1fdc80ed930babbe06725bcf09fbeb5c8757a2cd74af04"}, + {file = "matplotlib-3.9.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b918770bf3e07845408716e5bbda17eadfc3fcbd9307dc67f37d6cf834bb3d98"}, + {file = "matplotlib-3.9.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f1f2e5d29e9435c97ad4c36fb6668e89aee13d48c75893e25cef064675038ac9"}, + {file = "matplotlib-3.9.1.tar.gz", hash = "sha256:de06b19b8db95dd33d0dc17c926c7c9ebed9f572074b6fac4f65068a6814d010"}, ] [package.dependencies] @@ -1600,13 +1629,13 @@ files = [ [[package]] name = "mlflow" -version = "2.14.1" +version = "2.14.3" description = "MLflow is an open source platform for the complete machine learning lifecycle" optional = false python-versions = ">=3.8" files = [ - {file = "mlflow-2.14.1-py3-none-any.whl", hash = "sha256:0bda38f94468d69a169415b1d751078f1083ddb44646f50854d387bcb6d0b9ec"}, - {file = "mlflow-2.14.1.tar.gz", hash = "sha256:1258ade134b9fbb15b1b0f22b0e9f98b5ff6f5f57575c10adfb255b9331fc587"}, + {file = "mlflow-2.14.3-py3-none-any.whl", hash = "sha256:2de915346c8e34a9d13efbd6469551980923619274db57fd2253621a2c666e18"}, + {file = "mlflow-2.14.3.tar.gz", hash = "sha256:292cae4b83574a0cb223117e224caa6798933078af0233719c2b612bea645617"}, ] [package.dependencies] @@ -1668,43 +1697,43 @@ files = [ [[package]] name = "mypy" -version = "1.10.1" +version = "1.11.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e36f229acfe250dc660790840916eb49726c928e8ce10fbdf90715090fe4ae02"}, - {file = "mypy-1.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:51a46974340baaa4145363b9e051812a2446cf583dfaeba124af966fa44593f7"}, - {file = "mypy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:901c89c2d67bba57aaaca91ccdb659aa3a312de67f23b9dfb059727cce2e2e0a"}, - {file = "mypy-1.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0cd62192a4a32b77ceb31272d9e74d23cd88c8060c34d1d3622db3267679a5d9"}, - {file = "mypy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:a2cbc68cb9e943ac0814c13e2452d2046c2f2b23ff0278e26599224cf164e78d"}, - {file = "mypy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a"}, - {file = "mypy-1.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84"}, - {file = "mypy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f"}, - {file = "mypy-1.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b"}, - {file = "mypy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e"}, - {file = "mypy-1.10.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d8681909f7b44d0b7b86e653ca152d6dff0eb5eb41694e163c6092124f8246d7"}, - {file = "mypy-1.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:378c03f53f10bbdd55ca94e46ec3ba255279706a6aacaecac52ad248f98205d3"}, - {file = "mypy-1.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bacf8f3a3d7d849f40ca6caea5c055122efe70e81480c8328ad29c55c69e93e"}, - {file = "mypy-1.10.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:701b5f71413f1e9855566a34d6e9d12624e9e0a8818a5704d74d6b0402e66c04"}, - {file = "mypy-1.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:3c4c2992f6ea46ff7fce0072642cfb62af7a2484efe69017ed8b095f7b39ef31"}, - {file = "mypy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:604282c886497645ffb87b8f35a57ec773a4a2721161e709a4422c1636ddde5c"}, - {file = "mypy-1.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37fd87cab83f09842653f08de066ee68f1182b9b5282e4634cdb4b407266bade"}, - {file = "mypy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8addf6313777dbb92e9564c5d32ec122bf2c6c39d683ea64de6a1fd98b90fe37"}, - {file = "mypy-1.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5cc3ca0a244eb9a5249c7c583ad9a7e881aa5d7b73c35652296ddcdb33b2b9c7"}, - {file = "mypy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:1b3a2ffce52cc4dbaeee4df762f20a2905aa171ef157b82192f2e2f368eec05d"}, - {file = "mypy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3"}, - {file = "mypy-1.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf"}, - {file = "mypy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531"}, - {file = "mypy-1.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3"}, - {file = "mypy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:97a131ee36ac37ce9581f4220311247ab6cba896b4395b9c87af0675a13a755f"}, - {file = "mypy-1.10.1-py3-none-any.whl", hash = "sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a"}, - {file = "mypy-1.10.1.tar.gz", hash = "sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0"}, + {file = "mypy-1.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3824187c99b893f90c845bab405a585d1ced4ff55421fdf5c84cb7710995229"}, + {file = "mypy-1.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:96f8dbc2c85046c81bcddc246232d500ad729cb720da4e20fce3b542cab91287"}, + {file = "mypy-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a5d8d8dd8613a3e2be3eae829ee891b6b2de6302f24766ff06cb2875f5be9c6"}, + {file = "mypy-1.11.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:72596a79bbfb195fd41405cffa18210af3811beb91ff946dbcb7368240eed6be"}, + {file = "mypy-1.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:35ce88b8ed3a759634cb4eb646d002c4cef0a38f20565ee82b5023558eb90c00"}, + {file = "mypy-1.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:98790025861cb2c3db8c2f5ad10fc8c336ed2a55f4daf1b8b3f877826b6ff2eb"}, + {file = "mypy-1.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:25bcfa75b9b5a5f8d67147a54ea97ed63a653995a82798221cca2a315c0238c1"}, + {file = "mypy-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bea2a0e71c2a375c9fa0ede3d98324214d67b3cbbfcbd55ac8f750f85a414e3"}, + {file = "mypy-1.11.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d2b3d36baac48e40e3064d2901f2fbd2a2d6880ec6ce6358825c85031d7c0d4d"}, + {file = "mypy-1.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:d8e2e43977f0e09f149ea69fd0556623919f816764e26d74da0c8a7b48f3e18a"}, + {file = "mypy-1.11.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1d44c1e44a8be986b54b09f15f2c1a66368eb43861b4e82573026e04c48a9e20"}, + {file = "mypy-1.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cea3d0fb69637944dd321f41bc896e11d0fb0b0aa531d887a6da70f6e7473aba"}, + {file = "mypy-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a83ec98ae12d51c252be61521aa5731f5512231d0b738b4cb2498344f0b840cd"}, + {file = "mypy-1.11.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7b73a856522417beb78e0fb6d33ef89474e7a622db2653bc1285af36e2e3e3d"}, + {file = "mypy-1.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:f2268d9fcd9686b61ab64f077be7ffbc6fbcdfb4103e5dd0cc5eaab53a8886c2"}, + {file = "mypy-1.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:940bfff7283c267ae6522ef926a7887305945f716a7704d3344d6d07f02df850"}, + {file = "mypy-1.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:14f9294528b5f5cf96c721f231c9f5b2733164e02c1c018ed1a0eff8a18005ac"}, + {file = "mypy-1.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7b54c27783991399046837df5c7c9d325d921394757d09dbcbf96aee4649fe9"}, + {file = "mypy-1.11.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:65f190a6349dec29c8d1a1cd4aa71284177aee5949e0502e6379b42873eddbe7"}, + {file = "mypy-1.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:dbe286303241fea8c2ea5466f6e0e6a046a135a7e7609167b07fd4e7baf151bf"}, + {file = "mypy-1.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:104e9c1620c2675420abd1f6c44bab7dd33cc85aea751c985006e83dcd001095"}, + {file = "mypy-1.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f006e955718ecd8d159cee9932b64fba8f86ee6f7728ca3ac66c3a54b0062abe"}, + {file = "mypy-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:becc9111ca572b04e7e77131bc708480cc88a911adf3d0239f974c034b78085c"}, + {file = "mypy-1.11.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6801319fe76c3f3a3833f2b5af7bd2c17bb93c00026a2a1b924e6762f5b19e13"}, + {file = "mypy-1.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:c1a184c64521dc549324ec6ef7cbaa6b351912be9cb5edb803c2808a0d7e85ac"}, + {file = "mypy-1.11.0-py3-none-any.whl", hash = "sha256:56913ec8c7638b0091ef4da6fcc9136896914a9d60d54670a75880c3e5b99ace"}, + {file = "mypy-1.11.0.tar.gz", hash = "sha256:93743608c7348772fdc717af4aeee1997293a1ad04bc0ea6efa15bf65385c538"}, ] [package.dependencies] mypy-extensions = ">=1.0.0" -typing-extensions = ">=4.1.0" +typing-extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] @@ -1766,6 +1795,40 @@ files = [ {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] +[[package]] +name = "numba" +version = "0.60.0" +description = "compiling Python code using LLVM" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numba-0.60.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d761de835cd38fb400d2c26bb103a2726f548dc30368853121d66201672e651"}, + {file = "numba-0.60.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:159e618ef213fba758837f9837fb402bbe65326e60ba0633dbe6c7f274d42c1b"}, + {file = "numba-0.60.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1527dc578b95c7c4ff248792ec33d097ba6bef9eda466c948b68dfc995c25781"}, + {file = "numba-0.60.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe0b28abb8d70f8160798f4de9d486143200f34458d34c4a214114e445d7124e"}, + {file = "numba-0.60.0-cp310-cp310-win_amd64.whl", hash = "sha256:19407ced081d7e2e4b8d8c36aa57b7452e0283871c296e12d798852bc7d7f198"}, + {file = "numba-0.60.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a17b70fc9e380ee29c42717e8cc0bfaa5556c416d94f9aa96ba13acb41bdece8"}, + {file = "numba-0.60.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3fb02b344a2a80efa6f677aa5c40cd5dd452e1b35f8d1c2af0dfd9ada9978e4b"}, + {file = "numba-0.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5f4fde652ea604ea3c86508a3fb31556a6157b2c76c8b51b1d45eb40c8598703"}, + {file = "numba-0.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4142d7ac0210cc86432b818338a2bc368dc773a2f5cf1e32ff7c5b378bd63ee8"}, + {file = "numba-0.60.0-cp311-cp311-win_amd64.whl", hash = "sha256:cac02c041e9b5bc8cf8f2034ff6f0dbafccd1ae9590dc146b3a02a45e53af4e2"}, + {file = "numba-0.60.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d7da4098db31182fc5ffe4bc42c6f24cd7d1cb8a14b59fd755bfee32e34b8404"}, + {file = "numba-0.60.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:38d6ea4c1f56417076ecf8fc327c831ae793282e0ff51080c5094cb726507b1c"}, + {file = "numba-0.60.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:62908d29fb6a3229c242e981ca27e32a6e606cc253fc9e8faeb0e48760de241e"}, + {file = "numba-0.60.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0ebaa91538e996f708f1ab30ef4d3ddc344b64b5227b67a57aa74f401bb68b9d"}, + {file = "numba-0.60.0-cp312-cp312-win_amd64.whl", hash = "sha256:f75262e8fe7fa96db1dca93d53a194a38c46da28b112b8a4aca168f0df860347"}, + {file = "numba-0.60.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:01ef4cd7d83abe087d644eaa3d95831b777aa21d441a23703d649e06b8e06b74"}, + {file = "numba-0.60.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:819a3dfd4630d95fd574036f99e47212a1af41cbcb019bf8afac63ff56834449"}, + {file = "numba-0.60.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b983bd6ad82fe868493012487f34eae8bf7dd94654951404114f23c3466d34b"}, + {file = "numba-0.60.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c151748cd269ddeab66334bd754817ffc0cabd9433acb0f551697e5151917d25"}, + {file = "numba-0.60.0-cp39-cp39-win_amd64.whl", hash = "sha256:3031547a015710140e8c87226b4cfe927cac199835e5bf7d4fe5cb64e814e3ab"}, + {file = "numba-0.60.0.tar.gz", hash = "sha256:5df6158e5584eece5fc83294b949fd30b9f1125df7708862205217e068aabf16"}, +] + +[package.dependencies] +llvmlite = "==0.43.*" +numpy = ">=1.22,<2.1" + [[package]] name = "numpy" version = "1.26.4" @@ -1966,13 +2029,13 @@ types-pytz = ">=2022.1.1" [[package]] name = "pandera" -version = "0.20.1" +version = "0.20.3" description = "A light-weight and flexible data validation and testing tool for statistical data objects." optional = false python-versions = ">=3.7" files = [ - {file = "pandera-0.20.1-py3-none-any.whl", hash = "sha256:ebf5cd5e42bacc451ac332f531cca2d6788a0662a2e565cb8d095e5bc55ebb6c"}, - {file = "pandera-0.20.1.tar.gz", hash = "sha256:eda8d8330d16b2a1ae38eddcb34c4da287ce03c84696f654399a0068663c7e4d"}, + {file = "pandera-0.20.3-py3-none-any.whl", hash = "sha256:0c251a3947d8c6d7a0e26602e78fa425268bc9f448f3a0fded85249b158a65c2"}, + {file = "pandera-0.20.3.tar.gz", hash = "sha256:d8542a68493d2dfe3226c186cc145be8d27535d7edf396178e93811515fe3470"}, ] [package.dependencies] @@ -2062,84 +2125,95 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "10.3.0" +version = "10.4.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, - {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, - {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, - {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, - {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, - {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, - {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, - {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, - {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, - {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, - {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, - {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, - {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, - {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, - {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, - {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, - {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, - {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, - {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, - {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, - {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, - {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, - {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, - {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, - {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, - {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, - {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, - {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, - {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, - {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, - {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, -] - -[package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] @@ -2192,6 +2266,23 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "plyer" +version = "2.1.0" +description = "Platform-independent wrapper for platform-dependent APIs" +optional = false +python-versions = "*" +files = [ + {file = "plyer-2.1.0-py2.py3-none-any.whl", hash = "sha256:1b1772060df8b3045ed4f08231690ec8f7de30f5a004aa1724665a9074eed113"}, + {file = "plyer-2.1.0.tar.gz", hash = "sha256:65b7dfb7e11e07af37a8487eb2aa69524276ef70dad500b07228ce64736baa61"}, +] + +[package.extras] +android = ["pyjnius"] +dev = ["flake8", "mock"] +ios = ["pyobjus"] +macosx = ["pyobjus"] + [[package]] name = "pre-commit" version = "3.7.1" @@ -2286,13 +2377,13 @@ files = [ [[package]] name = "pure-eval" -version = "0.2.2" +version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = false python-versions = "*" files = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, ] [package.extras] @@ -2359,109 +2450,122 @@ files = [ [[package]] name = "pydantic" -version = "2.7.4" +version = "2.8.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.7.4-py3-none-any.whl", hash = "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0"}, - {file = "pydantic-2.7.4.tar.gz", hash = "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52"}, + {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, + {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.18.4" -typing-extensions = ">=4.6.1" +pydantic-core = "2.20.1" +typing-extensions = [ + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, +] [package.extras] email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.18.4" +version = "2.20.1" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"}, - {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"}, - {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"}, - {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"}, - {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"}, - {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"}, - {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"}, - {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"}, - {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"}, - {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"}, - {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"}, - {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"}, - {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"}, - {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"}, - {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"}, - {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"}, - {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"}, - {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"}, - {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"}, - {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"}, - {file = "pydantic_core-2.18.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2"}, - {file = "pydantic_core-2.18.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057"}, - {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b"}, - {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af"}, - {file = "pydantic_core-2.18.4-cp38-none-win32.whl", hash = "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2"}, - {file = "pydantic_core-2.18.4-cp38-none-win_amd64.whl", hash = "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443"}, - {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"}, - {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"}, - {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"}, - {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"}, - {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"}, - {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"}, - {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"}, + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, + {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, + {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, + {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, + {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, + {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, + {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, + {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, + {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, + {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, + {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, + {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, + {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, + {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, ] [package.dependencies] @@ -2500,6 +2604,17 @@ files = [ [package.extras] windows-terminal = ["colorama (>=0.4.6)"] +[[package]] +name = "pynvml" +version = "11.5.3" +description = "Python utilities for the NVIDIA Management Library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pynvml-11.5.3-py3-none-any.whl", hash = "sha256:a5fba3ab14febda50d19dbda012ef62ae0aed45b7ccc07af0bc5be79223e450c"}, + {file = "pynvml-11.5.3.tar.gz", hash = "sha256:183d223ae487e5f00402d8da06c68c978ef8a9295793ee75559839c6ade7b229"}, +] + [[package]] name = "pyparsing" version = "3.1.2" @@ -2516,20 +2631,20 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "8.2.2" +version = "8.3.1" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, - {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, + {file = "pytest-8.3.1-py3-none-any.whl", hash = "sha256:e9600ccf4f563976e2c99fa02c7624ab938296551f280835ee6516df8bc4ae8c"}, + {file = "pytest-8.3.1.tar.gz", hash = "sha256:7e8e5c5abd6e93cb1cc151f23e57adc31fcf8cfd2a3ff2da63e23f732de35db6"}, ] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" packaging = "*" -pluggy = ">=1.5,<2.0" +pluggy = ">=1.5,<2" [package.extras] dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] @@ -2552,6 +2667,23 @@ pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] +[[package]] +name = "pytest-mock" +version = "3.14.0" +description = "Thin-wrapper around the mock package for easier use with pytest" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, + {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, +] + +[package.dependencies] +pytest = ">=6.2.5" + +[package.extras] +dev = ["pre-commit", "pytest-asyncio", "tox"] + [[package]] name = "pytest-xdist" version = "3.6.1" @@ -2878,183 +3010,180 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.18.1" +version = "0.19.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, - {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, - {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, - {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, - {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, - {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, - {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, - {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, - {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, - {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, - {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, - {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, - {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, - {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, - {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, - {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, - {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, - {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, - {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, + {file = "rpds_py-0.19.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:fb37bd599f031f1a6fb9e58ec62864ccf3ad549cf14bac527dbfa97123edcca4"}, + {file = "rpds_py-0.19.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3384d278df99ec2c6acf701d067147320b864ef6727405d6470838476e44d9e8"}, + {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54548e0be3ac117595408fd4ca0ac9278fde89829b0b518be92863b17ff67a2"}, + {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8eb488ef928cdbc05a27245e52de73c0d7c72a34240ef4d9893fdf65a8c1a955"}, + {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5da93debdfe27b2bfc69eefb592e1831d957b9535e0943a0ee8b97996de21b5"}, + {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:79e205c70afddd41f6ee79a8656aec738492a550247a7af697d5bd1aee14f766"}, + {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:959179efb3e4a27610e8d54d667c02a9feaa86bbabaf63efa7faa4dfa780d4f1"}, + {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a6e605bb9edcf010f54f8b6a590dd23a4b40a8cb141255eec2a03db249bc915b"}, + {file = "rpds_py-0.19.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9133d75dc119a61d1a0ded38fb9ba40a00ef41697cc07adb6ae098c875195a3f"}, + {file = "rpds_py-0.19.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd36b712d35e757e28bf2f40a71e8f8a2d43c8b026d881aa0c617b450d6865c9"}, + {file = "rpds_py-0.19.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:354f3a91718489912f2e0fc331c24eaaf6a4565c080e00fbedb6015857c00582"}, + {file = "rpds_py-0.19.0-cp310-none-win32.whl", hash = "sha256:ebcbf356bf5c51afc3290e491d3722b26aaf5b6af3c1c7f6a1b757828a46e336"}, + {file = "rpds_py-0.19.0-cp310-none-win_amd64.whl", hash = "sha256:75a6076289b2df6c8ecb9d13ff79ae0cad1d5fb40af377a5021016d58cd691ec"}, + {file = "rpds_py-0.19.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6d45080095e585f8c5097897313def60caa2046da202cdb17a01f147fb263b81"}, + {file = "rpds_py-0.19.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5c9581019c96f865483d031691a5ff1cc455feb4d84fc6920a5ffc48a794d8a"}, + {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1540d807364c84516417115c38f0119dfec5ea5c0dd9a25332dea60b1d26fc4d"}, + {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9e65489222b410f79711dc3d2d5003d2757e30874096b2008d50329ea4d0f88c"}, + {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9da6f400eeb8c36f72ef6646ea530d6d175a4f77ff2ed8dfd6352842274c1d8b"}, + {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37f46bb11858717e0efa7893c0f7055c43b44c103e40e69442db5061cb26ed34"}, + {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:071d4adc734de562bd11d43bd134330fb6249769b2f66b9310dab7460f4bf714"}, + {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9625367c8955e4319049113ea4f8fee0c6c1145192d57946c6ffcd8fe8bf48dd"}, + {file = "rpds_py-0.19.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e19509145275d46bc4d1e16af0b57a12d227c8253655a46bbd5ec317e941279d"}, + {file = "rpds_py-0.19.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d438e4c020d8c39961deaf58f6913b1bf8832d9b6f62ec35bd93e97807e9cbc"}, + {file = "rpds_py-0.19.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90bf55d9d139e5d127193170f38c584ed3c79e16638890d2e36f23aa1630b952"}, + {file = "rpds_py-0.19.0-cp311-none-win32.whl", hash = "sha256:8d6ad132b1bc13d05ffe5b85e7a01a3998bf3a6302ba594b28d61b8c2cf13aaf"}, + {file = "rpds_py-0.19.0-cp311-none-win_amd64.whl", hash = "sha256:7ec72df7354e6b7f6eb2a17fa6901350018c3a9ad78e48d7b2b54d0412539a67"}, + {file = "rpds_py-0.19.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:5095a7c838a8647c32aa37c3a460d2c48debff7fc26e1136aee60100a8cd8f68"}, + {file = "rpds_py-0.19.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f2f78ef14077e08856e788fa482107aa602636c16c25bdf59c22ea525a785e9"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7cc6cb44f8636fbf4a934ca72f3e786ba3c9f9ba4f4d74611e7da80684e48d2"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf902878b4af334a09de7a45badbff0389e7cf8dc2e4dcf5f07125d0b7c2656d"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:688aa6b8aa724db1596514751ffb767766e02e5c4a87486ab36b8e1ebc1aedac"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57dbc9167d48e355e2569346b5aa4077f29bf86389c924df25c0a8b9124461fb"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b4cf5a9497874822341c2ebe0d5850fed392034caadc0bad134ab6822c0925b"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8a790d235b9d39c70a466200d506bb33a98e2ee374a9b4eec7a8ac64c2c261fa"}, + {file = "rpds_py-0.19.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1d16089dfa58719c98a1c06f2daceba6d8e3fb9b5d7931af4a990a3c486241cb"}, + {file = "rpds_py-0.19.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bc9128e74fe94650367fe23f37074f121b9f796cabbd2f928f13e9661837296d"}, + {file = "rpds_py-0.19.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c8f77e661ffd96ff104bebf7d0f3255b02aa5d5b28326f5408d6284c4a8b3248"}, + {file = "rpds_py-0.19.0-cp312-none-win32.whl", hash = "sha256:5f83689a38e76969327e9b682be5521d87a0c9e5a2e187d2bc6be4765f0d4600"}, + {file = "rpds_py-0.19.0-cp312-none-win_amd64.whl", hash = "sha256:06925c50f86da0596b9c3c64c3837b2481337b83ef3519e5db2701df695453a4"}, + {file = "rpds_py-0.19.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:52e466bea6f8f3a44b1234570244b1cff45150f59a4acae3fcc5fd700c2993ca"}, + {file = "rpds_py-0.19.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e21cc693045fda7f745c790cb687958161ce172ffe3c5719ca1764e752237d16"}, + {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b31f059878eb1f5da8b2fd82480cc18bed8dcd7fb8fe68370e2e6285fa86da6"}, + {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dd46f309e953927dd018567d6a9e2fb84783963650171f6c5fe7e5c41fd5666"}, + {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34a01a4490e170376cd79258b7f755fa13b1a6c3667e872c8e35051ae857a92b"}, + {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bcf426a8c38eb57f7bf28932e68425ba86def6e756a5b8cb4731d8e62e4e0223"}, + {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f68eea5df6347d3f1378ce992d86b2af16ad7ff4dcb4a19ccdc23dea901b87fb"}, + {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dab8d921b55a28287733263c0e4c7db11b3ee22aee158a4de09f13c93283c62d"}, + {file = "rpds_py-0.19.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6fe87efd7f47266dfc42fe76dae89060038f1d9cb911f89ae7e5084148d1cc08"}, + {file = "rpds_py-0.19.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:535d4b52524a961d220875688159277f0e9eeeda0ac45e766092bfb54437543f"}, + {file = "rpds_py-0.19.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:8b1a94b8afc154fbe36978a511a1f155f9bd97664e4f1f7a374d72e180ceb0ae"}, + {file = "rpds_py-0.19.0-cp38-none-win32.whl", hash = "sha256:7c98298a15d6b90c8f6e3caa6457f4f022423caa5fa1a1ca7a5e9e512bdb77a4"}, + {file = "rpds_py-0.19.0-cp38-none-win_amd64.whl", hash = "sha256:b0da31853ab6e58a11db3205729133ce0df26e6804e93079dee095be3d681dc1"}, + {file = "rpds_py-0.19.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5039e3cef7b3e7a060de468a4a60a60a1f31786da94c6cb054e7a3c75906111c"}, + {file = "rpds_py-0.19.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab1932ca6cb8c7499a4d87cb21ccc0d3326f172cfb6a64021a889b591bb3045c"}, + {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2afd2164a1e85226fcb6a1da77a5c8896c18bfe08e82e8ceced5181c42d2179"}, + {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b1c30841f5040de47a0046c243fc1b44ddc87d1b12435a43b8edff7e7cb1e0d0"}, + {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f757f359f30ec7dcebca662a6bd46d1098f8b9fb1fcd661a9e13f2e8ce343ba1"}, + {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15e65395a59d2e0e96caf8ee5389ffb4604e980479c32742936ddd7ade914b22"}, + {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb0f6eb3a320f24b94d177e62f4074ff438f2ad9d27e75a46221904ef21a7b05"}, + {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b228e693a2559888790936e20f5f88b6e9f8162c681830eda303bad7517b4d5a"}, + {file = "rpds_py-0.19.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2575efaa5d949c9f4e2cdbe7d805d02122c16065bfb8d95c129372d65a291a0b"}, + {file = "rpds_py-0.19.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:5c872814b77a4e84afa293a1bee08c14daed1068b2bb1cc312edbf020bbbca2b"}, + {file = "rpds_py-0.19.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:850720e1b383df199b8433a20e02b25b72f0fded28bc03c5bd79e2ce7ef050be"}, + {file = "rpds_py-0.19.0-cp39-none-win32.whl", hash = "sha256:ce84a7efa5af9f54c0aa7692c45861c1667080814286cacb9958c07fc50294fb"}, + {file = "rpds_py-0.19.0-cp39-none-win_amd64.whl", hash = "sha256:1c26da90b8d06227d7769f34915913911222d24ce08c0ab2d60b354e2d9c7aff"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:75969cf900d7be665ccb1622a9aba225cf386bbc9c3bcfeeab9f62b5048f4a07"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8445f23f13339da640d1be8e44e5baf4af97e396882ebbf1692aecd67f67c479"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5a7c1062ef8aea3eda149f08120f10795835fc1c8bc6ad948fb9652a113ca55"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:462b0c18fbb48fdbf980914a02ee38c423a25fcc4cf40f66bacc95a2d2d73bc8"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3208f9aea18991ac7f2b39721e947bbd752a1abbe79ad90d9b6a84a74d44409b"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3444fe52b82f122d8a99bf66777aed6b858d392b12f4c317da19f8234db4533"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88cb4bac7185a9f0168d38c01d7a00addece9822a52870eee26b8d5b61409213"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6b130bd4163c93798a6b9bb96be64a7c43e1cec81126ffa7ffaa106e1fc5cef5"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:a707b158b4410aefb6b054715545bbb21aaa5d5d0080217290131c49c2124a6e"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dc9ac4659456bde7c567107556ab065801622396b435a3ff213daef27b495388"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:81ea573aa46d3b6b3d890cd3c0ad82105985e6058a4baed03cf92518081eec8c"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3f148c3f47f7f29a79c38cc5d020edcb5ca780020fab94dbc21f9af95c463581"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0906357f90784a66e89ae3eadc2654f36c580a7d65cf63e6a616e4aec3a81be"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f629ecc2db6a4736b5ba95a8347b0089240d69ad14ac364f557d52ad68cf94b0"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6feacd1d178c30e5bc37184526e56740342fd2aa6371a28367bad7908d454fc"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae8b6068ee374fdfab63689be0963333aa83b0815ead5d8648389a8ded593378"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78d57546bad81e0da13263e4c9ce30e96dcbe720dbff5ada08d2600a3502e526"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b6683a37338818646af718c9ca2a07f89787551057fae57c4ec0446dc6224b"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e8481b946792415adc07410420d6fc65a352b45d347b78fec45d8f8f0d7496f0"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bec35eb20792ea64c3c57891bc3ca0bedb2884fbac2c8249d9b731447ecde4fa"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:aa5476c3e3a402c37779e95f7b4048db2cb5b0ed0b9d006983965e93f40fe05a"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:19d02c45f2507b489fd4df7b827940f1420480b3e2e471e952af4d44a1ea8e34"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a3e2fd14c5d49ee1da322672375963f19f32b3d5953f0615b175ff7b9d38daed"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:93a91c2640645303e874eada51f4f33351b84b351a689d470f8108d0e0694210"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5b9fc03bf76a94065299d4a2ecd8dfbae4ae8e2e8098bbfa6ab6413ca267709"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5a4b07cdf3f84310c08c1de2c12ddadbb7a77568bcb16e95489f9c81074322ed"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba0ed0dc6763d8bd6e5de5cf0d746d28e706a10b615ea382ac0ab17bb7388633"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:474bc83233abdcf2124ed3f66230a1c8435896046caa4b0b5ab6013c640803cc"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329c719d31362355a96b435f4653e3b4b061fcc9eba9f91dd40804ca637d914e"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef9101f3f7b59043a34f1dccbb385ca760467590951952d6701df0da9893ca0c"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:0121803b0f424ee2109d6e1f27db45b166ebaa4b32ff47d6aa225642636cd834"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8344127403dea42f5970adccf6c5957a71a47f522171fafaf4c6ddb41b61703a"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:443cec402ddd650bb2b885113e1dcedb22b1175c6be223b14246a714b61cd521"}, + {file = "rpds_py-0.19.0.tar.gz", hash = "sha256:4fdc9afadbeb393b4bbbad75481e0ea78e4469f2e1d713a90811700830b553a9"}, ] [[package]] name = "ruff" -version = "0.5.0" +version = "0.5.4" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.5.0-py3-none-linux_armv6l.whl", hash = "sha256:ee770ea8ab38918f34e7560a597cc0a8c9a193aaa01bfbd879ef43cb06bd9c4c"}, - {file = "ruff-0.5.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:38f3b8327b3cb43474559d435f5fa65dacf723351c159ed0dc567f7ab735d1b6"}, - {file = "ruff-0.5.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7594f8df5404a5c5c8f64b8311169879f6cf42142da644c7e0ba3c3f14130370"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adc7012d6ec85032bc4e9065110df205752d64010bed5f958d25dbee9ce35de3"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d505fb93b0fabef974b168d9b27c3960714d2ecda24b6ffa6a87ac432905ea38"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dc5cfd3558f14513ed0d5b70ce531e28ea81a8a3b1b07f0f48421a3d9e7d80a"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:db3ca35265de239a1176d56a464b51557fce41095c37d6c406e658cf80bbb362"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b1a321c4f68809fddd9b282fab6a8d8db796b270fff44722589a8b946925a2a8"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c4dfcd8d34b143916994b3876b63d53f56724c03f8c1a33a253b7b1e6bf2a7d"}, - {file = "ruff-0.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81e5facfc9f4a674c6a78c64d38becfbd5e4f739c31fcd9ce44c849f1fad9e4c"}, - {file = "ruff-0.5.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e589e27971c2a3efff3fadafb16e5aef7ff93250f0134ec4b52052b673cf988d"}, - {file = "ruff-0.5.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d2ffbc3715a52b037bcb0f6ff524a9367f642cdc5817944f6af5479bbb2eb50e"}, - {file = "ruff-0.5.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cd096e23c6a4f9c819525a437fa0a99d1c67a1b6bb30948d46f33afbc53596cf"}, - {file = "ruff-0.5.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:46e193b36f2255729ad34a49c9a997d506e58f08555366b2108783b3064a0e1e"}, - {file = "ruff-0.5.0-py3-none-win32.whl", hash = "sha256:49141d267100f5ceff541b4e06552e98527870eafa1acc9dec9139c9ec5af64c"}, - {file = "ruff-0.5.0-py3-none-win_amd64.whl", hash = "sha256:e9118f60091047444c1b90952736ee7b1792910cab56e9b9a9ac20af94cd0440"}, - {file = "ruff-0.5.0-py3-none-win_arm64.whl", hash = "sha256:ed5c4df5c1fb4518abcb57725b576659542bdbe93366f4f329e8f398c4b71178"}, - {file = "ruff-0.5.0.tar.gz", hash = "sha256:eb641b5873492cf9bd45bc9c5ae5320648218e04386a5f0c264ad6ccce8226a1"}, + {file = "ruff-0.5.4-py3-none-linux_armv6l.whl", hash = "sha256:82acef724fc639699b4d3177ed5cc14c2a5aacd92edd578a9e846d5b5ec18ddf"}, + {file = "ruff-0.5.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:da62e87637c8838b325e65beee485f71eb36202ce8e3cdbc24b9fcb8b99a37be"}, + {file = "ruff-0.5.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e98ad088edfe2f3b85a925ee96da652028f093d6b9b56b76fc242d8abb8e2059"}, + {file = "ruff-0.5.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c55efbecc3152d614cfe6c2247a3054cfe358cefbf794f8c79c8575456efe19"}, + {file = "ruff-0.5.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9b85eaa1f653abd0a70603b8b7008d9e00c9fa1bbd0bf40dad3f0c0bdd06793"}, + {file = "ruff-0.5.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0cf497a47751be8c883059c4613ba2f50dd06ec672692de2811f039432875278"}, + {file = "ruff-0.5.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:09c14ed6a72af9ccc8d2e313d7acf7037f0faff43cde4b507e66f14e812e37f7"}, + {file = "ruff-0.5.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:628f6b8f97b8bad2490240aa84f3e68f390e13fabc9af5c0d3b96b485921cd60"}, + {file = "ruff-0.5.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3520a00c0563d7a7a7c324ad7e2cde2355733dafa9592c671fb2e9e3cd8194c1"}, + {file = "ruff-0.5.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93789f14ca2244fb91ed481456f6d0bb8af1f75a330e133b67d08f06ad85b516"}, + {file = "ruff-0.5.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:029454e2824eafa25b9df46882f7f7844d36fd8ce51c1b7f6d97e2615a57bbcc"}, + {file = "ruff-0.5.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9492320eed573a13a0bc09a2957f17aa733fff9ce5bf00e66e6d4a88ec33813f"}, + {file = "ruff-0.5.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a6e1f62a92c645e2919b65c02e79d1f61e78a58eddaebca6c23659e7c7cb4ac7"}, + {file = "ruff-0.5.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:768fa9208df2bec4b2ce61dbc7c2ddd6b1be9fb48f1f8d3b78b3332c7d71c1ff"}, + {file = "ruff-0.5.4-py3-none-win32.whl", hash = "sha256:e1e7393e9c56128e870b233c82ceb42164966f25b30f68acbb24ed69ce9c3a4e"}, + {file = "ruff-0.5.4-py3-none-win_amd64.whl", hash = "sha256:58b54459221fd3f661a7329f177f091eb35cf7a603f01d9eb3eb11cc348d38c4"}, + {file = "ruff-0.5.4-py3-none-win_arm64.whl", hash = "sha256:bd53da65f1085fb5b307c38fd3c0829e76acf7b2a912d8d79cadcdb4875c1eb7"}, + {file = "ruff-0.5.4.tar.gz", hash = "sha256:2795726d5f71c4f4e70653273d1c23a8182f07dd8e48c12de5d867bfb7557eed"}, ] [[package]] name = "scikit-learn" -version = "1.5.0" +version = "1.4.2" description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.9" files = [ - {file = "scikit_learn-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12e40ac48555e6b551f0a0a5743cc94cc5a765c9513fe708e01f0aa001da2801"}, - {file = "scikit_learn-1.5.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f405c4dae288f5f6553b10c4ac9ea7754d5180ec11e296464adb5d6ac68b6ef5"}, - {file = "scikit_learn-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df8ccabbf583315f13160a4bb06037bde99ea7d8211a69787a6b7c5d4ebb6fc3"}, - {file = "scikit_learn-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c75ea812cd83b1385bbfa94ae971f0d80adb338a9523f6bbcb5e0b0381151d4"}, - {file = "scikit_learn-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:a90c5da84829a0b9b4bf00daf62754b2be741e66b5946911f5bdfaa869fcedd6"}, - {file = "scikit_learn-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a65af2d8a6cce4e163a7951a4cfbfa7fceb2d5c013a4b593686c7f16445cf9d"}, - {file = "scikit_learn-1.5.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:4c0c56c3005f2ec1db3787aeaabefa96256580678cec783986836fc64f8ff622"}, - {file = "scikit_learn-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f77547165c00625551e5c250cefa3f03f2fc92c5e18668abd90bfc4be2e0bff"}, - {file = "scikit_learn-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:118a8d229a41158c9f90093e46b3737120a165181a1b58c03461447aa4657415"}, - {file = "scikit_learn-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:a03b09f9f7f09ffe8c5efffe2e9de1196c696d811be6798ad5eddf323c6f4d40"}, - {file = "scikit_learn-1.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:460806030c666addee1f074788b3978329a5bfdc9b7d63e7aad3f6d45c67a210"}, - {file = "scikit_learn-1.5.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:1b94d6440603752b27842eda97f6395f570941857456c606eb1d638efdb38184"}, - {file = "scikit_learn-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d82c2e573f0f2f2f0be897e7a31fcf4e73869247738ab8c3ce7245549af58ab8"}, - {file = "scikit_learn-1.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3a10e1d9e834e84d05e468ec501a356226338778769317ee0b84043c0d8fb06"}, - {file = "scikit_learn-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:855fc5fa8ed9e4f08291203af3d3e5fbdc4737bd617a371559aaa2088166046e"}, - {file = "scikit_learn-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:40fb7d4a9a2db07e6e0cae4dc7bdbb8fada17043bac24104d8165e10e4cff1a2"}, - {file = "scikit_learn-1.5.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:47132440050b1c5beb95f8ba0b2402bbd9057ce96ec0ba86f2f445dd4f34df67"}, - {file = "scikit_learn-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:174beb56e3e881c90424e21f576fa69c4ffcf5174632a79ab4461c4c960315ac"}, - {file = "scikit_learn-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261fe334ca48f09ed64b8fae13f9b46cc43ac5f580c4a605cbb0a517456c8f71"}, - {file = "scikit_learn-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:057b991ac64b3e75c9c04b5f9395eaf19a6179244c089afdebaad98264bff37c"}, - {file = "scikit_learn-1.5.0.tar.gz", hash = "sha256:789e3db01c750ed6d496fa2db7d50637857b451e57bcae863bff707c1247bef7"}, + {file = "scikit-learn-1.4.2.tar.gz", hash = "sha256:daa1c471d95bad080c6e44b4946c9390a4842adc3082572c20e4f8884e39e959"}, + {file = "scikit_learn-1.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8539a41b3d6d1af82eb629f9c57f37428ff1481c1e34dddb3b9d7af8ede67ac5"}, + {file = "scikit_learn-1.4.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:68b8404841f944a4a1459b07198fa2edd41a82f189b44f3e1d55c104dbc2e40c"}, + {file = "scikit_learn-1.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81bf5d8bbe87643103334032dd82f7419bc8c8d02a763643a6b9a5c7288c5054"}, + {file = "scikit_learn-1.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36f0ea5d0f693cb247a073d21a4123bdf4172e470e6d163c12b74cbb1536cf38"}, + {file = "scikit_learn-1.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:87440e2e188c87db80ea4023440923dccbd56fbc2d557b18ced00fef79da0727"}, + {file = "scikit_learn-1.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:45dee87ac5309bb82e3ea633955030df9bbcb8d2cdb30383c6cd483691c546cc"}, + {file = "scikit_learn-1.4.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1d0b25d9c651fd050555aadd57431b53d4cf664e749069da77f3d52c5ad14b3b"}, + {file = "scikit_learn-1.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0203c368058ab92efc6168a1507d388d41469c873e96ec220ca8e74079bf62e"}, + {file = "scikit_learn-1.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44c62f2b124848a28fd695db5bc4da019287abf390bfce602ddc8aa1ec186aae"}, + {file = "scikit_learn-1.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:5cd7b524115499b18b63f0c96f4224eb885564937a0b3477531b2b63ce331904"}, + {file = "scikit_learn-1.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:90378e1747949f90c8f385898fff35d73193dfcaec3dd75d6b542f90c4e89755"}, + {file = "scikit_learn-1.4.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ff4effe5a1d4e8fed260a83a163f7dbf4f6087b54528d8880bab1d1377bd78be"}, + {file = "scikit_learn-1.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:671e2f0c3f2c15409dae4f282a3a619601fa824d2c820e5b608d9d775f91780c"}, + {file = "scikit_learn-1.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d36d0bc983336bbc1be22f9b686b50c964f593c8a9a913a792442af9bf4f5e68"}, + {file = "scikit_learn-1.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:d762070980c17ba3e9a4a1e043ba0518ce4c55152032f1af0ca6f39b376b5928"}, + {file = "scikit_learn-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d9993d5e78a8148b1d0fdf5b15ed92452af5581734129998c26f481c46586d68"}, + {file = "scikit_learn-1.4.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:426d258fddac674fdf33f3cb2d54d26f49406e2599dbf9a32b4d1696091d4256"}, + {file = "scikit_learn-1.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5460a1a5b043ae5ae4596b3126a4ec33ccba1b51e7ca2c5d36dac2169f62ab1d"}, + {file = "scikit_learn-1.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49d64ef6cb8c093d883e5a36c4766548d974898d378e395ba41a806d0e824db8"}, + {file = "scikit_learn-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:c97a50b05c194be9146d61fe87dbf8eac62b203d9e87a3ccc6ae9aed2dfaf361"}, ] [package.dependencies] joblib = ">=1.2.0" numpy = ">=1.19.5" scipy = ">=1.6.0" -threadpoolctl = ">=3.1.0" +threadpoolctl = ">=2.0.0" [package.extras] -benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] -build = ["cython (>=3.0.10)", "meson-python (>=0.15.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.15.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +benchmark = ["matplotlib (>=3.3.4)", "memory-profiler (>=0.57.0)", "pandas (>=1.1.5)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.15.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] -install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] -maintenance = ["conda-lock (==2.5.6)"] -tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] +tests = ["black (>=23.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.3)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.19.12)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.0.272)", "scikit-image (>=0.17.2)"] [[package]] name = "scipy" @@ -3100,18 +3229,72 @@ test = ["Cython", "array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "me [[package]] name = "setuptools" -version = "70.1.1" +version = "71.0.4" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-70.1.1-py3-none-any.whl", hash = "sha256:a58a8fde0541dab0419750bcc521fbdf8585f6e5cb41909df3a472ef7b81ca95"}, - {file = "setuptools-70.1.1.tar.gz", hash = "sha256:937a48c7cdb7a21eb53cd7f9b59e525503aa8abaf3584c730dc5f7a5bec3a650"}, + {file = "setuptools-71.0.4-py3-none-any.whl", hash = "sha256:ed2feca703be3bdbd94e6bb17365d91c6935c6b2a8d0bb09b66a2c435ba0b1a5"}, + {file = "setuptools-71.0.4.tar.gz", hash = "sha256:48297e5d393a62b7cb2a10b8f76c63a73af933bd809c9e0d0d6352a1a0135dd8"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "shap" +version = "0.46.0" +description = "A unified approach to explain the output of any machine learning model." +optional = false +python-versions = ">=3.9" +files = [ + {file = "shap-0.46.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:905b2d7a0262ef820785a7c0e3c7f24c9d281e6f934edb65cbe811fe0e971187"}, + {file = "shap-0.46.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bccbb30ffbf8b9ed53e476d0c1319fdfcbeac455fe9df277fb0d570d92790e80"}, + {file = "shap-0.46.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9633d3d7174acc01455538169ca6e6344f570530384548631aeadcf7bfdaaaea"}, + {file = "shap-0.46.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6097eb2ab7e8c194254bac3e462266490fbdd43bfe35a1014e9ee21c4ef10ee"}, + {file = "shap-0.46.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0cf7c6e3f056cf3bfd16bcfd5744d0cc25b851555b1e750a3ab889b3077d2d05"}, + {file = "shap-0.46.0-cp310-cp310-win_amd64.whl", hash = "sha256:949bd7fa40371c3f1885a30ae0611dd481bf4ac90066ff726c73cb5bb393032b"}, + {file = "shap-0.46.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f18217c98f39fd485d541f6aab0b860b3be74b69b21d4faf11959e3fcba765c5"}, + {file = "shap-0.46.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5bbdae4489577c6fce1cfe2d9d8f3d5b96d69284d29645fe651f78f6e965aeb4"}, + {file = "shap-0.46.0-cp311-cp311-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13d36dc58d1e8c010feb4e7da71c77d23626a52d12d16b02869e793b11be4695"}, + {file = "shap-0.46.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70e06fdfdf53d5fb932c82f4529397552b262e0ccce734f5226fb1e1eab2bc3e"}, + {file = "shap-0.46.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:943f0806fa00b4fafb174f172a73d88de2d8600e6d69c2e2bff833f00e6c4c21"}, + {file = "shap-0.46.0-cp311-cp311-win_amd64.whl", hash = "sha256:c972a2efdc9fc00d543efaa55805eca947b8c418d065962d967824c2d5d295d0"}, + {file = "shap-0.46.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a9cc9be191562bea1a782baff912854d267c6f4831bbf454d8d7bb7df7ddb214"}, + {file = "shap-0.46.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab1fecfb43604605be17e26ae12bde4406c451c46b54b980d9570cec03fbc239"}, + {file = "shap-0.46.0-cp312-cp312-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b216adf2a17b0e0694f17965ac29354ca8c4f27ac3c66f68bf6fc4cb2aa28207"}, + {file = "shap-0.46.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6e5dc5257b747a784f7a9b3acb64216a9011f01734f3c96b27fe5e15ae5f99f"}, + {file = "shap-0.46.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1230bf973463041dfa15734f290fbf3ab9c6e4e8222339c76f68fc355b940d80"}, + {file = "shap-0.46.0-cp312-cp312-win_amd64.whl", hash = "sha256:0cbbf996537b2a42d3bc7f2a13492988822ee1bfd7220700989408dfb9e1c5ad"}, + {file = "shap-0.46.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c7d0c53a8cbefb2260ce28a98fa866c1a287770981f95c40a54f9d1082cbb31"}, + {file = "shap-0.46.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0726f8c63f09dde586c9859ad315641f5a080e9aecf123a0cabc336b61703d66"}, + {file = "shap-0.46.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99edc28daac4cbb98cd9f02febf4e9fbc6b9e3d24519c22ed59a98c68c47336c"}, + {file = "shap-0.46.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85a6ff9c9e15abd9a332360cff8d105165a600466167d6274dab468a050d005a"}, + {file = "shap-0.46.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9f9f9727839e2459dfa4b4fbc190224e87f7b4b2a29f0e2a438500215921192b"}, + {file = "shap-0.46.0-cp39-cp39-win_amd64.whl", hash = "sha256:b169b485a69f7d32e32fa64ad77be00129436c4455b9d0997b21b553f0becc8c"}, + {file = "shap-0.46.0.tar.gz", hash = "sha256:bdaa5b098be5a958348015e940f6fd264339b5db1e651f9898a3117be95b05a0"}, +] + +[package.dependencies] +cloudpickle = "*" +numba = "*" +numpy = "*" +packaging = ">20.9" +pandas = "*" +scikit-learn = "*" +scipy = "*" +slicer = "0.0.8" +tqdm = ">=4.27.0" + +[package.extras] +docs = ["ipython", "matplotlib", "myst-parser (==2.0.0)", "nbsphinx (==0.9.3)", "numpydoc", "requests", "sphinx (==7.2.6)", "sphinx-github-changelog (==1.2.1)", "sphinx-rtd-theme (==2.0.0)"] +others = ["lime"] +plots = ["ipython", "matplotlib"] +test = ["catboost", "gpboost", "lightgbm", "ngboost", "opencv-python", "protobuf (==3.20.3)", "pyod", "pyspark", "pytest", "pytest-cov", "pytest-mpl", "sentencepiece", "tensorflow", "tf-keras", "torch", "torch (==2.2.0)", "torchvision", "transformers", "xgboost"] +test-core = ["pytest", "pytest-cov", "pytest-mpl"] +test-notebooks = ["datasets", "jupyter", "keras", "nbconvert", "nbformat", "nlp", "transformers"] [[package]] name = "six" @@ -3124,6 +3307,17 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "slicer" +version = "0.0.8" +description = "A small package for big slicing." +optional = false +python-versions = ">=3.6" +files = [ + {file = "slicer-0.0.8-py3-none-any.whl", hash = "sha256:6c206258543aecd010d497dc2eca9d2805860a0b3758673903456b7df7934dc3"}, + {file = "slicer-0.0.8.tar.gz", hash = "sha256:2e7553af73f0c0c2d355f4afcc3ecf97c6f2156fcf4593955c3f56cf6c4d6eb7"}, +] + [[package]] name = "smmap" version = "5.0.1" @@ -3224,13 +3418,13 @@ sqlcipher = ["sqlcipher3_binary"] [[package]] name = "sqlparse" -version = "0.5.0" +version = "0.5.1" description = "A non-validating SQL parser." optional = false python-versions = ">=3.8" files = [ - {file = "sqlparse-0.5.0-py3-none-any.whl", hash = "sha256:c204494cd97479d0e39f28c93d46c0b2d5959c7b9ab904762ea6c7af211c8663"}, - {file = "sqlparse-0.5.0.tar.gz", hash = "sha256:714d0a4932c059d16189f58ef5411ec2287a4360f17cdd0edd2d09d4c5087c93"}, + {file = "sqlparse-0.5.1-py3-none-any.whl", hash = "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4"}, + {file = "sqlparse-0.5.1.tar.gz", hash = "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e"}, ] [package.extras] @@ -3272,13 +3466,13 @@ pbr = ">=2.0.0,<2.1.0 || >2.1.0" [[package]] name = "tenacity" -version = "8.4.2" +version = "8.5.0" description = "Retry code until it succeeds" optional = false python-versions = ">=3.8" files = [ - {file = "tenacity-8.4.2-py3-none-any.whl", hash = "sha256:9e6f7cf7da729125c7437222f8a522279751cdfbe6b67bfe64f75d3a348661b2"}, - {file = "tenacity-8.4.2.tar.gz", hash = "sha256:cd80a53a79336edba8489e767f729e4f391c896956b57140b5d7511a64bbd3ef"}, + {file = "tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687"}, + {file = "tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78"}, ] [package.extras] @@ -3312,13 +3506,13 @@ files = [ [[package]] name = "tomlkit" -version = "0.12.5" +version = "0.13.0" description = "Style preserving TOML library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, - {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, + {file = "tomlkit-0.13.0-py3-none-any.whl", hash = "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264"}, + {file = "tomlkit-0.13.0.tar.gz", hash = "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72"}, ] [[package]] @@ -3341,6 +3535,26 @@ files = [ {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, ] +[[package]] +name = "tqdm" +version = "4.66.4" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, + {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + [[package]] name = "traitlets" version = "5.14.3" @@ -3385,6 +3599,17 @@ files = [ {file = "types_pytz-2024.1.0.20240417-py3-none-any.whl", hash = "sha256:8335d443310e2db7b74e007414e74c4f53b67452c0cb0d228ca359ccfba59659"}, ] +[[package]] +name = "types-pyyaml" +version = "6.0.12.20240311" +description = "Typing stubs for PyYAML" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-PyYAML-6.0.12.20240311.tar.gz", hash = "sha256:a9e0f0f88dc835739b0c1ca51ee90d04ca2a897a71af79de9aec5f38cb0a5342"}, + {file = "types_PyYAML-6.0.12.20240311-py3-none-any.whl", hash = "sha256:b845b06a1c7e54b8e5b4c683043de0d9caf205e7434b3edc678ff2411979b8f6"}, +] + [[package]] name = "typing-extensions" version = "4.12.2" @@ -3613,4 +3838,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "5432c9fb5ec1419c86ebb9206b2be48ed781783b4275b8eb49f12c7500bd29eb" +content-hash = "bfd753415cb70a98d003b7096ad3c4b530f7a087ebf2ed425f712103c5646c32" diff --git a/pyproject.toml b/pyproject.toml index aeee5a2..a0ce1b4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ [tool.poetry] name = "bikes" -version = "1.0.1" +version = "1.1.0" description = "Predict the number of bikes available." repository = "https://github.com/fmind/mlops-python-package" documentation = "https://fmind.github.io/mlops-python-package/" @@ -25,16 +25,20 @@ bikes = 'bikes.scripts:main' python = "^3.12" loguru = "^0.7.2" matplotlib = "^3.9.0" -mlflow = "^2.14.1" +mlflow = "^2.14.3" numpy = "^1.26.4" omegaconf = "^2.3.0" pandas = "^2.2.2" pandera = "^0.20.1" plotly = "^5.22.0" +plyer = "^2.1.0" +psutil = "^6.0.0" pyarrow = "^15.0.2" pydantic = "^2.7.4" pydantic-settings = "^2.3.4" -scikit-learn = "^1.5.0" +pynvml = "^11.5.0" +scikit-learn = "1.4.2" +shap = "^0.46.0" [tool.poetry.group.checks.dependencies] bandit = "^1.7.9" @@ -45,6 +49,7 @@ pytest-cov = "^5.0.0" pytest-xdist = "^3.6.1" pandera = { extras = ["mypy"], version = "^0.20.1" } ruff = "^0.5.0" +pytest-mock = "^3.14.0" [tool.poetry.group.commits.dependencies] commitizen = "^3.27.0" @@ -52,6 +57,7 @@ pre-commit = "^3.7.1" [tool.poetry.group.dev.dependencies] invoke = "^2.2.0" +pyyaml = "^6.0.1" [tool.poetry.group.docs.dependencies] pdoc = "^14.5.1" @@ -60,6 +66,9 @@ pdoc = "^14.5.1" ipykernel = "^6.29.4" nbformat = "^5.10.4" +[tool.poetry.group.types.dependencies] +types-pyyaml = "^6.0.12.20240311" + # CONFIGURATIONS [tool.bandit] diff --git a/python_env.yaml b/python_env.yaml new file mode 100644 index 0000000..f314f0d --- /dev/null +++ b/python_env.yaml @@ -0,0 +1,90 @@ +dependencies: +- alembic==1.13.2 +- aniso8601==9.0.1 +- annotated-types==0.7.0 +- antlr4-python3-runtime==4.9.3 +- blinker==1.8.2 +- cachetools==5.4.0 +- certifi==2024.7.4 +- charset-normalizer==3.3.2 +- click==8.1.7 +- cloudpickle==3.0.0 +- colorama==0.4.6 +- contourpy==1.2.1 +- cycler==0.12.1 +- deprecated==1.2.14 +- docker==7.1.0 +- entrypoints==0.4 +- flask==3.0.3 +- fonttools==4.53.1 +- gitdb==4.0.11 +- gitpython==3.1.43 +- graphene==3.3 +- graphql-core==3.2.3 +- graphql-relay==3.2.0 +- greenlet==3.0.3 +- gunicorn==22.0.0 +- idna==3.7 +- importlib-metadata==7.2.1 +- itsdangerous==2.2.0 +- jinja2==3.1.4 +- joblib==1.4.2 +- kiwisolver==1.4.5 +- llvmlite==0.43.0 +- loguru==0.7.2 +- mako==1.3.5 +- markdown==3.6 +- markupsafe==2.1.5 +- matplotlib==3.9.1 +- mlflow==2.14.3 +- multimethod==1.10 +- mypy-extensions==1.0.0 +- numba==0.60.0 +- numpy==1.26.4 +- omegaconf==2.3.0 +- opentelemetry-api==1.16.0 +- opentelemetry-sdk==1.16.0 +- opentelemetry-semantic-conventions==0.37b0 +- packaging==24.1 +- pandas==2.2.2 +- pandera==0.20.3 +- pillow==10.4.0 +- plotly==5.22.0 +- plyer==2.1.0 +- protobuf==4.25.3 +- psutil==6.0.0 +- pyarrow==15.0.2 +- pydantic-core==2.20.1 +- pydantic-settings==2.3.4 +- pydantic==2.8.2 +- pynvml==11.5.3 +- pyparsing==3.1.2 +- python-dateutil==2.9.0.post0 +- python-dotenv==1.0.1 +- pytz==2024.1 +- pyyaml==6.0.1 +- querystring-parser==1.2.4 +- requests==2.32.3 +- scikit-learn==1.4.2 +- scipy==1.14.0 +- setuptools==71.0.4 +- shap==0.46.0 +- six==1.16.0 +- slicer==0.0.8 +- smmap==5.0.1 +- sqlalchemy==2.0.31 +- sqlparse==0.5.1 +- tenacity==8.5.0 +- threadpoolctl==3.5.0 +- tqdm==4.66.4 +- typeguard==4.3.0 +- typing-extensions==4.12.2 +- typing-inspect==0.9.0 +- tzdata==2024.1 +- urllib3==2.2.2 +- waitress==3.0.0 +- werkzeug==3.0.3 +- win32-setctime==1.1.0 +- wrapt==1.16.0 +- zipp==3.19.2 +python: '3.12' diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..29ce839 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,89 @@ +alembic==1.13.2 ; python_version >= "3.12" and python_version < "4.0" +aniso8601==9.0.1 ; python_version >= "3.12" and python_version < "4.0" +annotated-types==0.7.0 ; python_version >= "3.12" and python_version < "4.0" +antlr4-python3-runtime==4.9.3 ; python_version >= "3.12" and python_version < "4.0" +blinker==1.8.2 ; python_version >= "3.12" and python_version < "4.0" +cachetools==5.4.0 ; python_version >= "3.12" and python_version < "4.0" +certifi==2024.7.4 ; python_version >= "3.12" and python_version < "4.0" +charset-normalizer==3.3.2 ; python_version >= "3.12" and python_version < "4.0" +click==8.1.7 ; python_version >= "3.12" and python_version < "4.0" +cloudpickle==3.0.0 ; python_version >= "3.12" and python_version < "4.0" +colorama==0.4.6 ; python_version >= "3.12" and python_version < "4.0" and (sys_platform == "win32" or platform_system == "Windows") +contourpy==1.2.1 ; python_version >= "3.12" and python_version < "4.0" +cycler==0.12.1 ; python_version >= "3.12" and python_version < "4.0" +deprecated==1.2.14 ; python_version >= "3.12" and python_version < "4.0" +docker==7.1.0 ; python_version >= "3.12" and python_version < "4.0" +entrypoints==0.4 ; python_version >= "3.12" and python_version < "4.0" +flask==3.0.3 ; python_version >= "3.12" and python_version < "4.0" +fonttools==4.53.1 ; python_version >= "3.12" and python_version < "4.0" +gitdb==4.0.11 ; python_version >= "3.12" and python_version < "4.0" +gitpython==3.1.43 ; python_version >= "3.12" and python_version < "4.0" +graphene==3.3 ; python_version >= "3.12" and python_version < "4.0" +graphql-core==3.2.3 ; python_version >= "3.12" and python_version < "4" +graphql-relay==3.2.0 ; python_version >= "3.12" and python_version < "4" +greenlet==3.0.3 ; python_version < "3.13" 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") and python_version >= "3.12" +gunicorn==22.0.0 ; python_version >= "3.12" and python_version < "4.0" and platform_system != "Windows" +idna==3.7 ; python_version >= "3.12" and python_version < "4.0" +importlib-metadata==7.2.1 ; python_version >= "3.12" and python_version < "4.0" +itsdangerous==2.2.0 ; python_version >= "3.12" and python_version < "4.0" +jinja2==3.1.4 ; python_version >= "3.12" and python_version < "4.0" +joblib==1.4.2 ; python_version >= "3.12" and python_version < "4.0" +kiwisolver==1.4.5 ; python_version >= "3.12" and python_version < "4.0" +llvmlite==0.43.0 ; python_version >= "3.12" and python_version < "4.0" +loguru==0.7.2 ; python_version >= "3.12" and python_version < "4.0" +mako==1.3.5 ; python_version >= "3.12" and python_version < "4.0" +markdown==3.6 ; python_version >= "3.12" and python_version < "4.0" +markupsafe==2.1.5 ; python_version >= "3.12" and python_version < "4.0" +matplotlib==3.9.1 ; python_version >= "3.12" and python_version < "4.0" +mlflow==2.14.3 ; python_version >= "3.12" and python_version < "4.0" +multimethod==1.10 ; python_version >= "3.12" and python_version < "4.0" +mypy-extensions==1.0.0 ; python_version >= "3.12" and python_version < "4.0" +numba==0.60.0 ; python_version >= "3.12" and python_version < "4.0" +numpy==1.26.4 ; python_version >= "3.12" and python_version < "4.0" +omegaconf==2.3.0 ; python_version >= "3.12" and python_version < "4.0" +opentelemetry-api==1.16.0 ; python_version >= "3.12" and python_version < "4.0" +opentelemetry-sdk==1.16.0 ; python_version >= "3.12" and python_version < "4.0" +opentelemetry-semantic-conventions==0.37b0 ; python_version >= "3.12" and python_version < "4.0" +packaging==24.1 ; python_version >= "3.12" and python_version < "4.0" +pandas==2.2.2 ; python_version >= "3.12" and python_version < "4.0" +pandera==0.20.3 ; python_version >= "3.12" and python_version < "4.0" +pillow==10.4.0 ; python_version >= "3.12" and python_version < "4.0" +plotly==5.22.0 ; python_version >= "3.12" and python_version < "4.0" +plyer==2.1.0 ; python_version >= "3.12" and python_version < "4.0" +protobuf==4.25.3 ; python_version >= "3.12" and python_version < "4.0" +psutil==6.0.0 ; python_version >= "3.12" and python_version < "4.0" +pyarrow==15.0.2 ; python_version >= "3.12" and python_version < "4.0" +pydantic-core==2.20.1 ; python_version >= "3.12" and python_version < "4.0" +pydantic-settings==2.3.4 ; python_version >= "3.12" and python_version < "4.0" +pydantic==2.8.2 ; python_version >= "3.12" and python_version < "4.0" +pynvml==11.5.3 ; python_version >= "3.12" and python_version < "4.0" +pyparsing==3.1.2 ; python_version >= "3.12" and python_version < "4.0" +python-dateutil==2.9.0.post0 ; python_version >= "3.12" and python_version < "4.0" +python-dotenv==1.0.1 ; python_version >= "3.12" and python_version < "4.0" +pytz==2024.1 ; python_version >= "3.12" and python_version < "4.0" +pywin32==306 ; python_version >= "3.12" and python_version < "4.0" and sys_platform == "win32" +pyyaml==6.0.1 ; python_version >= "3.12" and python_version < "4.0" +querystring-parser==1.2.4 ; python_version >= "3.12" and python_version < "4.0" +requests==2.32.3 ; python_version >= "3.12" and python_version < "4.0" +scikit-learn==1.4.2 ; python_version >= "3.12" and python_version < "4.0" +scipy==1.14.0 ; python_version >= "3.12" and python_version < "4.0" +setuptools==71.0.4 ; python_version >= "3.12" and python_version < "4.0" +shap==0.46.0 ; python_version >= "3.12" and python_version < "4.0" +six==1.16.0 ; python_version >= "3.12" and python_version < "4.0" +slicer==0.0.8 ; python_version >= "3.12" and python_version < "4.0" +smmap==5.0.1 ; python_version >= "3.12" and python_version < "4.0" +sqlalchemy==2.0.31 ; python_version >= "3.12" and python_version < "4.0" +sqlparse==0.5.1 ; python_version >= "3.12" and python_version < "4.0" +tenacity==8.5.0 ; python_version >= "3.12" and python_version < "4.0" +threadpoolctl==3.5.0 ; python_version >= "3.12" and python_version < "4.0" +tqdm==4.66.4 ; python_version >= "3.12" and python_version < "4.0" +typeguard==4.3.0 ; python_version >= "3.12" and python_version < "4.0" +typing-extensions==4.12.2 ; python_version >= "3.12" and python_version < "4.0" +typing-inspect==0.9.0 ; python_version >= "3.12" and python_version < "4.0" +tzdata==2024.1 ; python_version >= "3.12" and python_version < "4.0" +urllib3==2.2.2 ; python_version >= "3.12" and python_version < "4.0" +waitress==3.0.0 ; python_version >= "3.12" and python_version < "4.0" and platform_system == "Windows" +werkzeug==3.0.3 ; python_version >= "3.12" and python_version < "4.0" +win32-setctime==1.1.0 ; python_version >= "3.12" and python_version < "4.0" and sys_platform == "win32" +wrapt==1.16.0 ; python_version >= "3.12" and python_version < "4.0" +zipp==3.19.2 ; python_version >= "3.12" and python_version < "4.0" diff --git a/src/bikes/core/metrics.py b/src/bikes/core/metrics.py index 6eaf13c..37b64b5 100644 --- a/src/bikes/core/metrics.py +++ b/src/bikes/core/metrics.py @@ -2,14 +2,26 @@ # %% IMPORTS +from __future__ import annotations + import abc import typing as T +import mlflow +import pandas as pd import pydantic as pdt from sklearn import metrics from bikes.core import models, schemas +# %% TYPINGS + +MlflowMetric: T.TypeAlias = mlflow.metrics.MetricValue +MlflowThreshold: T.TypeAlias = mlflow.models.MetricThreshold +MlflowModelValidationFailedException: T.TypeAlias = ( + mlflow.models.evaluation.validation.ModelValidationFailedException +) + # %% METRICS @@ -21,11 +33,13 @@ class Metric(abc.ABC, pdt.BaseModel, strict=True, frozen=True, extra="forbid"): Parameters: name (str): name of the metric for the reporting. + greater_is_better (bool): maximize or minimize result. """ KIND: str name: str + greater_is_better: bool @abc.abstractmethod def score(self, targets: schemas.Targets, outputs: schemas.Outputs) -> float: @@ -42,7 +56,7 @@ def score(self, targets: schemas.Targets, outputs: schemas.Outputs) -> float: def scorer( self, model: models.Model, inputs: schemas.Inputs, targets: schemas.Targets ) -> float: - """Score the model outputs against targets. + """Score model outputs against targets. Args: model (models.Model): model to evaluate. @@ -56,6 +70,37 @@ def scorer( score = self.score(targets=targets, outputs=outputs) return score + def to_mlflow(self) -> MlflowMetric: + """Convert the metric to an Mlflow metric. + + Returns: + MlflowMetric: the Mlflow metric. + """ + + def eval_fn(predictions: pd.Series[int], targets: pd.Series[int]) -> MlflowMetric: + """Evaluation function associated with the mlflow metric. + + Args: + predictions (pd.Series): model predictions. + targets (pd.Series | None): model targets. + + Returns: + MlflowMetric: the mlflow metric. + """ + score_targets = schemas.Targets( + {schemas.TargetsSchema.cnt: targets}, index=targets.index + ) + score_outputs = schemas.Outputs( + {schemas.OutputsSchema.prediction: predictions}, index=predictions.index + ) + sign = 1 if self.greater_is_better else -1 # reverse the effect + score = self.score(targets=score_targets, outputs=score_outputs) + return MlflowMetric(aggregate_results={self.name: score * sign}) + + return mlflow.metrics.make_metric( + eval_fn=eval_fn, name=self.name, greater_is_better=self.greater_is_better + ) + class SklearnMetric(Metric): """Compute metrics with sklearn. @@ -81,3 +126,28 @@ def score(self, targets: schemas.Targets, outputs: schemas.Outputs) -> float: MetricKind = SklearnMetric + +# %% THRESHOLDS + + +class Threshold(abc.ABC, pdt.BaseModel, strict=True, frozen=True, extra="forbid"): + """A project threshold for a metric. + + Use thresholds to monitor model performances. + e.g., to trigger an alert when a threshold is met. + + Parameters: + threshold (int | float): absolute threshold value. + greater_is_better (bool): maximize or minimize result. + """ + + threshold: int | float + greater_is_better: bool + + def to_mlflow(self) -> MlflowThreshold: + """Convert the threshold to an mlflow threshold. + + Returns: + MlflowThreshold: the mlflow threshold. + """ + return MlflowThreshold(threshold=self.threshold, greater_is_better=self.greater_is_better) diff --git a/src/bikes/core/models.py b/src/bikes/core/models.py index 462fe10..dac1acc 100644 --- a/src/bikes/core/models.py +++ b/src/bikes/core/models.py @@ -6,6 +6,7 @@ import typing as T import pydantic as pdt +import shap from sklearn import compose, ensemble, pipeline, preprocessing from bikes.core import schemas @@ -77,6 +78,28 @@ def predict(self, inputs: schemas.Inputs) -> schemas.Outputs: schemas.Outputs: model prediction outputs. """ + def explain_model(self) -> schemas.FeatureImportances: + """Explain the internal model structure. + + Raises: + NotImplementedError: method not implemented. + + Returns: + schemas.FeatureImportances: feature importances. + """ + raise NotImplementedError() + + def explain_samples(self, inputs: schemas.Inputs) -> schemas.SHAPValues: + """Explain model outputs on input samples. + + Raises: + NotImplementedError: method not implemented. + + Returns: + schemas.SHAPValues: SHAP values. + """ + raise NotImplementedError() + def get_internal_model(self) -> T.Any: """Return the internal model in the object. @@ -161,6 +184,33 @@ def predict(self, inputs: schemas.Inputs) -> schemas.Outputs: ) return outputs + @T.override + def explain_model(self) -> schemas.FeatureImportances: + model = self.get_internal_model() + regressor = model.named_steps["regressor"] + transformer = model.named_steps["transformer"] + column_names = transformer.get_feature_names_out() + feature_importances = schemas.FeatureImportances( + data={ + "feature": column_names, + "importance": regressor.feature_importances_, + } + ) + return feature_importances + + @T.override + def explain_samples(self, inputs: schemas.Inputs) -> schemas.SHAPValues: + model = self.get_internal_model() + regressor = model.named_steps["regressor"] + transformer = model.named_steps["transformer"] + transformed = transformer.transform(X=inputs) + explainer = shap.TreeExplainer(model=regressor) + shap_values = schemas.SHAPValues( + data=explainer.shap_values(X=transformed), + columns=transformer.get_feature_names_out(), + ) + return shap_values + @T.override def get_internal_model(self) -> pipeline.Pipeline: model = self._pipeline diff --git a/src/bikes/core/schemas.py b/src/bikes/core/schemas.py index 988954f..244434c 100644 --- a/src/bikes/core/schemas.py +++ b/src/bikes/core/schemas.py @@ -51,7 +51,7 @@ def check(cls: T.Type[TSchema], data: pd.DataFrame) -> papd.DataFrame[TSchema]: class InputsSchema(Schema): """Schema for the project inputs.""" - instant: papd.Index[padt.UInt32] = pa.Field(ge=0, check_name=True) + instant: papd.Index[padt.UInt32] = pa.Field(ge=0) dteday: papd.Series[padt.DateTime] = pa.Field() season: papd.Series[padt.UInt8] = pa.Field(isin=[1, 2, 3, 4]) yr: papd.Series[padt.UInt8] = pa.Field(ge=0, le=1) @@ -75,7 +75,7 @@ class InputsSchema(Schema): class TargetsSchema(Schema): """Schema for the project target.""" - instant: papd.Index[padt.UInt32] = pa.Field(ge=0, check_name=True) + instant: papd.Index[padt.UInt32] = pa.Field(ge=0) cnt: papd.Series[padt.UInt32] = pa.Field(ge=0) @@ -85,8 +85,36 @@ class TargetsSchema(Schema): class OutputsSchema(Schema): """Schema for the project output.""" - instant: papd.Index[padt.UInt32] = pa.Field(ge=0, check_name=True) + instant: papd.Index[padt.UInt32] = pa.Field(ge=0) prediction: papd.Series[padt.UInt32] = pa.Field(ge=0) Outputs = papd.DataFrame[OutputsSchema] + + +class SHAPValuesSchema(Schema): + """Schema for the project shap values.""" + + class Config: + """Default configurations this schema. + + Parameters: + dtype (str): dataframe default data type. + strict (bool): ensure the data type is correct. + """ + + dtype: str = "float32" + strict: bool = False + + +SHAPValues = papd.DataFrame[SHAPValuesSchema] + + +class FeatureImportancesSchema(Schema): + """Schema for the project feature importances.""" + + feature: papd.Series[padt.String] = pa.Field() + importance: papd.Series[padt.Float32] = pa.Field() + + +FeatureImportances = papd.DataFrame[FeatureImportancesSchema] diff --git a/src/bikes/io/datasets.py b/src/bikes/io/datasets.py index 4d9aeb4..623f69b 100644 --- a/src/bikes/io/datasets.py +++ b/src/bikes/io/datasets.py @@ -5,9 +5,14 @@ import abc import typing as T +import mlflow.data.pandas_dataset as lineage import pandas as pd import pydantic as pdt +# %% TYPINGS + +Lineage: T.TypeAlias = lineage.PandasDataset + # %% READERS @@ -33,6 +38,26 @@ def read(self) -> pd.DataFrame: pd.DataFrame: dataframe representation. """ + @abc.abstractmethod + def lineage( + self, + name: str, + data: pd.DataFrame, + targets: str | None = None, + predictions: str | None = None, + ) -> Lineage: + """Generate lineage information. + + Args: + name (str): dataset name. + data (pd.DataFrame): reader dataframe. + targets (str | None): name of the target column. + predictions (str | None): name of the prediction column. + + Returns: + Lineage: lineage information. + """ + class ParquetReader(Reader): """Read a dataframe from a parquet file. @@ -53,6 +78,18 @@ def read(self) -> pd.DataFrame: data = data.head(self.limit) return data + @T.override + def lineage( + self, + name: str, + data: pd.DataFrame, + targets: str | None = None, + predictions: str | None = None, + ) -> Lineage: + return lineage.from_pandas( + df=data, name=name, source=self.path, targets=targets, predictions=predictions + ) + ReaderKind = ParquetReader diff --git a/src/bikes/io/registries.py b/src/bikes/io/registries.py index 06d686f..82a824d 100644 --- a/src/bikes/io/registries.py +++ b/src/bikes/io/registries.py @@ -34,12 +34,12 @@ def uri_for_model_alias(name: str, alias: str) -> str: return f"models:/{name}@{alias}" -def uri_for_model_version(name: str, version: str) -> str: +def uri_for_model_version(name: str, version: int) -> str: """Create a model URI from a model name and a version. Args: name (str): name of the mlflow registered model. - version (str): version of the registered model. + version (int): version of the registered model. Returns: str: model URI as "models:/name/version." @@ -47,6 +47,22 @@ def uri_for_model_version(name: str, version: str) -> str: return f"models:/{name}/{version}" +def uri_for_model_alias_or_version(name: str, alias_or_version: str | int) -> str: + """Create a model URi from a model name and an alias or version. + + Args: + name (str): name of the mlflow registered model. + alias_or_version (str | int): alias or version of the registered model. + + Returns: + str: model URI as "models:/name@alias" or "models:/name/version" based on input. + """ + if isinstance(alias_or_version, int): + return uri_for_model_version(name=name, version=alias_or_version) + else: + return uri_for_model_alias(name=name, alias=alias_or_version) + + # %% SAVERS @@ -113,7 +129,7 @@ def predict( Args: context (mlflow.pyfunc.PythonModelContext): mlflow context. model_input (schemas.Inputs): inputs for the mlflow model. - params(dict[str, T.Any] | None): additional parameters. + params (dict[str, T.Any] | None): additional parameters. Returns: schemas.Outputs: validated outputs of the project model. diff --git a/src/bikes/io/services.py b/src/bikes/io/services.py index 13736d6..d821c35 100644 --- a/src/bikes/io/services.py +++ b/src/bikes/io/services.py @@ -13,6 +13,7 @@ import mlflow import mlflow.tracking as mt import pydantic as pdt +from plyer import notification # %% SERVICES @@ -81,6 +82,44 @@ def logger(self) -> loguru.Logger: return loguru.logger +class AlertsService(Service): + """Service for sending notifications. + + Require libnotify-bin on Linux systems. + + In production, use with Slack, Discord, or emails. + + https://plyer.readthedocs.io/en/latest/api.html#plyer.facades.Notification + + Parameters: + enable (bool): use notifications or print. + app_name (str): name of the application. + timeout (int | None): timeout in secs. + """ + + enable: bool = True + app_name: str = "Bikes" + timeout: int | None = None + + @T.override + def start(self) -> None: + pass + + def notify(self, title: str, message: str) -> None: + """Send a notification to the system. + + Args: + title (str): title of the notification. + message (str): message of the notification. + """ + if self.enable: + notification.notify( + title=title, message=message, app_name=self.app_name, timeout=self.timeout + ) + else: + print(f"[{self.app_name}] {title}: {message}") + + class MlflowService(Service): """Service for Mlflow tracking and registry. @@ -112,7 +151,7 @@ class RunConfig(pdt.BaseModel, strict=True, frozen=True, extra="forbid"): name: str description: str | None = None tags: dict[str, T.Any] | None = None - log_system_metrics: bool | None = None + log_system_metrics: bool | None = True # server uri tracking_uri: str = "./mlruns" @@ -145,7 +184,7 @@ def start(self) -> None: exclusive=self.autolog_exclusive, log_input_examples=self.autolog_log_input_examples, log_model_signatures=self.autolog_log_model_signatures, - log_models=self.autolog_log_models, + log_datasets=self.autolog_log_datasets, silent=self.autolog_silent, ) diff --git a/src/bikes/jobs/__init__.py b/src/bikes/jobs/__init__.py index dd76e7d..9b7d2d1 100644 --- a/src/bikes/jobs/__init__.py +++ b/src/bikes/jobs/__init__.py @@ -2,6 +2,8 @@ # %% IMPORTS +from bikes.jobs.evaluations import EvaluationsJob +from bikes.jobs.explanations import ExplanationsJob from bikes.jobs.inference import InferenceJob from bikes.jobs.promotion import PromotionJob from bikes.jobs.training import TrainingJob @@ -9,8 +11,16 @@ # %% TYPES -JobKind = TuningJob | TrainingJob | PromotionJob | InferenceJob +JobKind = TuningJob | TrainingJob | PromotionJob | InferenceJob | EvaluationsJob | ExplanationsJob # %% EXPORTS -__all__ = ["TuningJob", "TrainingJob", "PromotionJob", "InferenceJob", "JobKind"] +__all__ = [ + "TuningJob", + "TrainingJob", + "PromotionJob", + "InferenceJob", + "EvaluationsJob", + "ExplanationsJob", + "JobKind", +] diff --git a/src/bikes/jobs/base.py b/src/bikes/jobs/base.py index 7e7406c..e2105f9 100644 --- a/src/bikes/jobs/base.py +++ b/src/bikes/jobs/base.py @@ -25,13 +25,15 @@ class Job(abc.ABC, pdt.BaseModel, strict=True, frozen=True, extra="forbid"): e.g., to define common services like logger Parameters: - logger_service (services.LoggerService): manage the logging system. + logger_service (services.LoggerService): manage the logger system. + alerts_service (services.AlertsService): manage the alerts system. mlflow_service (services.MlflowService): manage the mlflow system. """ KIND: str logger_service: services.LoggerService = services.LoggerService() + alerts_service: services.AlertsService = services.AlertsService() mlflow_service: services.MlflowService = services.MlflowService() def __enter__(self) -> T.Self: @@ -43,6 +45,8 @@ def __enter__(self) -> T.Self: self.logger_service.start() logger = self.logger_service.logger() logger.debug("[START] Logger service: {}", self.logger_service) + logger.debug("[START] Alerts service: {}", self.alerts_service) + self.alerts_service.start() logger.debug("[START] Mlflow service: {}", self.mlflow_service) self.mlflow_service.start() return self @@ -66,6 +70,8 @@ def __exit__( logger = self.logger_service.logger() logger.debug("[STOP] Mlflow service: {}", self.mlflow_service) self.mlflow_service.stop() + logger.debug("[STOP] Alerts service: {}", self.alerts_service) + self.alerts_service.stop() logger.debug("[STOP] Logger service: {}", self.logger_service) self.logger_service.stop() return False # re-raise diff --git a/src/bikes/jobs/evaluations.py b/src/bikes/jobs/evaluations.py new file mode 100644 index 0000000..b6ecfd9 --- /dev/null +++ b/src/bikes/jobs/evaluations.py @@ -0,0 +1,130 @@ +"""Define a job for evaluating registered models with data.""" + +# %% IMPORTS + +import typing as T + +import mlflow +import pandas as pd +import pydantic as pdt + +from bikes.core import metrics as metrics_ +from bikes.core import schemas +from bikes.io import datasets, registries, services +from bikes.jobs import base + +# %% JOBS + + +class EvaluationsJob(base.Job): + """Generate evaluations from a registered model and a dataset. + + Parameters: + run_config (services.MlflowService.RunConfig): mlflow run config. + inputs (datasets.ReaderKind): reader for the inputs data. + targets (datasets.ReaderKind): reader for the targets data. + model_type (str): model type (e.g. "regressor", "classifier"). + alias_or_version (str | int): alias or version for the model. + metrics (metrics_.MetricKind): metrics for the reporting. + evaluators (list[str]): list of evaluators to use. + thresholds (dict[str, metrics_.Threshold] | None): metric thresholds. + """ + + KIND: T.Literal["EvaluationsJob"] = "EvaluationsJob" + + # Run + run_config: services.MlflowService.RunConfig = services.MlflowService.RunConfig( + name="Evaluations" + ) + # Data + inputs: datasets.ReaderKind = pdt.Field(..., discriminator="KIND") + targets: datasets.ReaderKind = pdt.Field(..., discriminator="KIND") + # Model + model_type: str = "regressor" + alias_or_version: str | int = "Champion" + # Metrics + metrics: list[metrics_.MetricKind] = pdt.Field([metrics_.SklearnMetric()], discriminator="KIND") + # Evaluators + evaluators: list[str] = ["default"] + # Thresholds + thresholds: dict[str, metrics_.Threshold] = { + "r2_score": metrics_.Threshold(threshold=0.5, greater_is_better=True) + } + + @T.override + def run(self) -> base.Locals: + # services + # - logger + logger = self.logger_service.logger() + logger.info("With logger: {}", logger) + # - mlflow + client = self.mlflow_service.client() + logger.info("With client: {}", client.tracking_uri) + with self.mlflow_service.run_context(run_config=self.run_config) as run: + logger.info("With run context: {}", run.info) + # data + # - inputs + logger.info("Read inputs: {}", self.inputs) + inputs_ = self.inputs.read() # unchecked! + inputs = schemas.InputsSchema.check(inputs_) + logger.debug("- Inputs shape: {}", inputs.shape) + # - targets + logger.info("Read targets: {}", self.targets) + targets_ = self.targets.read() # unchecked! + targets = schemas.TargetsSchema.check(targets_) + logger.debug("- Targets shape: {}", targets.shape) + # lineage + # - inputs + logger.info("Log lineage: inputs") + inputs_lineage = self.inputs.lineage(data=inputs, name="inputs") + mlflow.log_input(dataset=inputs_lineage, context=self.run_config.name) + logger.debug("- Inputs lineage: {}", inputs_lineage.to_dict()) + # - targets + logger.info("Log lineage: targets") + targets_lineage = self.targets.lineage( + data=targets, name="targets", targets=schemas.TargetsSchema.cnt + ) + mlflow.log_input(dataset=targets_lineage, context=self.run_config.name) + logger.debug("- Targets lineage: {}", targets_lineage.to_dict()) + # dataset + logger.info("Create dataset: inputs & targets") + dataset = mlflow.data.from_pandas( + df=pd.concat([inputs, targets], axis="columns"), + name="evaluation", + source=f"{inputs_lineage.source.uri} & {targets_lineage.source.uri}", + targets=schemas.TargetsSchema.cnt, + ) + logger.debug("- Dataset: {}", dataset.to_dict()) + # model + logger.info("With model: {}", self.mlflow_service.registry_name) + model_uri = registries.uri_for_model_alias_or_version( + name=self.mlflow_service.registry_name, alias_or_version=self.alias_or_version + ) + logger.debug("- Model URI: {}", model_uri) + # metrics + logger.debug("Convert metrics: {}", self.metrics) + extra_metrics = [metric.to_mlflow() for metric in self.metrics] + logger.debug("- Extra metrics: {}", extra_metrics) + # thresholds + logger.info("Convert thresholds: {}", self.thresholds) + validation_thresholds = { + name: threshold.to_mlflow() for name, threshold in self.thresholds.items() + } + logger.debug("- Validation thresholds: {}", validation_thresholds) + # evaluations + logger.info("Compute evaluations: {}", self.model_type) + evaluations = mlflow.evaluate( + data=dataset, + model=model_uri, + model_type=self.model_type, + evaluators=self.evaluators, + extra_metrics=extra_metrics, + validation_thresholds=validation_thresholds, + ) + logger.debug("- Evaluations metrics: {}", evaluations.metrics) + # notify + self.alerts_service.notify( + title="Evaluations Job Finished", + message=f"Evaluation metrics: {evaluations.metrics}", + ) + return locals() diff --git a/src/bikes/jobs/explanations.py b/src/bikes/jobs/explanations.py new file mode 100644 index 0000000..3983a9d --- /dev/null +++ b/src/bikes/jobs/explanations.py @@ -0,0 +1,79 @@ +"""Define a job for explaining the model structure and decisions.""" + +# %% IMPORTS + +import typing as T + +import pydantic as pdt + +from bikes.core import schemas +from bikes.io import datasets, registries +from bikes.jobs import base + +# %% JOBS + + +class ExplanationsJob(base.Job): + """Generate explanations from the model and a data sample. + + Parameters: + inputs_samples (datasets.ReaderKind): reader for the samples data. + models_explanations (datasets.WriterKind): writer for models explanation. + samples_explanations (datasets.WriterKind): writer for samples explanation. + alias_or_version (str | int): alias or version for the model. + loader (registries.LoaderKind): registry loader for the model. + """ + + KIND: T.Literal["ExplanationsJob"] = "ExplanationsJob" + + # Samples + inputs_samples: datasets.ReaderKind = pdt.Field(..., discriminator="KIND") + # Explanations + models_explanations: datasets.WriterKind = pdt.Field(..., discriminator="KIND") + samples_explanations: datasets.WriterKind = pdt.Field(..., discriminator="KIND") + # Model + alias_or_version: str | int = "Champion" + # Loader + loader: registries.LoaderKind = pdt.Field(registries.CustomLoader(), discriminator="KIND") + + @T.override + def run(self) -> base.Locals: + # services + logger = self.logger_service.logger() + logger.info("With logger: {}", logger) + # inputs + logger.info("Read samples: {}", self.inputs_samples) + inputs_samples = self.inputs_samples.read() # unchecked! + inputs_samples = schemas.InputsSchema.check(inputs_samples) + logger.debug("- Inputs samples shape: {}", inputs_samples.shape) + # model + logger.info("With model: {}", self.mlflow_service.registry_name) + model_uri = registries.uri_for_model_alias_or_version( + name=self.mlflow_service.registry_name, alias_or_version=self.alias_or_version + ) + logger.debug("- Model URI: {}", model_uri) + # loader + logger.info("Load model: {}", self.loader) + model = self.loader.load(uri=model_uri).model.unwrap_python_model().model + logger.debug("- Model: {}", model) + # explanations + # - models + logger.info("Explain model: {}", model) + models_explanations = model.explain_model() + logger.debug("- Models explanations shape: {}", models_explanations.shape) + # - samples + logger.info("Explain samples: {}", len(inputs_samples)) + samples_explanations = model.explain_samples(inputs=inputs_samples) + logger.debug("- Samples explanations shape: {}", samples_explanations.shape) + # write + # - model + logger.info("Write models explanations: {}", self.models_explanations) + self.models_explanations.write(data=models_explanations) + # - samples + logger.info("Write samples explanations: {}", self.samples_explanations) + self.samples_explanations.write(data=samples_explanations) + # notify + self.alerts_service.notify( + title="Explanations Job Finished", message=f"Features Count: {len(models_explanations)}" + ) + return locals() diff --git a/src/bikes/jobs/inference.py b/src/bikes/jobs/inference.py index 2f7cc83..aba3eae 100644 --- a/src/bikes/jobs/inference.py +++ b/src/bikes/jobs/inference.py @@ -18,9 +18,9 @@ class InferenceJob(base.Job): Parameters: inputs (datasets.ReaderKind): reader for the inputs data. - outputs (datasets.WriterKind ): writer for the outputs data. - alias (str): alias tag for the model. Defaults to "Champion". - loader (registries.LoaderKind): loader system for the model. + outputs (datasets.WriterKind): writer for the outputs data. + alias_or_version (str | int): alias or version for the model. + loader (registries.LoaderKind): registry loader for the model. """ KIND: T.Literal["InferenceJob"] = "InferenceJob" @@ -30,7 +30,7 @@ class InferenceJob(base.Job): # Outputs outputs: datasets.WriterKind = pdt.Field(..., discriminator="KIND") # Model - alias: str = "Champion" + alias_or_version: str | int = "Champion" # Loader loader: registries.LoaderKind = pdt.Field(registries.CustomLoader(), discriminator="KIND") @@ -46,8 +46,8 @@ def run(self) -> base.Locals: logger.debug("- Inputs shape: {}", inputs.shape) # model logger.info("With model: {}", self.mlflow_service.registry_name) - model_uri = registries.uri_for_model_alias( - name=self.mlflow_service.registry_name, alias=self.alias + model_uri = registries.uri_for_model_alias_or_version( + name=self.mlflow_service.registry_name, alias_or_version=self.alias_or_version ) logger.debug("- Model URI: {}", model_uri) # loader @@ -60,5 +60,9 @@ def run(self) -> base.Locals: logger.debug("- Outputs shape: {}", outputs.shape) # write logger.info("Write outputs: {}", self.outputs) - self.outputs.write(outputs) + self.outputs.write(data=outputs) + # notify + self.alerts_service.notify( + title="Inference Job Finished", message=f"Outputs Shape: {outputs.shape}" + ) return locals() diff --git a/src/bikes/jobs/promotion.py b/src/bikes/jobs/promotion.py index 85f4891..2bc3a95 100644 --- a/src/bikes/jobs/promotion.py +++ b/src/bikes/jobs/promotion.py @@ -32,8 +32,8 @@ def run(self) -> base.Locals: logger.info("With logger: {}", logger) # - mlflow client = self.mlflow_service.client() + logger.info("With client: {}", client) name = self.mlflow_service.registry_name - logger.info("With mlflow model name: {}", name) # version if self.version is None: # use the latest model version version = client.search_model_versions( @@ -49,4 +49,9 @@ def run(self) -> base.Locals: client.set_registered_model_alias(name=name, alias=self.alias, version=version) model_version = client.get_model_version_by_alias(name=name, alias=self.alias) logger.debug("- Model version: {}", model_version) + # notify + self.alerts_service.notify( + title="Promotion Job Finished", + message=f"Version: {model_version.version} @ {self.alias}", + ) return locals() diff --git a/src/bikes/jobs/training.py b/src/bikes/jobs/training.py index b245787..571d291 100644 --- a/src/bikes/jobs/training.py +++ b/src/bikes/jobs/training.py @@ -4,6 +4,7 @@ import typing as T +import mlflow import pydantic as pdt from bikes.core import metrics as metrics_ @@ -61,8 +62,9 @@ def run(self) -> base.Locals: logger.info("With logger: {}", logger) # - mlflow client = self.mlflow_service.client() + logger.info("With client: {}", client.tracking_uri) with self.mlflow_service.run_context(run_config=self.run_config) as run: - logger.info("With mlflow run id: {}", run.info.run_id) + logger.info("With run context: {}", run.info) # data # - inputs logger.info("Read inputs: {}", self.inputs) @@ -74,6 +76,19 @@ def run(self) -> base.Locals: targets_ = self.targets.read() # unchecked! targets = schemas.TargetsSchema.check(targets_) logger.debug("- Targets shape: {}", targets.shape) + # lineage + # - inputs + logger.info("Log lineage: inputs") + inputs_lineage = self.inputs.lineage(data=inputs, name="inputs") + mlflow.log_input(dataset=inputs_lineage, context=self.run_config.name) + logger.debug("- Inputs lineage: {}", inputs_lineage.to_dict()) + # - targets + logger.info("Log lineage: targets") + targets_lineage = self.targets.lineage( + data=targets, name="targets", targets=schemas.TargetsSchema.cnt + ) + mlflow.log_input(dataset=targets_lineage, context=self.run_config.name) + logger.debug("- Targets lineage: {}", targets_lineage.to_dict()) # splitter logger.info("With splitter: {}", self.splitter) # - index @@ -117,4 +132,8 @@ def run(self) -> base.Locals: name=self.mlflow_service.registry_name, model_uri=model_info.model_uri ) logger.debug("- Model version: {}", model_version) + # notify + self.alerts_service.notify( + title="Training Job Finished", message=f"Model version: {model_version.version}" + ) return locals() diff --git a/src/bikes/jobs/tuning.py b/src/bikes/jobs/tuning.py index a5a3091..ed0df86 100644 --- a/src/bikes/jobs/tuning.py +++ b/src/bikes/jobs/tuning.py @@ -4,6 +4,7 @@ import typing as T +import mlflow import pydantic as pdt from bikes.core import metrics, models, schemas @@ -59,9 +60,8 @@ def run(self) -> base.Locals: # - logger logger = self.logger_service.logger() logger.info("With logger: {}", logger) - # - mlflow with self.mlflow_service.run_context(run_config=self.run_config) as run: - logger.info("With mlflow run id: {}", run.info.run_id) + logger.info("With run context: {}", run.info) # data # - inputs logger.info("Read inputs: {}", self.inputs) @@ -73,6 +73,19 @@ def run(self) -> base.Locals: targets_ = self.targets.read() # unchecked! targets = schemas.TargetsSchema.check(targets_) logger.debug("- Targets shape: {}", targets.shape) + # lineage + # - inputs + logger.info("Log lineage: inputs") + inputs_lineage = self.inputs.lineage(data=inputs, name="inputs") + mlflow.log_input(dataset=inputs_lineage, context=self.run_config.name) + logger.debug("- Inputs lineage: {}", inputs_lineage.to_dict()) + # - targets + logger.info("Log lineage: targets") + targets_lineage = self.targets.lineage( + data=targets, name="targets", targets=schemas.TargetsSchema.cnt + ) + mlflow.log_input(dataset=targets_lineage, context=self.run_config.name) + logger.debug("- Targets lineage: {}", targets_lineage.to_dict()) # model logger.info("With model: {}", self.model) # metric @@ -91,4 +104,8 @@ def run(self) -> base.Locals: logger.debug("- Results: {}", results.shape) logger.debug("- Best Score: {}", best_score) logger.debug("- Best Params: {}", best_params) + # notify + self.alerts_service.notify( + title="Tuning Job Finished", message=f"Best score: {best_score}" + ) return locals() diff --git a/src/bikes/scripts.py b/src/bikes/scripts.py index eb56f1b..2dc1e55 100644 --- a/src/bikes/scripts.py +++ b/src/bikes/scripts.py @@ -1,5 +1,14 @@ """Scripts for the CLI application.""" +# ruff: noqa: E402 + +# %% WARNINGS + +import warnings + +# disable annoying mlflow warnings +warnings.filterwarnings(action="ignore", category=UserWarning) + # %% IMPORTS import argparse diff --git a/src/bikes/settings.py b/src/bikes/settings.py index aeeb2d2..2a33796 100644 --- a/src/bikes/settings.py +++ b/src/bikes/settings.py @@ -1,4 +1,4 @@ -"""Define settings of the application.""" +"""Define settings for the application.""" # %% IMPORTS diff --git a/tasks/__init__.py b/tasks/__init__.py index e9359de..6a6751c 100644 --- a/tasks/__init__.py +++ b/tasks/__init__.py @@ -6,7 +6,18 @@ from invoke import Collection -from . import checks, cleans, commits, containers, dags, docs, formats, installs, mlflow, packages +from . import ( + checks, + cleans, + commits, + containers, + docs, + formats, + installs, + mlflow, + packages, + projects, +) # %% NAMESPACES @@ -18,9 +29,9 @@ ns.add_collection(cleans) ns.add_collection(commits) ns.add_collection(containers) -ns.add_collection(dags, default=True) ns.add_collection(docs) ns.add_collection(formats) ns.add_collection(installs) ns.add_collection(mlflow) ns.add_collection(packages) +ns.add_collection(projects, default=True) diff --git a/tasks/cleans.py b/tasks/cleans.py index 02a719a..f356b46 100644 --- a/tasks/cleans.py +++ b/tasks/cleans.py @@ -89,6 +89,21 @@ def python(ctx: Context) -> None: ctx.run(r"find . -type d -name __pycache__ -exec rm -r {} \+") +# %% PROJECTS + + +@task +def requirements(ctx: Context) -> None: + """Clean the project requirements file.""" + ctx.run("rm -f requirements.txt") + + +@task +def environment(ctx: Context) -> None: + """Clean the project environment file.""" + ctx.run("rm -f python_env.yaml") + + # %% - Combines @@ -107,11 +122,16 @@ def sources(_: Context) -> None: """Run all sources tasks.""" +@task(pre=[requirements, environment]) +def projects(_: Context) -> None: + """Run all projects tasks.""" + + @task(pre=[tools, folders], default=True) def all(_: Context) -> None: """Run all tools and folders tasks.""" -@task(pre=[all, sources]) +@task(pre=[all, sources, projects]) def reset(_: Context) -> None: """Run all tools, folders, and sources tasks.""" diff --git a/tasks/dags.py b/tasks/dags.py deleted file mode 100644 index 83cdbeb..0000000 --- a/tasks/dags.py +++ /dev/null @@ -1,27 +0,0 @@ -"""DAG tasks for pyinvoke.""" - -# %% IMPORTS - -from invoke.context import Context -from invoke.tasks import call, task - -# %% TASKS - - -@task -def job(ctx: Context, name: str) -> None: - """Run the project for the given job name.""" - ctx.run(f"poetry run {ctx.project.name} confs/{name}.yaml") - - -@task( - pre=[ - call(job, name="tuning"), # type: ignore[arg-type] - call(job, name="training"), # type: ignore[arg-type] - call(job, name="promotion"), # type: ignore[arg-type] - call(job, name="inference"), # type: ignore[arg-type] - ], - default=True, -) -def all(_: Context) -> None: - """Run all DAG tasks.""" diff --git a/tasks/projects.py b/tasks/projects.py new file mode 100644 index 0000000..bd80341 --- /dev/null +++ b/tasks/projects.py @@ -0,0 +1,65 @@ +"""Project tasks for pyinvoke.""" + +# mypy: disable-error-code="arg-type" + +# %% IMPORTS + +import yaml +from invoke.context import Context +from invoke.tasks import call, task + +# %% CONFIGS + +PYTHON_VERSION = ".python-version" +REQUIREMENTS = "requirements.txt" +ENVIRONMENT = "python_env.yaml" + +# %% TASKS + + +@task +def requirements(ctx: Context) -> None: + """Export the project requirements file.""" + ctx.run(f"poetry export --without-urls --without-hashes --output={REQUIREMENTS}") + + +@task(pre=[requirements]) +def environment(ctx: Context) -> None: + """Export the project environment file.""" + with open(PYTHON_VERSION, "r") as reader: + python = reader.read().strip() # version + configuration: dict[str, object] = {"python": python} + with open(REQUIREMENTS, "r") as reader: + dependencies: list[str] = [] + for line in reader: + dependency = line.split(" ")[0] + if "pywin32" not in dependency: + dependencies.append(dependency) + configuration["dependencies"] = dependencies + with open(ENVIRONMENT, "w") as writer: + yaml.dump(configuration, writer) + + +@task +def run(ctx: Context, job: str) -> None: + """Run an mlflow project from MLproject file.""" + ctx.run( + f"mlflow run --experiment-name={ctx.project.name}" + f" --run-name={job.capitalize()} -P conf_file=confs/{job}.yaml ." + ) + + +@task( + pre=[ + environment, + call(run, job="tuning"), + call(run, job="training"), + call(run, job="promotion"), + call(run, job="inference"), + call(run, job="evaluations"), + call(run, job="explanations"), + ], + default=True, +) +def all(_: Context) -> None: + """Run all project tasks.""" diff --git a/tests/confs/valid/1. tuning.yaml b/tests/confs/valid/0. tuning.yaml similarity index 65% rename from tests/confs/valid/1. tuning.yaml rename to tests/confs/valid/0. tuning.yaml index 41b391d..b76fe0b 100644 --- a/tests/confs/valid/1. tuning.yaml +++ b/tests/confs/valid/0. tuning.yaml @@ -2,11 +2,11 @@ job: KIND: TuningJob inputs: KIND: ParquetReader - path: "${tests_path:}/data/inputs.parquet" + path: "${tests_path:}/data/inputs_sample.parquet" limit: 1500 targets: KIND: ParquetReader - path: "${tests_path:}/data/targets.parquet" + path: "${tests_path:}/data/targets_sample.parquet" limit: 1500 splitter: KIND: TimeSeriesSplitter diff --git a/tests/confs/valid/2. training.yaml b/tests/confs/valid/1. training.yaml similarity index 53% rename from tests/confs/valid/2. training.yaml rename to tests/confs/valid/1. training.yaml index f1849a3..86ea35a 100644 --- a/tests/confs/valid/2. training.yaml +++ b/tests/confs/valid/1. training.yaml @@ -2,9 +2,9 @@ job: KIND: TrainingJob inputs: KIND: ParquetReader - path: "${tests_path:}/data/inputs.parquet" + path: "${tests_path:}/data/inputs_sample.parquet" limit: 1500 targets: KIND: ParquetReader - path: "${tests_path:}/data/targets.parquet" + path: "${tests_path:}/data/targets_sample.parquet" limit: 1500 diff --git a/tests/confs/valid/3. promotion.yaml b/tests/confs/valid/2. promotion.yaml similarity index 100% rename from tests/confs/valid/3. promotion.yaml rename to tests/confs/valid/2. promotion.yaml diff --git a/tests/confs/valid/4. inference.yaml b/tests/confs/valid/3. inference.yaml similarity index 52% rename from tests/confs/valid/4. inference.yaml rename to tests/confs/valid/3. inference.yaml index 5295dc6..061b7f1 100644 --- a/tests/confs/valid/4. inference.yaml +++ b/tests/confs/valid/3. inference.yaml @@ -2,8 +2,8 @@ job: KIND: InferenceJob inputs: KIND: ParquetReader - path: "${tests_path:}/data/inputs.parquet" + path: "${tests_path:}/data/inputs_sample.parquet" limit: 1500 outputs: KIND: ParquetWriter - path: "${tmp_path:}/outputs.parquet" + path: "${tmp_path:}/outputs_sample.parquet" diff --git a/tests/confs/valid/5. evaluations.yaml b/tests/confs/valid/5. evaluations.yaml new file mode 100644 index 0000000..c9f1f95 --- /dev/null +++ b/tests/confs/valid/5. evaluations.yaml @@ -0,0 +1,10 @@ +job: + KIND: EvaluationsJob + inputs: + KIND: ParquetReader + path: "${tests_path:}/data/inputs_sample.parquet" + limit: 1500 + targets: + KIND: ParquetReader + path: "${tests_path:}/data/targets_sample.parquet" + limit: 1500 diff --git a/tests/confs/valid/6. explanations.yaml b/tests/confs/valid/6. explanations.yaml new file mode 100644 index 0000000..8f4721c --- /dev/null +++ b/tests/confs/valid/6. explanations.yaml @@ -0,0 +1,12 @@ +job: + KIND: ExplanationsJob + inputs_samples: + KIND: ParquetReader + path: "${tests_path:}/data/inputs_sample.parquet" + limit: 100 + models_explanations: + KIND: ParquetWriter + path: "${tmp_path:}/models_explanations.parquet" + samples_explanations: + KIND: ParquetWriter + path: "${tmp_path:}/samples_explanations.parquet" diff --git a/tests/conftest.py b/tests/conftest.py index 9c8c4c9..5daa9d0 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -46,19 +46,19 @@ def confs_path(tests_path: str) -> str: @pytest.fixture(scope="session") def inputs_path(data_path: str) -> str: """Return the path of the inputs dataset.""" - return os.path.join(data_path, "inputs.parquet") + return os.path.join(data_path, "inputs_sample.parquet") @pytest.fixture(scope="session") def targets_path(data_path: str) -> str: """Return the path of the targets dataset.""" - return os.path.join(data_path, "targets.parquet") + return os.path.join(data_path, "targets_sample.parquet") @pytest.fixture(scope="session") def outputs_path(data_path: str) -> str: """Return the path of the outputs dataset.""" - return os.path.join(data_path, "outputs.parquet") + return os.path.join(data_path, "outputs_sample.parquet") @pytest.fixture(scope="function") @@ -67,6 +67,18 @@ def tmp_outputs_path(tmp_path: str) -> str: return os.path.join(tmp_path, "outputs.parquet") +@pytest.fixture(scope="function") +def tmp_models_explanations_path(tmp_path: str) -> str: + """Return a tmp path for the model explanations dataset.""" + return os.path.join(tmp_path, "models_explanations.parquet") + + +@pytest.fixture(scope="function") +def tmp_samples_explanations_path(tmp_path: str) -> str: + """Return a tmp path for the samples explanations dataset.""" + return os.path.join(tmp_path, "samples_explanations.parquet") + + # %% - Configs @@ -77,6 +89,9 @@ def extra_config() -> str: config = """ { "job": { + "alerts_service": { + "enable": false, + }, "mlflow_service": { "tracking_uri": "${tmp_path:}/tracking/", "registry_uri": "${tmp_path:}/registry/", @@ -93,19 +108,35 @@ def extra_config() -> str: @pytest.fixture(scope="session") def inputs_reader(inputs_path: str) -> datasets.ParquetReader: """Return a reader for the inputs dataset.""" - return datasets.ParquetReader(path=inputs_path) + return datasets.ParquetReader(path=inputs_path, limit=LIMIT) + + +@pytest.fixture(scope="session") +def inputs_samples_reader(inputs_path: str) -> datasets.ParquetReader: + """Return a reader for the inputs samples dataset.""" + return datasets.ParquetReader(path=inputs_path, limit=100) @pytest.fixture(scope="session") def targets_reader(targets_path: str) -> datasets.ParquetReader: """Return a reader for the targets dataset.""" - return datasets.ParquetReader(path=targets_path) + return datasets.ParquetReader(path=targets_path, limit=LIMIT) @pytest.fixture(scope="session") -def outputs_reader(outputs_path: str) -> datasets.ParquetReader: +def outputs_reader( + outputs_path: str, inputs_reader: datasets.ParquetReader, targets_reader: datasets.ParquetReader +) -> datasets.ParquetReader: """Return a reader for the outputs dataset.""" - return datasets.ParquetReader(path=outputs_path) + # generate outputs if it is missing + if not os.path.exists(outputs_path): + inputs = schemas.InputsSchema.check(inputs_reader.read()) + targets = schemas.TargetsSchema.check(targets_reader.read()) + model = models.BaselineSklearnModel().fit(inputs=inputs, targets=targets) + outputs = schemas.OutputsSchema.check(model.predict(inputs=inputs)) + outputs_writer = datasets.ParquetWriter(path=outputs_path) + outputs_writer.write(data=outputs) + return datasets.ParquetReader(path=outputs_path, limit=LIMIT) @pytest.fixture(scope="function") @@ -114,6 +145,18 @@ def tmp_outputs_writer(tmp_outputs_path: str) -> datasets.ParquetWriter: return datasets.ParquetWriter(path=tmp_outputs_path) +@pytest.fixture(scope="function") +def tmp_models_explanations_writer(tmp_models_explanations_path: str) -> datasets.ParquetWriter: + """Return a writer for the tmp model explanations dataset.""" + return datasets.ParquetWriter(path=tmp_models_explanations_path) + + +@pytest.fixture(scope="function") +def tmp_samples_explanations_writer(tmp_samples_explanations_path: str) -> datasets.ParquetWriter: + """Return a writer for the tmp samples explanations dataset.""" + return datasets.ParquetWriter(path=tmp_samples_explanations_path) + + # %% - Dataframes @@ -124,6 +167,13 @@ def inputs(inputs_reader: datasets.ParquetReader) -> schemas.Inputs: return schemas.InputsSchema.check(data) +@pytest.fixture(scope="session") +def inputs_samples(inputs_samples_reader: datasets.ParquetReader) -> schemas.Inputs: + """Return the inputs samples data.""" + data = inputs_samples_reader.read() + return schemas.InputsSchema.check(data) + + @pytest.fixture(scope="session") def targets(targets_reader: datasets.ParquetReader) -> schemas.Targets: """Return the targets data.""" @@ -244,6 +294,15 @@ def logger_caplog( logger.remove(handler_id) +@pytest.fixture(scope="session", autouse=True) +def alerts_service() -> T.Generator[services.AlertsService, None, None]: + """Return and start the alerter service.""" + service = services.AlertsService(enable=False) + service.start() + yield service + service.stop() + + @pytest.fixture(scope="function", autouse=True) def mlflow_service(tmp_path: str) -> T.Generator[services.MlflowService, None, None]: """Return and start the mlflow service.""" diff --git a/tests/core/test_metrics.py b/tests/core/test_metrics.py index f6114e6..c8a286c 100644 --- a/tests/core/test_metrics.py +++ b/tests/core/test_metrics.py @@ -1,6 +1,7 @@ # %% IMPORTS - +import mlflow +import pandas as pd import pytest from bikes.core import metrics, models, schemas @@ -25,10 +26,44 @@ def test_sklearn_metric( ) -> None: # given low, high = interval + data = pd.concat([targets, outputs], axis="columns") metric = metrics.SklearnMetric(name=name, greater_is_better=greater_is_better) # when score = metric.score(targets=targets, outputs=outputs) scorer = metric.scorer(model=model, inputs=inputs, targets=targets) + mlflow_metric = metric.to_mlflow() + mlflow_results = mlflow.evaluate( + data=data, + predictions=schemas.OutputsSchema.prediction, + targets=schemas.TargetsSchema.cnt, + extra_metrics=[mlflow_metric], + ) + # then + # - score + assert low <= score <= high, "Score should be in the expected interval!" + # - scorer + assert low <= scorer <= high, "Scorer should be in the expected interval!" + # - mlflow metric + assert mlflow_metric.name == metric.name, "Mlflow metric name should be the same!" + assert ( + mlflow_metric.greater_is_better == metric.greater_is_better + ), "Mlflow metric greater is better should be the same!" + # - mlflow results + assert mlflow_results.metrics == { + metric.name: score * (1 if greater_is_better else -1) + }, "Mlflow results metrics should have the same name and score!" + + +# %% THRESHOLDS + + +def test_threshold() -> None: + # given + threshold = metrics.Threshold(threshold=10, greater_is_better=True) + # when + mlflow_threshold = threshold.to_mlflow() # then - assert low <= score <= high, "Score is not in the expected interval!" - assert low <= scorer <= high, "Scorer is not in the expected interval!" + assert mlflow_threshold.threshold == threshold.threshold, "Threshold should be the same!" + assert ( + mlflow_threshold.greater_is_better == threshold.greater_is_better + ), "Greater is better should be the same!" diff --git a/tests/core/test_models.py b/tests/core/test_models.py index fa7d04c..47ce7f0 100644 --- a/tests/core/test_models.py +++ b/tests/core/test_models.py @@ -8,7 +8,7 @@ # %% MODELS -def test_model() -> None: +def test_model(inputs_samples: schemas.Inputs) -> None: # given class MyModel(models.Model): KIND: T.Literal["MyModel"] = "MyModel" @@ -29,7 +29,11 @@ def predict(self, inputs: schemas.Inputs) -> schemas.Outputs: model = MyModel(a=10) params_init = model.get_params() params_set_params = model.set_params(b=20).get_params() - with pytest.raises(NotImplementedError) as error: + with pytest.raises(NotImplementedError) as explain_model_error: + model.explain_model() + with pytest.raises(NotImplementedError) as explain_samples_error: + model.explain_samples(inputs=inputs_samples) + with pytest.raises(NotImplementedError) as get_internal_model_error: model.get_internal_model() # then assert params_init == {"a": 10, "b": 2}, "Model should have the given params after init!" @@ -37,7 +41,15 @@ def predict(self, inputs: schemas.Inputs) -> schemas.Outputs: "a": 10, "b": 20, }, "Model should have the given params after set_params!" - assert isinstance(error.value, NotImplementedError), "Model should raise NotImplementedError!" + assert isinstance( + explain_model_error.value, NotImplementedError + ), "Model should raise NotImplementedError for explain_model_error()!" + assert isinstance( + explain_samples_error.value, NotImplementedError + ), "Model should raise NotImplementedError for explain_samples_error()!" + assert isinstance( + get_internal_model_error.value, NotImplementedError + ), "Model should raise NotImplementedError for get_internal_model_error()!" def test_baseline_sklearn_model( @@ -52,10 +64,28 @@ def test_baseline_sklearn_model( model.get_internal_model() model.fit(inputs=inputs_train, targets=targets_train) outputs = model.predict(inputs=inputs_test) + shap_values = model.explain_samples(inputs=inputs_test) + feature_importances = model.explain_model() # then assert not_fitted_error.match( "Model is not fitted yet!" ), "Model should raise an error when not fitted!" - assert outputs.ndim == 2, "Outputs should be a dataframe!" + # - model assert model.get_params() == params, "Model should have the given params!" assert model.get_internal_model() is not None, "Internal model should be fitted!" + # - outputs + assert outputs.ndim == 2, "Outputs should be a dataframe!" + # - shap values + assert len(shap_values.index) == len( + inputs_test.index + ), "SHAP values should be the same length as inputs!" + assert len(shap_values.columns) >= len( + inputs_test.columns + ), "SHAP values should have more features than inputs!" + # - feature importances + assert ( + feature_importances["importance"].sum() == 1.0 + ), "Feature importances should add up to 1.0!" + assert len(feature_importances["feature"]) >= len( + inputs_train.columns + ), "Feature importances should have more features than inputs!" diff --git a/tests/core/test_schemas.py b/tests/core/test_schemas.py index 7102286..d06653e 100644 --- a/tests/core/test_schemas.py +++ b/tests/core/test_schemas.py @@ -1,6 +1,6 @@ # %% IMPORTS -from bikes.core import schemas +from bikes.core import models, schemas from bikes.io import datasets # %% SCHEMAS @@ -31,3 +31,25 @@ def test_outputs_schema(outputs_reader: datasets.Reader) -> None: data = outputs_reader.read() # then assert schema.check(data) is not None, "Outputs data should be valid!" + + +def test_shap_values_schema( + model: models.Model, + train_test_sets: tuple[schemas.Inputs, schemas.Targets, schemas.Inputs, schemas.Targets], +) -> None: + # given + schema = schemas.SHAPValuesSchema + _, _, inputs_test, _ = train_test_sets + # when + data = model.explain_samples(inputs=inputs_test) + # then + assert schema.check(data) is not None, "SHAP values data should be valid!" + + +def test_feature_importances_schema(model: models.Model) -> None: + # given + schema = schemas.FeatureImportancesSchema + # when + data = model.explain_model() + # then + assert schema.check(data) is not None, "Feature importance data should be valid!" diff --git a/tests/data/inputs.parquet b/tests/data/inputs.parquet deleted file mode 100644 index 1cdbbad..0000000 Binary files a/tests/data/inputs.parquet and /dev/null differ diff --git a/tests/data/inputs_sample.parquet b/tests/data/inputs_sample.parquet new file mode 100644 index 0000000..8ba44d0 Binary files /dev/null and b/tests/data/inputs_sample.parquet differ diff --git a/tests/data/outputs.parquet b/tests/data/outputs.parquet deleted file mode 100644 index f46aff2..0000000 Binary files a/tests/data/outputs.parquet and /dev/null differ diff --git a/tests/data/outputs_sample.parquet b/tests/data/outputs_sample.parquet new file mode 100644 index 0000000..7c34e1b Binary files /dev/null and b/tests/data/outputs_sample.parquet differ diff --git a/tests/data/targets.parquet b/tests/data/targets.parquet deleted file mode 100644 index eed421e..0000000 Binary files a/tests/data/targets.parquet and /dev/null differ diff --git a/tests/data/targets_sample.parquet b/tests/data/targets_sample.parquet new file mode 100644 index 0000000..da17dfd Binary files /dev/null and b/tests/data/targets_sample.parquet differ diff --git a/tests/io/test_datasets.py b/tests/io/test_datasets.py index 0f4004d..2201f65 100644 --- a/tests/io/test_datasets.py +++ b/tests/io/test_datasets.py @@ -15,10 +15,21 @@ def test_parquet_reader(limit: int | None, inputs_path: str) -> None: reader = datasets.ParquetReader(path=inputs_path, limit=limit) # when data = reader.read() + lineage = reader.lineage(name="inputs", data=data) # then + # - data assert data.ndim == 2, "Data should be a dataframe!" if limit is not None: assert len(data) == limit, "Data should have the limit size!" + # - lineage + assert lineage.name == "inputs", "Lineage name should be inputs!" + assert lineage.source.uri == inputs_path, "Lineage source uri should be the inputs path!" + assert set(lineage.schema.input_names()) == set( + data.columns + ), "Lineage schema names should be the data columns!" + assert lineage.profile["num_rows"] == len( + data + ), "Lineage profile should contain the data row count!" # %% WRITERS diff --git a/tests/io/test_registries.py b/tests/io/test_registries.py index e05ef18..29cb4a7 100644 --- a/tests/io/test_registries.py +++ b/tests/io/test_registries.py @@ -20,13 +20,30 @@ def test_uri_for_model_alias() -> None: def test_uri_for_model_version() -> None: # given name = "testing" - version = "1" + version = 1 # when uri = registries.uri_for_model_version(name=name, version=version) # then assert uri == f"models:/{name}/{version}", "The model URI should be valid!" +def test_uri_for_model_alias_or_version() -> None: + # given + name = "testing" + alias = "Champion" + version = 1 + # when + alias_uri = registries.uri_for_model_alias_or_version(name=name, alias_or_version=alias) + version_uri = registries.uri_for_model_alias_or_version(name=name, alias_or_version=version) + # then + assert alias_uri == registries.uri_for_model_alias( + name=name, alias=alias + ), "The alias URI should be valid!" + assert version_uri == registries.uri_for_model_version( + name=name, version=version + ), "The version URI should be valid!" + + # %% SAVERS/LOADERS/REGISTERS diff --git a/tests/io/test_services.py b/tests/io/test_services.py index dca2ae7..a11e28b 100644 --- a/tests/io/test_services.py +++ b/tests/io/test_services.py @@ -1,7 +1,11 @@ # %% IMPORTS +import _pytest.capture as pc import _pytest.logging as pl import mlflow +import plyer +import pytest +import pytest_mock as pm from bikes.io import services # %% SERVICES @@ -21,6 +25,29 @@ def test_logger_service( assert "ERROR" in logger_caplog.messages, "Error message should be logged!" +@pytest.mark.parametrize("enable", [True, False]) +def test_alerts_service( + enable: bool, mocker: pm.MockerFixture, capsys: pc.CaptureFixture[str] +) -> None: + # given + service = services.AlertsService(enable=enable) + mocker.patch("plyer.notification.notify") + # when + service.notify(title="test", message="hello") + # then + if enable: + plyer.notification.notify.assert_called_once(), "Notification method should be called!" + assert capsys.readouterr().out == "", "Notification should not be printed to stdout!" + else: + ( + plyer.notification.notify.assert_not_called(), + "Notification method should not be called!", + ) + assert ( + capsys.readouterr().out == "[Bikes] test: hello\n" + ), "Notification should be printed to stdout!" + + def test_mlflow_service(mlflow_service: services.MlflowService) -> None: # given service = mlflow_service diff --git a/tests/jobs/test_base.py b/tests/jobs/test_base.py index 2bb2648..c86982a 100644 --- a/tests/jobs/test_base.py +++ b/tests/jobs/test_base.py @@ -7,7 +7,9 @@ def test_job( - logger_service: services.LoggerService, mlflow_service: services.MlflowService + logger_service: services.LoggerService, + alerts_service: services.AlertsService, + mlflow_service: services.MlflowService, ) -> None: # given class MyJob(base.Job): @@ -17,13 +19,16 @@ def run(self) -> base.Locals: a, b = 1, "test" return locals() - job = MyJob(logger_service=logger_service, mlflow_service=mlflow_service) + job = MyJob( + logger_service=logger_service, alerts_service=alerts_service, mlflow_service=mlflow_service + ) # when with job as runner: out = runner.run() # then # - inputs assert hasattr(job, "logger_service"), "Job should have an Logger service!" + assert hasattr(job, "alerts_service"), "Job should have a alerter service!" assert hasattr(job, "mlflow_service"), "Job should have an Mlflow service!" # - outputs assert set(out) == {"self", "a", "b"}, "Run should return local variables!" diff --git a/tests/jobs/test_evaluations.py b/tests/jobs/test_evaluations.py new file mode 100644 index 0000000..3f5f1bc --- /dev/null +++ b/tests/jobs/test_evaluations.py @@ -0,0 +1,158 @@ +# %% IMPORTS + +import _pytest.capture as pc +import pytest +from bikes import jobs +from bikes.core import metrics, schemas +from bikes.io import datasets, registries, services + +# %% JOBS + + +@pytest.mark.parametrize( + "alias_or_version, thresholds", + [ + ( + 1, + { + "mean_squared_error": metrics.Threshold( + threshold=float("inf"), greater_is_better=False + ) + }, + ), + ( + "Promotion", + {"r2_score": metrics.Threshold(threshold=-1, greater_is_better=True)}, + ), + pytest.param( + "Promotion", + {"r2_score": metrics.Threshold(threshold=100, greater_is_better=True)}, + marks=pytest.mark.xfail( + reason="Invalid threshold for metric.", + raises=metrics.MlflowModelValidationFailedException, + ), + ), + ], +) +def test_evaluations_job( + alias_or_version: str | int, + thresholds: dict[str, metrics.Threshold], + mlflow_service: services.MlflowService, + alerts_service: services.AlertsService, + logger_service: services.LoggerService, + inputs_reader: datasets.ParquetReader, + targets_reader: datasets.ParquetReader, + model_alias: registries.Version, + metric: metrics.Metric, + capsys: pc.CaptureFixture[str], +) -> None: + # given + if isinstance(alias_or_version, int): + assert alias_or_version == model_alias.version, "Model version should be the same!" + else: + assert alias_or_version == model_alias.aliases[0], "Model alias should be the same!" + run_config = mlflow_service.RunConfig( + name="EvaluationsTest", tags={"context": "evaluations"}, description="Evaluations job." + ) + # when + job = jobs.EvaluationsJob( + logger_service=logger_service, + alerts_service=alerts_service, + mlflow_service=mlflow_service, + run_config=run_config, + inputs=inputs_reader, + targets=targets_reader, + alias_or_version=alias_or_version, + metrics=[metric], + thresholds=thresholds, + ) + with job as runner: + out = runner.run() + # then + # - vars + assert set(out) == { + "self", + "logger", + "client", + "run", + "inputs", + "inputs_", + "inputs_lineage", + "targets", + "targets_", + "targets_lineage", + "dataset", + "model_uri", + "extra_metrics", + "validation_thresholds", + "evaluations", + } + # - run + assert run_config.tags is not None, "Run config tags should be set!" + assert out["run"].info.run_name == run_config.name, "Run name should be the same!" + assert run_config.description in out["run"].data.tags.values(), "Run desc. should be tags!" + assert ( + out["run"].data.tags.items() > run_config.tags.items() + ), "Run tags should be a subset of tags!" + # - data + assert out["inputs"].ndim == out["inputs_"].ndim == 2, "Inputs should be a dataframe!" + assert out["targets"].ndim == out["targets_"].ndim == 2, "Targets should be a dataframe!" + # - lineage + assert out["inputs_lineage"].name == "inputs", "Inputs lineage name should be inputs!" + assert ( + out["inputs_lineage"].source.uri == inputs_reader.path + ), "Inputs lineage source should be the inputs reader path!" + assert out["targets_lineage"].name == "targets", "Targets lineage name should be targets!" + assert ( + out["targets_lineage"].source.uri == targets_reader.path + ), "Targets lineage source should be the targets reader path!" + assert ( + out["targets_lineage"].targets == schemas.TargetsSchema.cnt + ), "Targets lineage target should be cnt!" + # - dataset + assert out["dataset"].name == "evaluation", "Dataset name should be evaluation!" + assert out["dataset"].predictions is None, "Dataset predictions should be None!" + assert ( + out["dataset"].targets == schemas.TargetsSchema.cnt + ), "Dataset targets should be the target column!" + assert ( + inputs_reader.path in out["dataset"].source.uri + ), "Dataset source should contain the inputs path!" + assert ( + targets_reader.path in out["dataset"].source.uri + ), "Dataset source should contain the targets path!" + # - model uri + assert str(alias_or_version) in out["model_uri"], "Model URI should contain the model alias!" + assert ( + mlflow_service.registry_name in out["model_uri"] + ), "Model URI should contain the registry name!" + # - extra metrics + assert len(out["extra_metrics"]) == len( + job.metrics + ), "Extra metrics should have the same length as metrics!" + assert ( + out["extra_metrics"][0].name == job.metrics[0].name + ), "Extra metrics name should be the same!" + assert ( + out["extra_metrics"][0].greater_is_better == job.metrics[0].greater_is_better + ), "Extra metrics greatter is better should be the same!" + # - validation thresholds + assert ( + out["validation_thresholds"].keys() == thresholds.keys() + ), "Validation thresholds should have the same keys as thresholds!" + # - evaluations + assert ( + out["evaluations"].metrics["example_count"] == inputs_reader.limit + ), "Evaluations should have the same number of examples as the inputs!" + assert job.metrics[0].name in out["evaluations"].metrics, "Metric should be logged in Mlflow!" + # - mlflow tracking + experiment = mlflow_service.client().get_experiment_by_name(name=mlflow_service.experiment_name) + assert ( + experiment.name == mlflow_service.experiment_name + ), "Mlflow Experiment name should be the same!" + runs = mlflow_service.client().search_runs(experiment_ids=experiment.experiment_id) + assert len(runs) == 2, "There should be a two Mlflow run for training and evaluations!" + assert metric.name in runs[0].data.metrics, "Metric should be logged in Mlflow!" + assert runs[0].info.status == "FINISHED", "Mlflow run status should be set as FINISHED!" + # - alerting service + assert "Evaluations" in capsys.readouterr().out, "Alerting service should be called!" diff --git a/tests/jobs/test_explanations.py b/tests/jobs/test_explanations.py new file mode 100644 index 0000000..4285bdc --- /dev/null +++ b/tests/jobs/test_explanations.py @@ -0,0 +1,77 @@ +# %% IMPORTS + +import _pytest.capture as pc +import pytest +from bikes import jobs +from bikes.core import models +from bikes.io import datasets, registries, services + +# %% JOBS + + +@pytest.mark.parametrize("alias_or_version", [1, "Promotion"]) +def test_explanations_job( + alias_or_version: str | int, + mlflow_service: services.MlflowService, + alerts_service: services.AlertsService, + logger_service: services.LoggerService, + inputs_samples_reader: datasets.Reader, + tmp_models_explanations_writer: datasets.Writer, + tmp_samples_explanations_writer: datasets.Writer, + model_alias: registries.Version, + loader: registries.Loader, + capsys: pc.CaptureFixture[str], +) -> None: + # given + if isinstance(alias_or_version, int): + assert alias_or_version == model_alias.version, "Model version should be the same!" + else: + assert alias_or_version == model_alias.aliases[0], "Model alias should be the same!" + # when + job = jobs.ExplanationsJob( + logger_service=logger_service, + alerts_service=alerts_service, + mlflow_service=mlflow_service, + inputs_samples=inputs_samples_reader, + models_explanations=tmp_models_explanations_writer, + samples_explanations=tmp_samples_explanations_writer, + alias_or_version=alias_or_version, + loader=loader, + ) + with job as runner: + out = runner.run() + # then + # - vars + assert set(out) == { + "self", + "logger", + "inputs_samples", + "model_uri", + "model", + "models_explanations", + "samples_explanations", + } + # - inputs + assert out["inputs_samples"].ndim == 2, "Inputs samples should be a dataframe!" + # - model uri + assert str(alias_or_version) in out["model_uri"], "Model URI should contain the model alias!" + assert ( + mlflow_service.registry_name in out["model_uri"] + ), "Model URI should contain the registry name!" + # - model + assert isinstance(out["model"], models.Model), "Model should be an instance of a project Model!" + # - model explanations + assert len(out["models_explanations"].index) >= len( + out["inputs_samples"].columns + ), "Model explanations should have at least as many columns as inputs samples!" + # - samples explanations + assert len(out["samples_explanations"].index) == len( + out["inputs_samples"].index + ), "Samples explanations should have the same number of rows as inputs samples!" + assert len(out["samples_explanations"].columns) >= len( + out["inputs_samples"].columns + ), "Samples explanations should have at least as many columns as inputs samples!" + # - alerting service + assert ( + "Explanations Job Finished" in capsys.readouterr().out + ), "Alerting service should be called!" diff --git a/tests/jobs/test_inference.py b/tests/jobs/test_inference.py index ef721e6..0f8808e 100644 --- a/tests/jobs/test_inference.py +++ b/tests/jobs/test_inference.py @@ -1,30 +1,38 @@ # %% IMPORTS - +import _pytest.capture as pc +import pytest from bikes import jobs from bikes.io import datasets, registries, services # %% JOBS +@pytest.mark.parametrize("alias_or_version", [1, "Promotion"]) def test_inference_job( + alias_or_version: str | int, mlflow_service: services.MlflowService, + alerts_service: services.AlertsService, logger_service: services.LoggerService, inputs_reader: datasets.Reader, tmp_outputs_writer: datasets.Writer, model_alias: registries.Version, loader: registries.Loader, + capsys: pc.CaptureFixture[str], ) -> None: # given - assert len(model_alias.aliases) == 1, "Model should have one alias!" - alias = model_alias.aliases[0] + if isinstance(alias_or_version, int): + assert alias_or_version == model_alias.version, "Model version should be the same!" + else: + assert alias_or_version == model_alias.aliases[0], "Model alias should be the same!" # when job = jobs.InferenceJob( - mlflow_service=mlflow_service, logger_service=logger_service, + alerts_service=alerts_service, + mlflow_service=mlflow_service, inputs=inputs_reader, outputs=tmp_outputs_writer, - alias=alias, + alias_or_version=alias_or_version, loader=loader, ) with job as runner: @@ -43,7 +51,7 @@ def test_inference_job( # - inputs assert out["inputs"].ndim == out["inputs_"].ndim == 2, "Inputs should be a dataframe!" # - model uri - assert alias in out["model_uri"], "Model URI should contain the model alias!" + assert str(alias_or_version) in out["model_uri"], "Model URI should contain the model alias!" assert ( mlflow_service.registry_name in out["model_uri"] ), "Model URI should contain the registry name!" @@ -57,3 +65,5 @@ def test_inference_job( ), "Model should have a pyfunc flavor!" # - outputs assert out["outputs"].ndim == 2, "Outputs should be a dataframe!" + # - alerting service + assert "Inference Job Finished" in capsys.readouterr().out, "Alerting service should be called!" diff --git a/tests/jobs/test_promotion.py b/tests/jobs/test_promotion.py index 9b8322b..0c3b81f 100644 --- a/tests/jobs/test_promotion.py +++ b/tests/jobs/test_promotion.py @@ -1,5 +1,6 @@ # %% IMPORTS +import _pytest.capture as pc import mlflow import pytest from bikes import jobs @@ -25,15 +26,18 @@ def test_promotion_job( version: int | None, mlflow_service: services.MlflowService, + alerts_service: services.AlertsService, logger_service: services.LoggerService, model_version: registries.Version, + capsys: pc.CaptureFixture[str], ) -> None: # given alias = "Testing" # when job = jobs.PromotionJob( - mlflow_service=mlflow_service, logger_service=logger_service, + alerts_service=alerts_service, + mlflow_service=mlflow_service, version=version, alias=alias, ) @@ -64,3 +68,5 @@ def test_promotion_job( assert out["model_version"].aliases == [ alias ], "Model version aliases should contain the given alias!" + # - alerting service + assert "Promotion Job Finished" in capsys.readouterr().out, "Alerting service should be called!" diff --git a/tests/jobs/test_training.py b/tests/jobs/test_training.py index 0c73f46..902c605 100644 --- a/tests/jobs/test_training.py +++ b/tests/jobs/test_training.py @@ -1,7 +1,8 @@ # %% IMPORTS +import _pytest.capture as pc from bikes import jobs -from bikes.core import metrics, models +from bikes.core import metrics, models, schemas from bikes.io import datasets, registries, services from bikes.utils import signers, splitters @@ -10,15 +11,17 @@ def test_training_job( mlflow_service: services.MlflowService, + alerts_service: services.AlertsService, logger_service: services.LoggerService, - inputs_reader: datasets.Reader, - targets_reader: datasets.Reader, + inputs_reader: datasets.ParquetReader, + targets_reader: datasets.ParquetReader, model: models.Model, metric: metrics.Metric, train_test_splitter: splitters.Splitter, saver: registries.Saver, signer: signers.Signer, register: registries.Register, + capsys: pc.CaptureFixture[str], ) -> None: # given run_config = mlflow_service.RunConfig( @@ -28,8 +31,9 @@ def test_training_job( client = mlflow_service.client() # when job = jobs.TrainingJob( - mlflow_service=mlflow_service, logger_service=logger_service, + alerts_service=alerts_service, + mlflow_service=mlflow_service, run_config=run_config, inputs=inputs_reader, targets=targets_reader, @@ -51,8 +55,10 @@ def test_training_job( "run", "inputs", "inputs_", + "inputs_lineage", "targets", "targets_", + "targets_lineage", "train_index", "test_index", "inputs_test", @@ -78,6 +84,18 @@ def test_training_job( # - data assert out["inputs"].ndim == out["inputs_"].ndim == 2, "Inputs should be a dataframe!" assert out["targets"].ndim == out["targets_"].ndim == 2, "Targets should be a dataframe!" + # - lineage + assert out["inputs_lineage"].name == "inputs", "Inputs lineage name should be inputs!" + assert ( + out["inputs_lineage"].source.uri == inputs_reader.path + ), "Inputs lineage source should be the inputs reader path!" + assert out["targets_lineage"].name == "targets", "Targets lineage name should be targets!" + assert ( + out["targets_lineage"].source.uri == targets_reader.path + ), "Targets lineage source should be the targets reader path!" + assert ( + out["targets_lineage"].targets == schemas.TargetsSchema.cnt + ), "Targets lineage target should be cnt!" # - splitter assert len(out["inputs_train"]) + len(out["inputs_test"]) == len( out["inputs"] @@ -138,3 +156,5 @@ def test_training_job( assert ( model_version.run_id == out["run"].info.run_id ), "MLFlow model version run id should be the same!" + # - alerting service + assert "Training Job Finished" in capsys.readouterr().out, "Alerting service should be called!" diff --git a/tests/jobs/test_tuning.py b/tests/jobs/test_tuning.py index cf7e0cf..7263d64 100644 --- a/tests/jobs/test_tuning.py +++ b/tests/jobs/test_tuning.py @@ -1,7 +1,8 @@ # %% IMPORTS +import _pytest.capture as pc from bikes import jobs -from bikes.core import metrics, models +from bikes.core import metrics, models, schemas from bikes.io import datasets, services from bikes.utils import searchers, splitters @@ -10,13 +11,15 @@ def test_tuning_job( mlflow_service: services.MlflowService, + alerts_service: services.AlertsService, logger_service: services.LoggerService, - inputs_reader: datasets.Reader, - targets_reader: datasets.Reader, + inputs_reader: datasets.ParquetReader, + targets_reader: datasets.ParquetReader, model: models.Model, metric: metrics.Metric, time_series_splitter: splitters.Splitter, searcher: searchers.Searcher, + capsys: pc.CaptureFixture[str], ) -> None: # given run_config = mlflow_service.RunConfig( @@ -26,8 +29,9 @@ def test_tuning_job( client = mlflow_service.client() # when job = jobs.TuningJob( - mlflow_service=mlflow_service, logger_service=logger_service, + alerts_service=alerts_service, + mlflow_service=mlflow_service, run_config=run_config, inputs=inputs_reader, targets=targets_reader, @@ -46,8 +50,10 @@ def test_tuning_job( "run", "inputs", "inputs_", + "inputs_lineage", "targets", "targets_", + "targets_lineage", "results", "best_params", "best_score", @@ -62,6 +68,18 @@ def test_tuning_job( # - data assert out["inputs"].ndim == out["inputs_"].ndim == 2, "Inputs should be a dataframe!" assert out["targets"].ndim == out["inputs_"].ndim == 2, "Targets should be a dataframe!" + # - lineage + assert out["inputs_lineage"].name == "inputs", "Inputs lineage name should be inputs!" + assert ( + out["inputs_lineage"].source.uri == inputs_reader.path + ), "Inputs lineage source should be the inputs reader path!" + assert out["targets_lineage"].name == "targets", "Targets lineage name should be targets!" + assert ( + out["targets_lineage"].source.uri == targets_reader.path + ), "Targets lineage source should be the targets reader path!" + assert ( + out["targets_lineage"].targets == schemas.TargetsSchema.cnt + ), "Targets lineage target should be cnt!" # - results assert out["results"].ndim == 2, "Results should be a dataframe!" # - best score @@ -79,3 +97,5 @@ def test_tuning_job( ), "Mlflow experiment name should be the same!" runs = client.search_runs(experiment_ids=experiment.experiment_id) assert len(runs) == len(out["results"]) + 1, "Mlflow should have 1 run per result + parent!" + # - alerting service + assert "Tuning Job Finished" in capsys.readouterr().out, "Alerting service should be called!"