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",
+ " feature | \n",
+ " importance | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 18 | \n",
+ " numericals__casual | \n",
+ " 0.579146 | \n",
+ "
\n",
+ " \n",
+ " 10 | \n",
+ " numericals__hr | \n",
+ " 0.250726 | \n",
+ "
\n",
+ " \n",
+ " 13 | \n",
+ " numericals__workingday | \n",
+ " 0.078542 | \n",
+ "
\n",
+ " \n",
+ " 8 | \n",
+ " numericals__yr | \n",
+ " 0.038600 | \n",
+ "
\n",
+ " \n",
+ " 9 | \n",
+ " numericals__mnth | \n",
+ " 0.012079 | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " categoricals__season_1 | \n",
+ " categoricals__season_2 | \n",
+ " categoricals__season_3 | \n",
+ " categoricals__season_4 | \n",
+ " categoricals__weathersit_1 | \n",
+ " categoricals__weathersit_2 | \n",
+ " categoricals__weathersit_3 | \n",
+ " categoricals__weathersit_4 | \n",
+ " numericals__yr | \n",
+ " numericals__mnth | \n",
+ " numericals__hr | \n",
+ " numericals__holiday | \n",
+ " numericals__weekday | \n",
+ " numericals__workingday | \n",
+ " numericals__temp | \n",
+ " numericals__atemp | \n",
+ " numericals__hum | \n",
+ " numericals__windspeed | \n",
+ " numericals__casual | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 0.169155 | \n",
+ " -0.124650 | \n",
+ " -0.203503 | \n",
+ " -0.758982 | \n",
+ " -1.474484 | \n",
+ " -1.076349 | \n",
+ " 0.801956 | \n",
+ " 0.000513 | \n",
+ " 31.495134 | \n",
+ " 2.905728 | \n",
+ " -74.036369 | \n",
+ " -0.019947 | \n",
+ " -7.118968 | \n",
+ " 18.640795 | \n",
+ " 2.613896 | \n",
+ " 1.898717 | \n",
+ " -1.322058 | \n",
+ " -0.210363 | \n",
+ " 147.338089 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 0.142295 | \n",
+ " -0.242301 | \n",
+ " -0.061819 | \n",
+ " -0.650959 | \n",
+ " -1.001739 | \n",
+ " -0.523719 | \n",
+ " 0.824141 | \n",
+ " 0.000501 | \n",
+ " 32.251492 | \n",
+ " 2.752874 | \n",
+ " -68.468292 | \n",
+ " -0.037579 | \n",
+ " -4.272335 | \n",
+ " 19.723166 | \n",
+ " 1.812452 | \n",
+ " 1.462143 | \n",
+ " 0.369532 | \n",
+ " 0.374412 | \n",
+ " 117.786423 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 0.168699 | \n",
+ " -0.173419 | \n",
+ " -0.054359 | \n",
+ " -0.723623 | \n",
+ " -1.554552 | \n",
+ " -1.033979 | \n",
+ " 0.762942 | \n",
+ " 0.000534 | \n",
+ " 32.245430 | \n",
+ " 3.195950 | \n",
+ " -82.515167 | \n",
+ " 0.009938 | \n",
+ " -2.856529 | \n",
+ " 19.824303 | \n",
+ " 1.498975 | \n",
+ " 2.046780 | \n",
+ " 1.559438 | \n",
+ " 2.603706 | \n",
+ " 127.694664 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 0.253636 | \n",
+ " -0.791483 | \n",
+ " -0.218226 | \n",
+ " -0.612611 | \n",
+ " 0.499581 | \n",
+ " 0.039798 | \n",
+ " 0.778988 | \n",
+ " 0.000518 | \n",
+ " 30.905354 | \n",
+ " 2.808645 | \n",
+ " -70.180222 | \n",
+ " 0.097680 | \n",
+ " -6.699857 | \n",
+ " 19.206472 | \n",
+ " 4.468694 | \n",
+ " 7.614378 | \n",
+ " -0.776883 | \n",
+ " 1.582501 | \n",
+ " 180.403839 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 0.130902 | \n",
+ " -0.788029 | \n",
+ " -0.395371 | \n",
+ " -0.614574 | \n",
+ " -1.558409 | \n",
+ " 0.111731 | \n",
+ " -3.927900 | \n",
+ " 0.000904 | \n",
+ " 47.191067 | \n",
+ " 6.631704 | \n",
+ " -4.315243 | \n",
+ " 0.029141 | \n",
+ " -0.157620 | \n",
+ " 29.401426 | \n",
+ " 4.704289 | \n",
+ " 4.135256 | \n",
+ " -3.774523 | \n",
+ " 0.583940 | \n",
+ " 202.349609 | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " artifact_location | \n",
+ " creation_time | \n",
+ " experiment_id | \n",
+ " last_update_time | \n",
+ " lifecycle_stage | \n",
+ " name | \n",
+ " tags | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " file:///home/fmind/mlops-python-package/mlruns... | \n",
+ " 2024-07-21 15:02:02.224 | \n",
+ " 598443335336095652 | \n",
+ " 2024-07-21 15:02:02.224 | \n",
+ " active | \n",
+ " bikes | \n",
+ " {} | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " artifact_uri | \n",
+ " end_time | \n",
+ " experiment_id | \n",
+ " lifecycle_stage | \n",
+ " run_id | \n",
+ " run_name | \n",
+ " run_uuid | \n",
+ " start_time | \n",
+ " status | \n",
+ " user_id | \n",
+ " metrics | \n",
+ " params | \n",
+ " tags | \n",
+ " mlflow.user | \n",
+ " mlflow.source.name | \n",
+ " mlflow.source.type | \n",
+ " mlflow.project.entryPoint | \n",
+ " mlflow.source.git.commit | \n",
+ " mlflow.source.git.repoURL | \n",
+ " mlflow.gitRepoURL | \n",
+ " mlflow.runName | \n",
+ " mlflow.project.env | \n",
+ " mlflow.project.backend | \n",
+ " mlflow.datasets | \n",
+ " estimator_name | \n",
+ " estimator_class | \n",
+ " mlflow.log-model.history | \n",
+ " mlflow.autologging | \n",
+ " mlflow.parentRunId | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " file:///home/fmind/mlops-python-package/mlruns... | \n",
+ " 2024-07-21 15:04:07.438 | \n",
+ " 598443335336095652 | \n",
+ " active | \n",
+ " 5936b0cb0d9b47b2a1862344a79e55e7 | \n",
+ " Explanations | \n",
+ " 5936b0cb0d9b47b2a1862344a79e55e7 | \n",
+ " 2024-07-21 15:03:28.331 | \n",
+ " FINISHED | \n",
+ " fmind | \n",
+ " {} | \n",
+ " {'conf_file': 'confs/explanations.yaml'} | \n",
+ " {'mlflow.user': 'fmind', 'mlflow.source.name':... | \n",
+ " fmind | \n",
+ " file:///home/fmind/mlops-python-package | \n",
+ " PROJECT | \n",
+ " main | \n",
+ " ee17d0a9de59efd2eb99d667786ac417ec8b3b63 | \n",
+ " git@github.com:fmind/mlops-python-package | \n",
+ " git@github.com:fmind/mlops-python-package | \n",
+ " Explanations | \n",
+ " virtualenv | \n",
+ " local | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " file:///home/fmind/mlops-python-package/mlruns... | \n",
+ " 2024-07-21 15:03:25.782 | \n",
+ " 598443335336095652 | \n",
+ " active | \n",
+ " ef5b224b3f4e4dbcb05169cfc4f358f7 | \n",
+ " Evaluations | \n",
+ " ef5b224b3f4e4dbcb05169cfc4f358f7 | \n",
+ " 2024-07-21 15:03:19.637 | \n",
+ " FINISHED | \n",
+ " fmind | \n",
+ " {'example_count': 13903.0, 'mean_absolute_erro... | \n",
+ " {'conf_file': 'confs/evaluations.yaml'} | \n",
+ " {'mlflow.user': 'fmind', 'mlflow.source.name':... | \n",
+ " fmind | \n",
+ " file:///home/fmind/mlops-python-package | \n",
+ " PROJECT | \n",
+ " main | \n",
+ " ee17d0a9de59efd2eb99d667786ac417ec8b3b63 | \n",
+ " git@github.com:fmind/mlops-python-package | \n",
+ " git@github.com:fmind/mlops-python-package | \n",
+ " Evaluations | \n",
+ " virtualenv | \n",
+ " local | \n",
+ " [{\"name\":\"ce0fe6e33c74e2fa3659d51482be5f27\",\"h... | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " file:///home/fmind/mlops-python-package/mlruns... | \n",
+ " 2024-07-21 15:03:18.035 | \n",
+ " 598443335336095652 | \n",
+ " active | \n",
+ " 65f34c799e814cfe82d844b0eff6a16f | \n",
+ " Inference | \n",
+ " 65f34c799e814cfe82d844b0eff6a16f | \n",
+ " 2024-07-21 15:03:13.853 | \n",
+ " FINISHED | \n",
+ " fmind | \n",
+ " {} | \n",
+ " {'conf_file': 'confs/inference.yaml'} | \n",
+ " {'mlflow.user': 'fmind', 'mlflow.source.name':... | \n",
+ " fmind | \n",
+ " file:///home/fmind/mlops-python-package | \n",
+ " PROJECT | \n",
+ " main | \n",
+ " ee17d0a9de59efd2eb99d667786ac417ec8b3b63 | \n",
+ " git@github.com:fmind/mlops-python-package | \n",
+ " git@github.com:fmind/mlops-python-package | \n",
+ " Inference | \n",
+ " virtualenv | \n",
+ " local | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " file:///home/fmind/mlops-python-package/mlruns... | \n",
+ " 2024-07-21 15:03:12.321 | \n",
+ " 598443335336095652 | \n",
+ " active | \n",
+ " a5dbcb3fc6a24fdc863fb31eb0fc4d7a | \n",
+ " Promotion | \n",
+ " a5dbcb3fc6a24fdc863fb31eb0fc4d7a | \n",
+ " 2024-07-21 15:03:09.011 | \n",
+ " FINISHED | \n",
+ " fmind | \n",
+ " {} | \n",
+ " {'conf_file': 'confs/promotion.yaml'} | \n",
+ " {'mlflow.user': 'fmind', 'mlflow.source.name':... | \n",
+ " fmind | \n",
+ " file:///home/fmind/mlops-python-package | \n",
+ " PROJECT | \n",
+ " main | \n",
+ " ee17d0a9de59efd2eb99d667786ac417ec8b3b63 | \n",
+ " git@github.com:fmind/mlops-python-package | \n",
+ " git@github.com:fmind/mlops-python-package | \n",
+ " Promotion | \n",
+ " virtualenv | \n",
+ " local | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " file:///home/fmind/mlops-python-package/mlruns... | \n",
+ " 2024-07-21 15:03:07.098 | \n",
+ " 598443335336095652 | \n",
+ " active | \n",
+ " 47302e957d8542198a281aad07b2413b | \n",
+ " Training | \n",
+ " 47302e957d8542198a281aad07b2413b | \n",
+ " 2024-07-21 15:02:42.090 | \n",
+ " FINISHED | \n",
+ " fmind | \n",
+ " {'training_mean_squared_error': 124.5105461557... | \n",
+ " {'conf_file': 'confs/training.yaml', 'memory':... | \n",
+ " {'mlflow.user': 'fmind', 'mlflow.source.name':... | \n",
+ " fmind | \n",
+ " file:///home/fmind/mlops-python-package | \n",
+ " PROJECT | \n",
+ " main | \n",
+ " ee17d0a9de59efd2eb99d667786ac417ec8b3b63 | \n",
+ " git@github.com:fmind/mlops-python-package | \n",
+ " git@github.com:fmind/mlops-python-package | \n",
+ " Training | \n",
+ " virtualenv | \n",
+ " local | \n",
+ " NaN | \n",
+ " Pipeline | \n",
+ " sklearn.pipeline.Pipeline | \n",
+ " [{\"run_id\": \"47302e957d8542198a281aad07b2413b\"... | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " aliases | \n",
+ " creation_timestamp | \n",
+ " description | \n",
+ " last_updated_timestamp | \n",
+ " name | \n",
+ " tags | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " {'Champion': '1'} | \n",
+ " 2024-07-21 15:03:06.208 | \n",
+ " | \n",
+ " 2024-07-21 15:03:11.695 | \n",
+ " bikes | \n",
+ " {} | \n",
+ "
\n",
+ " \n",
+ "
\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",
+ " aliases | \n",
+ " creation_timestamp | \n",
+ " current_stage | \n",
+ " description | \n",
+ " last_updated_timestamp | \n",
+ " name | \n",
+ " run_id | \n",
+ " run_link | \n",
+ " source | \n",
+ " status | \n",
+ " status_message | \n",
+ " tags | \n",
+ " user_id | \n",
+ " version | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " Champion | \n",
+ " 2024-07-21 15:03:06.212 | \n",
+ " None | \n",
+ " | \n",
+ " 2024-07-21 15:03:06.212 | \n",
+ " bikes | \n",
+ " 47302e957d8542198a281aad07b2413b | \n",
+ " | \n",
+ " file:///home/fmind/mlops-python-package/mlruns... | \n",
+ " READY | \n",
+ " | \n",
+ " {} | \n",
+ " | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ "
\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!"