validmind 2.4.10__py3-none-any.whl → 2.5.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. validmind/__version__.py +1 -1
  2. validmind/api_client.py +1 -0
  3. validmind/client.py +0 -2
  4. validmind/input_registry.py +8 -0
  5. validmind/tests/__types__.py +4 -0
  6. validmind/tests/data_validation/DatasetDescription.py +1 -0
  7. validmind/tests/model_validation/sklearn/ClassifierPerformance.py +15 -6
  8. validmind/tests/model_validation/sklearn/ClusterPerformance.py +2 -2
  9. validmind/tests/model_validation/sklearn/MinimumROCAUCScore.py +10 -3
  10. validmind/tests/model_validation/sklearn/OverfitDiagnosis.py +349 -291
  11. validmind/tests/model_validation/sklearn/PrecisionRecallCurve.py +1 -1
  12. validmind/tests/model_validation/sklearn/RobustnessDiagnosis.py +36 -37
  13. validmind/tests/ongoing_monitoring/FeatureDrift.py +182 -0
  14. validmind/tests/ongoing_monitoring/PredictionAcrossEachFeature.py +76 -0
  15. validmind/tests/ongoing_monitoring/PredictionCorrelation.py +91 -0
  16. validmind/tests/ongoing_monitoring/TargetPredictionDistributionPlot.py +57 -0
  17. validmind/tests/run.py +35 -19
  18. validmind/unit_metrics/__init__.py +1 -1
  19. validmind/unit_metrics/classification/sklearn/ROC_AUC.py +22 -1
  20. validmind/utils.py +1 -1
  21. validmind/vm_models/__init__.py +2 -0
  22. validmind/vm_models/dataset/dataset.py +55 -14
  23. validmind/vm_models/input.py +31 -0
  24. validmind/vm_models/model.py +4 -2
  25. validmind/vm_models/test_context.py +9 -2
  26. {validmind-2.4.10.dist-info → validmind-2.5.1.dist-info}/METADATA +1 -1
  27. {validmind-2.4.10.dist-info → validmind-2.5.1.dist-info}/RECORD +30 -25
  28. {validmind-2.4.10.dist-info → validmind-2.5.1.dist-info}/LICENSE +0 -0
  29. {validmind-2.4.10.dist-info → validmind-2.5.1.dist-info}/WHEEL +0 -0
  30. {validmind-2.4.10.dist-info → validmind-2.5.1.dist-info}/entry_points.txt +0 -0
validmind/tests/run.py CHANGED
@@ -83,32 +83,47 @@ def _combine_summaries(summaries: List[Dict[str, Any]]):
83
83
  )
84
84
 
85
85
 
86
- def _update_plotly_titles(figures, input_groups, title_template):
87
- current_title = figures[0].figure.layout.title.text
86
+ def _get_input_id(v):
87
+ if isinstance(v, str):
88
+ return v # If v is a string, return it as is.
89
+ elif isinstance(v, list) and all(hasattr(item, "input_id") for item in v):
90
+ # If v is a list and all items have an input_id attribute, join their input_id values.
91
+ return ", ".join(item.input_id for item in v)
92
+ elif hasattr(v, "input_id"):
93
+ return v.input_id # If v has an input_id attribute, return it.
94
+ return str(v) # Otherwise, return the string representation of v.
95
+
96
+
97
+ def _update_plotly_titles(figures, input_group, title_template):
98
+ for figure in figures:
99
+
100
+ current_title = figure.figure.layout.title.text
101
+
102
+ input_description = " and ".join(
103
+ f"{key}: {_get_input_id(value)}" for key, value in input_group.items()
104
+ )
88
105
 
89
- for i, figure in enumerate(figures):
90
106
  figure.figure.layout.title.text = title_template.format(
91
107
  current_title=f"{current_title} " if current_title else "",
92
- input_description=" and ".join(
93
- f"{k}: {v if isinstance(v, str) else ', '.join(item.input_id for item in v) if isinstance(v, list) and all(hasattr(item, 'input_id') for item in v) else v.input_id}"
94
- for k, v in input_groups[i].items()
95
- ),
108
+ input_description=input_description,
96
109
  )
97
110
 
98
111
 
99
- def _update_matplotlib_titles(figures, input_groups, title_template):
100
- current_title = (
101
- figures[0].figure._suptitle.get_text() if figures[0].figure._suptitle else ""
102
- )
112
+ def _update_matplotlib_titles(figures, input_group, title_template):
113
+ for figure in figures:
114
+
115
+ current_title = (
116
+ figure.figure._suptitle.get_text() if figure.figure._suptitle else ""
117
+ )
118
+
119
+ input_description = " and ".join(
120
+ f"{key}: {_get_input_id(value)}" for key, value in input_group.items()
121
+ )
103
122
 
104
- for i, figure in enumerate(figures):
105
123
  figure.figure.suptitle(
106
124
  title_template.format(
107
125
  current_title=f"{current_title} " if current_title else "",
108
- input_description=" and ".join(
109
- f"{k}: {v if isinstance(v, str) else ', '.join(item.input_id for item in v) if isinstance(v, list) and all(hasattr(item, 'input_id') for item in v) else v.input_id}"
110
- for k, v in input_groups[i].items()
111
- ),
126
+ input_description=input_description,
112
127
  )
113
128
  )
114
129
 
@@ -120,11 +135,12 @@ def _combine_figures(figure_lists: List[List[Any]], input_groups: List[Dict[str,
120
135
 
121
136
  title_template = "{current_title}({input_description})"
122
137
 
123
- for figures in list(zip(*figure_lists)):
138
+ for idx, figures in enumerate(figure_lists):
139
+ input_group = input_groups[idx]
124
140
  if is_plotly_figure(figures[0].figure):
125
- _update_plotly_titles(figures, input_groups, title_template)
141
+ _update_plotly_titles(figures, input_group, title_template)
126
142
  elif is_matplotlib_figure(figures[0].figure):
127
- _update_matplotlib_titles(figures, input_groups, title_template)
143
+ _update_matplotlib_titles(figures, input_group, title_template)
128
144
  else:
129
145
  logger.warning("Cannot properly annotate png figures")
130
146
 
@@ -80,7 +80,7 @@ def _serialize_dataset(dataset, model):
80
80
  and pre-computed prediction columns, addressing potential hash collisions.
81
81
  """
82
82
  return _fast_hash(
83
- dataset.df[
83
+ dataset._df[
84
84
  [
85
85
  *dataset.feature_columns,
86
86
  dataset.target_column,
@@ -2,7 +2,9 @@
2
2
  # See the LICENSE file in the root of this repository for details.
3
3
  # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial
4
4
 
5
+ from numpy import unique
5
6
  from sklearn.metrics import roc_auc_score
7
+ from sklearn.preprocessing import LabelBinarizer
6
8
 
7
9
  from validmind import tags, tasks
8
10
 
@@ -10,4 +12,23 @@ from validmind import tags, tasks
10
12
  @tags("classification", "sklearn", "unit_metric")
11
13
  @tasks("classification")
12
14
  def ROC_AUC(model, dataset, **kwargs):
13
- return roc_auc_score(dataset.y, dataset.y_pred(model), **kwargs)
15
+
16
+ y_true = dataset.y
17
+
18
+ if len(unique(y_true)) > 2:
19
+ y_pred = dataset.y_pred(model)
20
+ y_true = y_true.astype(y_pred.dtype)
21
+ roc_auc = _multiclass_roc_auc_score(y_true, y_pred, **kwargs)
22
+ else:
23
+ y_prob = dataset.y_prob(model)
24
+ y_true = y_true.astype(y_prob.dtype).flatten()
25
+ roc_auc = roc_auc_score(y_true, y_prob, **kwargs)
26
+
27
+ return roc_auc
28
+
29
+
30
+ def _multiclass_roc_auc_score(y_test, y_pred, average="macro"):
31
+ lb = LabelBinarizer()
32
+ lb.fit(y_test)
33
+
34
+ return roc_auc_score(lb.transform(y_test), lb.transform(y_pred), average=average)
validmind/utils.py CHANGED
@@ -364,7 +364,7 @@ def get_model_info(model):
364
364
  if language is None:
365
365
  language = f"Python {python_version()}"
366
366
 
367
- if framework_version is None:
367
+ if framework_version == "N/A" or framework_version is None:
368
368
  try:
369
369
  framework_version = sys.modules[framework].__version__
370
370
  except (KeyError, AttributeError):
@@ -8,6 +8,7 @@ Models entrypoint
8
8
 
9
9
  from .dataset.dataset import VMDataset
10
10
  from .figure import Figure
11
+ from .input import VMInput
11
12
  from .model import R_MODEL_TYPES, ModelAttributes, VMModel
12
13
  from .test.metric import Metric
13
14
  from .test.metric_result import MetricResult
@@ -20,6 +21,7 @@ from .test_suite.runner import TestSuiteRunner
20
21
  from .test_suite.test_suite import TestSuite
21
22
 
22
23
  __all__ = [
24
+ "VMInput",
23
25
  "VMDataset",
24
26
  "VMModel",
25
27
  "Figure",
@@ -7,6 +7,7 @@ Dataset class wrapper
7
7
  """
8
8
 
9
9
  import warnings
10
+ from copy import deepcopy
10
11
 
11
12
  import numpy as np
12
13
  import pandas as pd
@@ -14,6 +15,7 @@ import polars as pl
14
15
 
15
16
  from validmind.logging import get_logger
16
17
  from validmind.models import FunctionModel, PipelineModel
18
+ from validmind.vm_models.input import VMInput
17
19
  from validmind.vm_models.model import VMModel
18
20
 
19
21
  from .utils import ExtraColumns, as_df, compute_predictions, convert_index_to_datetime
@@ -21,7 +23,7 @@ from .utils import ExtraColumns, as_df, compute_predictions, convert_index_to_da
21
23
  logger = get_logger(__name__)
22
24
 
23
25
 
24
- class VMDataset:
26
+ class VMDataset(VMInput):
25
27
  """Base class for VM datasets
26
28
 
27
29
  Child classes should be used to support new dataset types (tensor, polars etc)
@@ -60,7 +62,6 @@ class VMDataset:
60
62
  text_column: str = None,
61
63
  extra_columns: dict = None,
62
64
  target_class_labels: dict = None,
63
- options: dict = None,
64
65
  ):
65
66
  """
66
67
  Initializes a VMDataset instance.
@@ -77,7 +78,6 @@ class VMDataset:
77
78
  feature_columns (str, optional): The feature column names of the dataset. Defaults to None.
78
79
  text_column (str, optional): The text column name of the dataset for nlp tasks. Defaults to None.
79
80
  target_class_labels (Dict, optional): The class labels for the target columns. Defaults to None.
80
- options (Dict, optional): Additional options for the dataset. Defaults to None.
81
81
  """
82
82
  # initialize input_id
83
83
  self.input_id = input_id
@@ -101,8 +101,6 @@ class VMDataset:
101
101
  if date_time_index:
102
102
  self._df = convert_index_to_datetime(self._df)
103
103
 
104
- self.options = options
105
-
106
104
  self.columns = columns or []
107
105
  self.column_aliases = {}
108
106
  self.target_column = target_column
@@ -199,6 +197,56 @@ class VMDataset:
199
197
  "Cannot use precomputed probabilities without precomputed predictions"
200
198
  )
201
199
 
200
+ def with_options(self, **kwargs) -> "VMDataset":
201
+ """Support options provided when passing an input to run_test or run_test_suite
202
+
203
+ Example:
204
+ ```python
205
+ # to only use a certain subset of columns in the dataset:
206
+ run_test(
207
+ "validmind.SomeTestID",
208
+ inputs={
209
+ "dataset": {
210
+ "input_id": "my_dataset_id",
211
+ "columns": ["col1", "col2"],
212
+ }
213
+ }
214
+ )
215
+
216
+ # behind the scenes, this retrieves the dataset object (VMDataset) from the registry
217
+ # and then calls the `with_options()` method and passes `{"columns": ...}`
218
+ ```
219
+
220
+ Args:
221
+ **kwargs: Options:
222
+ - columns: Filter columns in the dataset
223
+
224
+ Returns:
225
+ VMDataset: A new instance of the dataset with only the specified columns
226
+ """
227
+ if "columns" in kwargs:
228
+ # filter columns (create a temp copy of self with only specified columns)
229
+ # TODO: need a more robust mechanism for this as we expand on this feature
230
+ columns = kwargs.pop("columns")
231
+
232
+ new = deepcopy(self)
233
+
234
+ new._set_feature_columns(
235
+ [col for col in new.feature_columns if col in columns]
236
+ )
237
+ new.text_column = new.text_column if new.text_column in columns else None
238
+ new.target_column = (
239
+ new.target_column if new.target_column in columns else None
240
+ )
241
+ new.extra_columns.extras = new.extra_columns.extras.intersection(columns)
242
+
243
+ return new
244
+
245
+ if kwargs:
246
+ raise NotImplementedError(
247
+ f"Options {kwargs} are not supported for this input"
248
+ )
249
+
202
250
  def assign_predictions(
203
251
  self,
204
252
  model: VMModel,
@@ -345,7 +393,8 @@ class VMDataset:
345
393
  assert self.target_column not in columns
346
394
  columns.append(self.target_column)
347
395
 
348
- return as_df(self._df[columns])
396
+ # return a copy to prevent accidental modification
397
+ return as_df(self._df[columns]).copy()
349
398
 
350
399
  @property
351
400
  def x(self) -> np.ndarray:
@@ -444,7 +493,6 @@ class DataFrameDataset(VMDataset):
444
493
  feature_columns: list = None,
445
494
  text_column: str = None,
446
495
  target_class_labels: dict = None,
447
- options: dict = None,
448
496
  date_time_index: bool = False,
449
497
  ):
450
498
  """
@@ -459,7 +507,6 @@ class DataFrameDataset(VMDataset):
459
507
  feature_columns (list, optional): The feature columns of the dataset. Defaults to None.
460
508
  text_column (str, optional): The text column name of the dataset for NLP tasks. Defaults to None.
461
509
  target_class_labels (dict, optional): The class labels for the target columns. Defaults to None.
462
- options (dict, optional): Additional options for the dataset. Defaults to None.
463
510
  date_time_index (bool, optional): Whether to use date-time index. Defaults to False.
464
511
  """
465
512
  index = None
@@ -478,7 +525,6 @@ class DataFrameDataset(VMDataset):
478
525
  feature_columns=feature_columns,
479
526
  text_column=text_column,
480
527
  target_class_labels=target_class_labels,
481
- options=options,
482
528
  date_time_index=date_time_index,
483
529
  )
484
530
 
@@ -498,7 +544,6 @@ class PolarsDataset(VMDataset):
498
544
  feature_columns: list = None,
499
545
  text_column: str = None,
500
546
  target_class_labels: dict = None,
501
- options: dict = None,
502
547
  date_time_index: bool = False,
503
548
  ):
504
549
  """
@@ -513,7 +558,6 @@ class PolarsDataset(VMDataset):
513
558
  feature_columns (list, optional): The feature columns of the dataset. Defaults to None.
514
559
  text_column (str, optional): The text column name of the dataset for NLP tasks. Defaults to None.
515
560
  target_class_labels (dict, optional): The class labels for the target columns. Defaults to None.
516
- options (dict, optional): Additional options for the dataset. Defaults to None.
517
561
  date_time_index (bool, optional): Whether to use date-time index. Defaults to False.
518
562
  """
519
563
  super().__init__(
@@ -528,7 +572,6 @@ class PolarsDataset(VMDataset):
528
572
  feature_columns=feature_columns,
529
573
  text_column=text_column,
530
574
  target_class_labels=target_class_labels,
531
- options=options,
532
575
  date_time_index=date_time_index,
533
576
  )
534
577
 
@@ -551,7 +594,6 @@ class TorchDataset(VMDataset):
551
594
  feature_columns: list = None,
552
595
  text_column: str = None,
553
596
  target_class_labels: dict = None,
554
- options: dict = None,
555
597
  ):
556
598
  """
557
599
  Initializes a TorchDataset instance.
@@ -609,5 +651,4 @@ class TorchDataset(VMDataset):
609
651
  text_column=text_column,
610
652
  extra_columns=extra_columns,
611
653
  target_class_labels=target_class_labels,
612
- options=options,
613
654
  )
@@ -0,0 +1,31 @@
1
+ # Copyright © 2023-2024 ValidMind Inc. All rights reserved.
2
+ # See the LICENSE file in the root of this repository for details.
3
+ # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial
4
+
5
+ """Base class for ValidMind Input types"""
6
+
7
+ from abc import ABC
8
+
9
+
10
+ class VMInput(ABC):
11
+ """
12
+ Base class for ValidMind Input types
13
+ """
14
+
15
+ def with_options(self, **kwargs) -> "VMInput":
16
+ """
17
+ Allows for setting options on the input object that are passed by the user
18
+ when using the input to run a test or set of tests
19
+
20
+ To allow options, just override this method in the subclass (see VMDataset)
21
+ and ensure that it returns a new instance of the input with the specified options
22
+ set.
23
+
24
+ Args:
25
+ **kwargs: Arbitrary keyword arguments that will be passed to the input object
26
+
27
+ Returns:
28
+ VMInput: A new instance of the input with the specified options set
29
+ """
30
+ if kwargs:
31
+ raise NotImplementedError("This type of input does not support options")
@@ -7,11 +7,13 @@ Model class wrapper module
7
7
  """
8
8
  import importlib
9
9
  import inspect
10
- from abc import ABC, abstractmethod
10
+ from abc import abstractmethod
11
11
  from dataclasses import dataclass
12
12
 
13
13
  from validmind.errors import MissingOrInvalidModelPredictFnError
14
14
 
15
+ from .input import VMInput
16
+
15
17
  SUPPORTED_LIBRARIES = {
16
18
  "catboost": "CatBoostModel",
17
19
  "xgboost": "XGBoostModel",
@@ -77,7 +79,7 @@ class ModelAttributes:
77
79
  )
78
80
 
79
81
 
80
- class VMModel(ABC):
82
+ class VMModel(VMInput):
81
83
  """
82
84
  An base class that wraps a trained model instance and its associated data.
83
85
 
@@ -78,13 +78,12 @@ class TestInput:
78
78
  ... (any): Any other arbitrary inputs that can be used by tests
79
79
  """
80
80
 
81
- # TODO: we need to look into adding metadata for test inputs and logging that
82
-
83
81
  def __init__(self, inputs):
84
82
  """Initialize with either a dictionary of inputs"""
85
83
  for key, value in inputs.items():
86
84
  # 1) retrieve input object from input registry if an input_id string is provided
87
85
  # 2) check the input_id type if a list of inputs (mix of strings and objects) is provided
86
+ # 3) if its a dict, it should contain the `input_id` key as well as other options
88
87
  if isinstance(value, str):
89
88
  value = input_registry.get(key=value)
90
89
  elif isinstance(value, list) or isinstance(value, tuple):
@@ -92,6 +91,14 @@ class TestInput:
92
91
  input_registry.get(key=v) if isinstance(v, str) else v
93
92
  for v in value
94
93
  ]
94
+ elif isinstance(value, dict):
95
+ assert "input_id" in value, (
96
+ "Input dictionary must contain an 'input_id' key "
97
+ "to retrieve the input object from the input registry."
98
+ )
99
+ value = input_registry.get(key=value.get("input_id")).with_options(
100
+ **{k: v for k, v in value.items() if k != "input_id"}
101
+ )
95
102
 
96
103
  setattr(self, key, value)
97
104
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: validmind
3
- Version: 2.4.10
3
+ Version: 2.5.1
4
4
  Summary: ValidMind Developer Framework
5
5
  License: Commercial License
6
6
  Author: Andres Rodriguez
@@ -1,9 +1,9 @@
1
1
  validmind/__init__.py,sha256=UfmzPwUCdUWbWq3zPqqmq4jw0_kfl3hX4U72p_seE4I,3700
2
- validmind/__version__.py,sha256=-L0YxUW89c8_x6KJGhJJOdXUiUyRPN9gxIU10MMTSrM,23
2
+ validmind/__version__.py,sha256=PfQ9ThOuZlUZhThya-_PpR02LjazRR6LNSivpta03mM,22
3
3
  validmind/ai/test_descriptions.py,sha256=Q1Ftus4x5eiVLKWJu7hqPLukBQZzhy-dARqq_6_JWtk,9464
4
4
  validmind/ai/utils.py,sha256=TEXII_S5CpkpczzSyHwTlqLcPMLnPBJWEBR6QFMKh1U,3421
5
- validmind/api_client.py,sha256=3MNperKya6yMzFfuAP4aaDZm6i47iMUEVS_cSFGftFI,17433
6
- validmind/client.py,sha256=n95XmOkQn1D3j_29VJzGp3r8z7gPVFI2OVPjBoh3iOY,18743
5
+ validmind/api_client.py,sha256=JZIJWuYtvl-VEVi_AK4c839Fn7cGa40J2d4_4FUZcno,17483
6
+ validmind/client.py,sha256=guXu_9um4caPpepbAsfKgjLc63Ygx07Lgp8wZJD3p6Y,18653
7
7
  validmind/client_config.py,sha256=58L6s6-9vFWC9vkSs_98CjV1YWmlksdhblJtPQxQsAk,1611
8
8
  validmind/datasets/__init__.py,sha256=oYfcvW7BAyUgpghBOnTeGbQF6tpFAWg38rRirdLr8m8,262
9
9
  validmind/datasets/classification/__init__.py,sha256=HlTOBLyb6IorRYmAhP3AIyX-l-NyemyDjV8BBOdrCrY,1787
@@ -60,7 +60,7 @@ validmind/datasets/regression/models/fred_loan_rates_model_5.pkl,sha256=FkNLHq9x
60
60
  validmind/errors.py,sha256=qy7Gp6Uom5J6WmLw-CpE5zaTN96SiN7kJjDGBaJdoxY,8023
61
61
  validmind/html_templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
62
  validmind/html_templates/content_blocks.py,sha256=LTsv2Hr_drUUZVLEfY2JcT4z0M-45RGYy2sFInt1VKY,3998
63
- validmind/input_registry.py,sha256=zexO3x-vncaoWvQ6VfkvgDLn6x72e2BNel_jCbrVHSE,793
63
+ validmind/input_registry.py,sha256=8C_mrhgLT72hwbt_lo3ZwXb5NCyIcSuCQI1HdJ3bK2A,1042
64
64
  validmind/logging.py,sha256=J1Y1dYCH1dtkoYCHoXMOQH_B7EO4fJytWRDrDqZZz8U,5204
65
65
  validmind/models/__init__.py,sha256=lraTbNwoKckXNP3Dbyj-euI78UTkZ_w5wpUOb8l5nWs,729
66
66
  validmind/models/foundation.py,sha256=ZdVmwwRVbjgqMyfjguyf9Lka_KcgJnDD7ho8zv0gQok,1842
@@ -86,7 +86,7 @@ validmind/test_suites/tabular_datasets.py,sha256=WE4eLzRCfiqAxRqXnZFRR3Lo_u-TI6K
86
86
  validmind/test_suites/text_data.py,sha256=YGVGBB05356jN9Gzcy5CHShRzo1fm5mKsZY7YBq0cYU,739
87
87
  validmind/test_suites/time_series.py,sha256=msUyYySAe5VHJJp6z0k0cNt2ekMB8-XkxGER75Zs1hs,6724
88
88
  validmind/tests/__init__.py,sha256=niYvgTHmjS5E42mJMCrzq1vP8PTKCWxVsqSkAaw2wsE,1036
89
- validmind/tests/__types__.py,sha256=AmSEzm1rwtkTQnbAFlgjrcyyg1xMThglC6r7W4jdMaM,9902
89
+ validmind/tests/__types__.py,sha256=AaPsQrxikIasGshJN5AmKCTzLaZ9d4QBDT1c0Br2sDE,10142
90
90
  validmind/tests/_store.py,sha256=G604L9g-XIJz8u7BLbHVVVcbx96tDYjAAciaF7wJoiM,2743
91
91
  validmind/tests/data_validation/ACFandPACFPlot.py,sha256=NLoLe-9Z6_41RBee-gRYe4u3kaGojF7ujlyyIk4o3BU,4900
92
92
  validmind/tests/data_validation/ADF.py,sha256=36ZdB8L-hgN0EnYlcxeSsQ3luWip8Qfz_nrYV-1lr74,5113
@@ -101,7 +101,7 @@ validmind/tests/data_validation/BivariateScatterPlots.py,sha256=9QcMcbc3yiZl8LbV
101
101
  validmind/tests/data_validation/ChiSquaredFeaturesTable.py,sha256=5lPRnNbHjxEdMGtp6fhg4cYy7FLSHbHxUtpymU8GRO0,5977
102
102
  validmind/tests/data_validation/ClassImbalance.py,sha256=nRNHDtjCAgLQfWbCWP-zX5CFZSjJno8NWLXZBPaG_yA,6882
103
103
  validmind/tests/data_validation/DFGLSArch.py,sha256=D6_kR4AkvctjK-MRUJCc9cELwdmTT_085QIGagliSsA,5365
104
- validmind/tests/data_validation/DatasetDescription.py,sha256=ftB6RrEc4Sfc2qGtOmX7Ogf8yJxGV9QJY29OzjdQCyE,11365
104
+ validmind/tests/data_validation/DatasetDescription.py,sha256=-V8pO260iRs1QzJfJFAP_YwayBQcCwYD_X51NZoLBXA,11366
105
105
  validmind/tests/data_validation/DatasetSplit.py,sha256=4BCeshqxvNSwmRwXw37uIJ3xy8JnU7ZJIWPyzzTdLJ0,5068
106
106
  validmind/tests/data_validation/DescriptiveStatistics.py,sha256=5u1qx-VGD8aVBFEi_4ffCWZfJ17YXbT5PO1Na52KoNo,6333
107
107
  validmind/tests/data_validation/Duplicates.py,sha256=oO1LPMyclfJno1_AAITpKB-fZryU-705BvYCm5StClw,5592
@@ -202,9 +202,9 @@ validmind/tests/model_validation/ragas/Faithfulness.py,sha256=89EeM0lrUq5MAhKYhO
202
202
  validmind/tests/model_validation/ragas/utils.py,sha256=zh9_pGitutGBS4Tvk3Bw1D-QVnDueggNErAhAvMPUOA,3130
203
203
  validmind/tests/model_validation/sklearn/AdjustedMutualInformation.py,sha256=KhQroHKDG4gpRAoD9Clw65qNslwGS93rTETdZTOqoTk,2840
204
204
  validmind/tests/model_validation/sklearn/AdjustedRandIndex.py,sha256=nSs1BGC8MSWWp7T6M0FZR5kNPraiZwRJF7U6LNCoMMM,2715
205
- validmind/tests/model_validation/sklearn/ClassifierPerformance.py,sha256=4ebx4erElJM32QOZD79ycL6jSNyz7a7yS5Oy86LlG3s,5885
205
+ validmind/tests/model_validation/sklearn/ClassifierPerformance.py,sha256=dgfi8vD4WQraMLpBHXa7DVMFCNmHDfJk1tstsxWyXfQ,6217
206
206
  validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.py,sha256=9B8WqGcOL29CVd1ZI6vw0rpUTCW2Jk_lFKzSnHYq9qs,5433
207
- validmind/tests/model_validation/sklearn/ClusterPerformance.py,sha256=ViZ_aDh3rrL0UZlXF3xxAdE-rwiTRT6cwYrizNCRXeY,5308
207
+ validmind/tests/model_validation/sklearn/ClusterPerformance.py,sha256=uuso3wUL_urNJnIuEiGnldMltv8YkCb3lSzWVaxdoVc,5310
208
208
  validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.py,sha256=lPQb8B5LWBlNgdSmS8CD8WZTwu-Iye3TIkU0A7uVlWk,8525
209
209
  validmind/tests/model_validation/sklearn/CompletenessScore.py,sha256=3cE4Wvwx_tpCADvr_nDm04CQkgtvvgq3EUwdBPI4YR8,2507
210
210
  validmind/tests/model_validation/sklearn/ConfusionMatrix.py,sha256=wdEr8KopFOgbYGHKzCgP1jN0zkZ_AVLclxLneGrRyjA,6065
@@ -215,19 +215,19 @@ validmind/tests/model_validation/sklearn/HyperParametersTuning.py,sha256=5a4K15U
215
215
  validmind/tests/model_validation/sklearn/KMeansClustersOptimization.py,sha256=lmSktn7usYZt-2v8Ykrig-9vEM910AfUdRkyOrsZd3U,5906
216
216
  validmind/tests/model_validation/sklearn/MinimumAccuracy.py,sha256=5KSAd29dbKs3nNJ734t1j806Td3H5LRIw950g3Xp2nc,5277
217
217
  validmind/tests/model_validation/sklearn/MinimumF1Score.py,sha256=TaLHk98CwQigyt17L1uBBLC25D5J_IKb6a_IFJFO7AE,4618
218
- validmind/tests/model_validation/sklearn/MinimumROCAUCScore.py,sha256=dyKSlT0GlXy9t4qymlZwCOnD-76WwCue9hARGlublKg,4831
218
+ validmind/tests/model_validation/sklearn/MinimumROCAUCScore.py,sha256=Z5JZ4edtzuyneI8qSmGv-OKL2PVq5dg44CwSmePz3OU,5102
219
219
  validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.py,sha256=-fGgddsc_0832zTl_gRRsLx2sZWBPB0FdS5YmbluN8s,6132
220
- validmind/tests/model_validation/sklearn/OverfitDiagnosis.py,sha256=RQwnqUvc74M-1W1oVV3RwMUuO6Lm-CAG4hIqCRB9ofk,14015
220
+ validmind/tests/model_validation/sklearn/OverfitDiagnosis.py,sha256=1nei-MIF7utxuPJXnhTKIaLugUsxk1s4cFob1CR08Yg,13444
221
221
  validmind/tests/model_validation/sklearn/PermutationFeatureImportance.py,sha256=CqMuBuNWzzTtzVcmhAlJHPmtyDO5YuaoXk5hhIXmRuY,4926
222
222
  validmind/tests/model_validation/sklearn/PopulationStabilityIndex.py,sha256=chYVS4OcvSG3YA91N7VDJ4Lh7EDgNEcUM8_k72s13IM,10072
223
- validmind/tests/model_validation/sklearn/PrecisionRecallCurve.py,sha256=ifR1jBIVqwPCrzvL075Pw2Pf79LHGhYPZO-4Y9L_HlA,4372
223
+ validmind/tests/model_validation/sklearn/PrecisionRecallCurve.py,sha256=V0SS06u8DsyaJpL0S14HBPAQwJJYXnvP3fNp2P4CT84,4363
224
224
  validmind/tests/model_validation/sklearn/ROCCurve.py,sha256=f_NQtE2n5LLmAMWnA2io5kaIGI6MEn539GilBd5tjIo,5827
225
225
  validmind/tests/model_validation/sklearn/RegressionErrors.py,sha256=iV9FjYEIzJS0I59imvRe7JC9KcBhm08bjeRSiCnE09Y,5924
226
226
  validmind/tests/model_validation/sklearn/RegressionErrorsComparison.py,sha256=CHfdcRx6ZqvfkfZVy7HNgOUjZp-KepPS5rs2al19OyQ,3160
227
227
  validmind/tests/model_validation/sklearn/RegressionModelsPerformanceComparison.py,sha256=ELYhY_My1YqS4_i2fnHgL5Dg7vKUIa0wska0bkAFkuU,5737
228
228
  validmind/tests/model_validation/sklearn/RegressionR2Square.py,sha256=Ojm5sz3re4rk17u7xiezn1P_rp7wcA3etKgzdhGYH-s,4906
229
229
  validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.py,sha256=tGJKpfeTvU2xBxsYbQSC5GPDcCS2_j0FcT3uceXZduI,2761
230
- validmind/tests/model_validation/sklearn/RobustnessDiagnosis.py,sha256=tQWhN1NAujTe2ou1H88k6PdtR-tZVV-XvMWJhj3zfCU,13659
230
+ validmind/tests/model_validation/sklearn/RobustnessDiagnosis.py,sha256=ntzu5W4JF6pM8YXwtWVnQHx8zGaZMYSTlQlD38XpCUo,13366
231
231
  validmind/tests/model_validation/sklearn/SHAPGlobalImportance.py,sha256=ECYjHHIz5kfnLi2XlzWOKquRf23_77kdcPK8Xw2qwQk,8887
232
232
  validmind/tests/model_validation/sklearn/SilhouettePlot.py,sha256=6PZ_sqiPBpL4_fyRE_sg0bSWWrDkryh_v-88KK4i3RQ,6185
233
233
  validmind/tests/model_validation/sklearn/TrainingTestDegradation.py,sha256=K3F8Ev7nIaIjwLHC9ljnMp07YwZeqo4RLui5C6IDuR8,7209
@@ -257,6 +257,10 @@ validmind/tests/model_validation/statsmodels/ScorecardHistogram.py,sha256=tjImbx
257
257
  validmind/tests/model_validation/statsmodels/ShapiroWilk.py,sha256=DfJXa0kb_ak2awlH6uorkOYcQPk56vI6QqwqEopKN18,3248
258
258
  validmind/tests/model_validation/statsmodels/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
259
259
  validmind/tests/model_validation/statsmodels/statsutils.py,sha256=s1J7lHJ4kAcp_gGI0LAsaIFxbSqPrqXanxgtDI_Kig0,495
260
+ validmind/tests/ongoing_monitoring/FeatureDrift.py,sha256=-83GOCa1sBMFd0tpL62mgVup832CH-cJBaLYNXY9VLw,6143
261
+ validmind/tests/ongoing_monitoring/PredictionAcrossEachFeature.py,sha256=oyiIGjVpvlcwRCDr4ohjj2jHZEqL8sigOhnsCcK3AWc,3336
262
+ validmind/tests/ongoing_monitoring/PredictionCorrelation.py,sha256=ve-7P3dXWNE_Vp3Z20q03XetRVFpUMBNMyq3VVMXqSY,3347
263
+ validmind/tests/ongoing_monitoring/TargetPredictionDistributionPlot.py,sha256=A4NfE9WgfSJVtljX3RPh3jkwcQBbQ9-LvFNhArqB31I,2384
260
264
  validmind/tests/prompt_validation/Bias.py,sha256=NFNkym5arkYJ_7XndMvX_UDPLF3JhRnDCX9L_6OKcm8,7012
261
265
  validmind/tests/prompt_validation/Clarity.py,sha256=4pVWyvmAoZlL8Kq-4m3I7866YQkITndJGW9nFGLxRS8,6208
262
266
  validmind/tests/prompt_validation/Conciseness.py,sha256=6BmAggzrWP1UqRMcpbFUgvdnbxpRuL6Ro-Q8Y9xn1JA,5956
@@ -266,14 +270,14 @@ validmind/tests/prompt_validation/Robustness.py,sha256=fBdkYnO9yoBazz4wD-l62tT8D
266
270
  validmind/tests/prompt_validation/Specificity.py,sha256=h3gKRTTi2rfnGWmGC1YnSt2s_VbZU4KX0iY7LciZ3PU,6068
267
271
  validmind/tests/prompt_validation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
268
272
  validmind/tests/prompt_validation/ai_powered_test.py,sha256=7TTeIR5GotQosm7oVT8Y3KnwPB3XkVT1Fzhckpr-SgE,1963
269
- validmind/tests/run.py,sha256=24E5pRg6p0dUHoK6shB9KeKHWTOEJa5HymT6tD8Ozl4,15574
273
+ validmind/tests/run.py,sha256=WuLV8iY2xN7bRPu5px75-rgRKeh_XYPtbdLhqG8Dugo,15874
270
274
  validmind/tests/test_providers.py,sha256=47xe5eb5ufvj1jmhdRsbSvDQTXSDpFDFNeXg3xtXwhw,5320
271
275
  validmind/tests/utils.py,sha256=kNrxfUYbj4DwmkZtpp_1rG4GMUGxYEhvqnYR_A7qAKM,471
272
- validmind/unit_metrics/__init__.py,sha256=AlFnWA9pmzVf8xysPxYpQ3kBTQ81-YVxRTJpgC0Q41w,7344
276
+ validmind/unit_metrics/__init__.py,sha256=mFk52eU7bOQKTpruKSrPyzjmxFUpIi5RZuwIE5BVFHU,7345
273
277
  validmind/unit_metrics/classification/sklearn/Accuracy.py,sha256=2Ra_OpKceY01h1dAFCqRFAwe--K2oVbCUiYjM5AH_nQ,480
274
278
  validmind/unit_metrics/classification/sklearn/F1.py,sha256=Uiq5sPyNpALhApTkmLUhh76mF91bLCABB5OVHOlbmGo,437
275
279
  validmind/unit_metrics/classification/sklearn/Precision.py,sha256=8zO5VDZhfT8R2VFYiV-CzsZwhsTwVAKca4nhD-qALLw,458
276
- validmind/unit_metrics/classification/sklearn/ROC_AUC.py,sha256=5-i1xhrLg7Ix4sk7pBKDBtlqBCNRD365LnTvsekSVYs,452
280
+ validmind/unit_metrics/classification/sklearn/ROC_AUC.py,sha256=faDV8uxcohG38WrAWrDB1WSrzFDfcvD6I4uG9Az6W_E,1048
277
281
  validmind/unit_metrics/classification/sklearn/Recall.py,sha256=0WG3A6K9M1UmbWQKoS_wwLfq-cXVDDTIA1ZpaJNyKp8,449
278
282
  validmind/unit_metrics/composite.py,sha256=EJiSucxFkNyrl1JhrVTxmfOFsYL5TvJwe4fNiVNgTFo,8158
279
283
  validmind/unit_metrics/regression/GiniCoefficient.py,sha256=ebh1rOob8mEmQp0EpXcneAXjc4AIfm6O3Y0_mnTahKA,984
@@ -287,13 +291,14 @@ validmind/unit_metrics/regression/sklearn/MeanAbsoluteError.py,sha256=LCNgpDw6FB
287
291
  validmind/unit_metrics/regression/sklearn/MeanSquaredError.py,sha256=7UQnDTTO7yRRyMe3Zac9ZyjEbbD8pW_8WnZwHdVB_8U,463
288
292
  validmind/unit_metrics/regression/sklearn/RSquaredScore.py,sha256=h9U5ndtnJfNNtKPZIo5n3KRp-m4akQcEo0t1iSwjVzY,420
289
293
  validmind/unit_metrics/regression/sklearn/RootMeanSquaredError.py,sha256=_5IQIU9jNfmTE4NLJvaRWXbudRGV2PS7nYF5e4fkSMY,556
290
- validmind/utils.py,sha256=MQDsW7YuwEJ50tA01n3xb8D_Ihmji_Mn22AlMnJJQT8,15819
291
- validmind/vm_models/__init__.py,sha256=lmWCD2u4tW6_AH39UnJ24sCcMUcsHbUttz7SaZfrh3s,1168
294
+ validmind/utils.py,sha256=DYUB3nig6MJwct5dymhy7Gt9apwzPVipKAWxSrm0-tg,15849
295
+ validmind/vm_models/__init__.py,sha256=V5DH-E1Rkvl-HQEkilppVCHBag9MQXkzyoORLW3LSGQ,1210
292
296
  validmind/vm_models/dataset/__init__.py,sha256=U4CxZjdoc0dd9u2AqBl5PJh1UVbzXWNrmundmjLF-qE,346
293
- validmind/vm_models/dataset/dataset.py,sha256=LgftX1IOuhVOf7C5i3cWHQAmpkPOXZ2Wc6fFZcBcQ3c,24249
297
+ validmind/vm_models/dataset/dataset.py,sha256=hBaczQjo-Jb1u6Ma5yX86m6JzT16XndAlq32WbHqVx8,25645
294
298
  validmind/vm_models/dataset/utils.py,sha256=DRFCg93YE7sTRrWAGt1RIyvzPjINagMk6zUw7z692d0,5325
295
299
  validmind/vm_models/figure.py,sha256=iSrvPcCG5sQrMkX1Fh6c5utRzaroh3bc6IlnGDOK_Eg,6651
296
- validmind/vm_models/model.py,sha256=b-UL73EWOpj-X5aQbHQ3HLkONHCH9hYwUlKxVwPC6gI,6088
300
+ validmind/vm_models/input.py,sha256=qLdqz_bktr4v0YcPha2vFdDvmkC-btT1pH9zBIkt1OY,1046
301
+ validmind/vm_models/model.py,sha256=P-zKbh0TrU_4ZK-bA0l83h6K6nfU6v0lIpC4mfCl6Fw,6115
297
302
  validmind/vm_models/test/metric.py,sha256=DvXMju36JzxArXNWimq3SSrSUoIHkyvDbuhbgBOKxkk,3357
298
303
  validmind/vm_models/test/metric_result.py,sha256=Bak4GDrMlNq5NtgP5exwlPsKZgz3tWgtC6jZqtHjvqM,1987
299
304
  validmind/vm_models/test/output_template.py,sha256=njqCAMyLxwadkCWhACVskyL9-psTgmUysaeeirTVAX4,1500
@@ -302,13 +307,13 @@ validmind/vm_models/test/result_wrapper.py,sha256=Zb2IVjB3UTIMxTjmv9xZ1kaIIAd_dU
302
307
  validmind/vm_models/test/test.py,sha256=2Wbte09E4l7fUXwfQije0LQbPeSuh2Wpbyt4ddwyVks,3419
303
308
  validmind/vm_models/test/threshold_test.py,sha256=xSadM5t9Z-XZjkxu7LKmeljy2bdwTwXrUh-mkdePdLM,3740
304
309
  validmind/vm_models/test/threshold_test_result.py,sha256=EXP-g_e3NsnpkvNgYew030qVUoY6ZTHyuuFUXaq-BuM,1954
305
- validmind/vm_models/test_context.py,sha256=AN7-atBgOcD04MLVitCFJYooxF6_iNmvI2H4nkv32iw,9035
310
+ validmind/vm_models/test_context.py,sha256=SGqoF_OeFC7Fj1jg5CPO1LOpfB7mA1FPwm61SYP8f2o,9475
306
311
  validmind/vm_models/test_suite/runner.py,sha256=aewxadRfoOPH48jes2Gtb3Ju_FWFfVM_9ARIAJHD4wA,6982
307
312
  validmind/vm_models/test_suite/summary.py,sha256=GQRNe2ZvvqjQN0yKmaN7ohAUjRFQIN4YYUYxfOuWN6M,4682
308
313
  validmind/vm_models/test_suite/test.py,sha256=_GfbK36l98SjzgVcucmp0OKBJKqMW3neO7SqJ3EWeps,5049
309
314
  validmind/vm_models/test_suite/test_suite.py,sha256=Cns2wL54v0T5Mv5_HJb3kMeaa4rtycdqT8KxK9_rWEU,6279
310
- validmind-2.4.10.dist-info/LICENSE,sha256=XonPUfwjvrC5Ombl3y-ko0Wubb1xdG_7nzvIbkZRKHw,35772
311
- validmind-2.4.10.dist-info/METADATA,sha256=YJY0yOUEnv5-CsnoP7q3EVBCpTGgGUsD2jtwA-urG8Q,4251
312
- validmind-2.4.10.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
313
- validmind-2.4.10.dist-info/entry_points.txt,sha256=HuW7YyOv9u_OEWpViQXtv0nfoI67uieJHawKWA4Hv9A,76
314
- validmind-2.4.10.dist-info/RECORD,,
315
+ validmind-2.5.1.dist-info/LICENSE,sha256=XonPUfwjvrC5Ombl3y-ko0Wubb1xdG_7nzvIbkZRKHw,35772
316
+ validmind-2.5.1.dist-info/METADATA,sha256=ZnwdazSYewQA2IZLaVIUQkuxmDl6yVke6kjyiSkLEJk,4250
317
+ validmind-2.5.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
318
+ validmind-2.5.1.dist-info/entry_points.txt,sha256=HuW7YyOv9u_OEWpViQXtv0nfoI67uieJHawKWA4Hv9A,76
319
+ validmind-2.5.1.dist-info/RECORD,,