validmind 2.2.6__py3-none-any.whl → 2.3.3__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 (105) hide show
  1. validmind/__init__.py +2 -1
  2. validmind/__version__.py +1 -1
  3. validmind/{ai.py → ai/test_descriptions.py} +74 -82
  4. validmind/ai/utils.py +104 -0
  5. validmind/api_client.py +58 -19
  6. validmind/client.py +5 -5
  7. validmind/models/foundation.py +10 -6
  8. validmind/models/function.py +3 -1
  9. validmind/models/metadata.py +1 -1
  10. validmind/test_suites/__init__.py +1 -9
  11. validmind/test_suites/regression.py +0 -16
  12. validmind/test_suites/statsmodels_timeseries.py +1 -1
  13. validmind/tests/__init__.py +7 -7
  14. validmind/tests/__types__.py +170 -0
  15. validmind/tests/data_validation/ACFandPACFPlot.py +36 -27
  16. validmind/tests/{model_validation/statsmodels → data_validation}/ADF.py +42 -13
  17. validmind/tests/data_validation/BivariateScatterPlots.py +38 -41
  18. validmind/tests/{model_validation/statsmodels → data_validation}/DFGLSArch.py +67 -11
  19. validmind/tests/data_validation/HeatmapFeatureCorrelations.py +1 -1
  20. validmind/tests/data_validation/HighPearsonCorrelation.py +12 -3
  21. validmind/tests/data_validation/IsolationForestOutliers.py +2 -2
  22. validmind/tests/{model_validation/statsmodels → data_validation}/KPSS.py +64 -11
  23. validmind/tests/{model_validation/statsmodels → data_validation}/PhillipsPerronArch.py +65 -11
  24. validmind/tests/data_validation/ScatterPlot.py +1 -1
  25. validmind/tests/data_validation/SeasonalDecompose.py +12 -7
  26. validmind/tests/data_validation/TabularDateTimeHistograms.py +29 -33
  27. validmind/tests/data_validation/WOEBinPlots.py +1 -1
  28. validmind/tests/data_validation/WOEBinTable.py +1 -1
  29. validmind/tests/{model_validation/statsmodels → data_validation}/ZivotAndrewsArch.py +65 -11
  30. validmind/tests/data_validation/nlp/CommonWords.py +1 -1
  31. validmind/tests/data_validation/nlp/Hashtags.py +1 -1
  32. validmind/tests/data_validation/nlp/Mentions.py +1 -1
  33. validmind/tests/data_validation/nlp/PolarityAndSubjectivity.py +2 -1
  34. validmind/tests/data_validation/nlp/Punctuations.py +1 -1
  35. validmind/tests/data_validation/nlp/Sentiment.py +1 -1
  36. validmind/tests/data_validation/nlp/TextDescription.py +5 -1
  37. validmind/tests/data_validation/nlp/Toxicity.py +1 -1
  38. validmind/tests/decorator.py +13 -1
  39. validmind/tests/model_validation/FeaturesAUC.py +5 -3
  40. validmind/tests/model_validation/embeddings/CosineSimilarityComparison.py +4 -0
  41. validmind/tests/model_validation/embeddings/CosineSimilarityHeatmap.py +4 -0
  42. validmind/tests/model_validation/embeddings/EuclideanDistanceComparison.py +4 -0
  43. validmind/tests/model_validation/embeddings/EuclideanDistanceHeatmap.py +4 -0
  44. validmind/tests/model_validation/embeddings/PCAComponentsPairwisePlots.py +4 -0
  45. validmind/tests/model_validation/embeddings/TSNEComponentsPairwisePlots.py +4 -0
  46. validmind/tests/model_validation/ragas/AnswerCorrectness.py +3 -3
  47. validmind/tests/model_validation/ragas/AnswerRelevance.py +5 -4
  48. validmind/tests/model_validation/ragas/AnswerSimilarity.py +5 -4
  49. validmind/tests/model_validation/ragas/AspectCritique.py +14 -8
  50. validmind/tests/model_validation/ragas/ContextEntityRecall.py +3 -4
  51. validmind/tests/model_validation/ragas/ContextPrecision.py +4 -5
  52. validmind/tests/model_validation/ragas/ContextRecall.py +3 -4
  53. validmind/tests/model_validation/ragas/ContextRelevancy.py +5 -4
  54. validmind/tests/model_validation/ragas/Faithfulness.py +6 -5
  55. validmind/tests/model_validation/ragas/utils.py +35 -9
  56. validmind/tests/model_validation/sklearn/ClusterPerformance.py +2 -2
  57. validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.py +1 -1
  58. validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.py +6 -8
  59. validmind/tests/model_validation/sklearn/RegressionErrors.py +1 -1
  60. validmind/tests/model_validation/sklearn/RegressionModelsPerformanceComparison.py +14 -8
  61. validmind/tests/model_validation/sklearn/RegressionR2Square.py +1 -1
  62. validmind/tests/model_validation/statsmodels/DurbinWatsonTest.py +1 -1
  63. validmind/tests/model_validation/statsmodels/GINITable.py +1 -1
  64. validmind/tests/model_validation/statsmodels/JarqueBera.py +1 -1
  65. validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.py +1 -1
  66. validmind/tests/model_validation/statsmodels/LJungBox.py +1 -1
  67. validmind/tests/model_validation/statsmodels/Lilliefors.py +1 -1
  68. validmind/tests/model_validation/statsmodels/RegressionCoeffsPlot.py +4 -0
  69. validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.py +9 -4
  70. validmind/tests/model_validation/statsmodels/RegressionModelsCoeffs.py +2 -2
  71. validmind/tests/model_validation/statsmodels/RunsTest.py +1 -1
  72. validmind/tests/model_validation/statsmodels/ShapiroWilk.py +1 -1
  73. validmind/tests/prompt_validation/Bias.py +14 -11
  74. validmind/tests/prompt_validation/Clarity.py +14 -11
  75. validmind/tests/prompt_validation/Conciseness.py +14 -11
  76. validmind/tests/prompt_validation/Delimitation.py +14 -11
  77. validmind/tests/prompt_validation/NegativeInstruction.py +14 -11
  78. validmind/tests/prompt_validation/Robustness.py +11 -11
  79. validmind/tests/prompt_validation/Specificity.py +14 -11
  80. validmind/tests/prompt_validation/ai_powered_test.py +53 -75
  81. validmind/unit_metrics/composite.py +2 -1
  82. validmind/utils.py +34 -59
  83. validmind/vm_models/dataset/dataset.py +17 -3
  84. validmind/vm_models/dataset/utils.py +2 -2
  85. validmind/vm_models/model.py +1 -1
  86. validmind/vm_models/test/metric.py +1 -8
  87. validmind/vm_models/test/result_wrapper.py +2 -2
  88. validmind/vm_models/test/test.py +3 -0
  89. validmind/vm_models/test/threshold_test.py +1 -1
  90. validmind/vm_models/test_suite/runner.py +7 -4
  91. {validmind-2.2.6.dist-info → validmind-2.3.3.dist-info}/METADATA +1 -1
  92. {validmind-2.2.6.dist-info → validmind-2.3.3.dist-info}/RECORD +95 -103
  93. validmind/tests/data_validation/DefaultRatesbyRiskBandPlot.py +0 -114
  94. validmind/tests/data_validation/PiTCreditScoresHistogram.py +0 -150
  95. validmind/tests/data_validation/PiTPDHistogram.py +0 -152
  96. validmind/tests/model_validation/statsmodels/ADFTest.py +0 -88
  97. validmind/tests/model_validation/statsmodels/FeatureImportanceAndSignificance.py +0 -198
  98. validmind/tests/model_validation/statsmodels/PDRatingClassPlot.py +0 -151
  99. validmind/tests/model_validation/statsmodels/RegressionModelInsampleComparison.py +0 -146
  100. validmind/tests/model_validation/statsmodels/RegressionModelOutsampleComparison.py +0 -144
  101. validmind/tests/model_validation/statsmodels/RegressionModelsPerformance.py +0 -127
  102. validmind/tests/model_validation/statsmodels/ResidualsVisualInspection.py +0 -130
  103. {validmind-2.2.6.dist-info → validmind-2.3.3.dist-info}/LICENSE +0 -0
  104. {validmind-2.2.6.dist-info → validmind-2.3.3.dist-info}/WHEEL +0 -0
  105. {validmind-2.2.6.dist-info → validmind-2.3.3.dist-info}/entry_points.txt +0 -0
validmind/utils.py CHANGED
@@ -4,9 +4,9 @@
4
4
 
5
5
  import asyncio
6
6
  import difflib
7
+ import inspect
7
8
  import json
8
9
  import math
9
- import os
10
10
  import re
11
11
  import sys
12
12
  from platform import python_version
@@ -26,11 +26,8 @@ from matplotlib.axes._axes import _log as matplotlib_axes_logger
26
26
  from numpy import ndarray
27
27
  from tabulate import tabulate
28
28
 
29
- from .ai import background_generate_description, is_configured
30
29
  from .html_templates.content_blocks import math_jax_snippet, python_syntax_highlighting
31
-
32
- AI_REVISION_NAME = "Generated by ValidMind AI"
33
- DEFAULT_REVISION_NAME = "Default Description"
30
+ from .logging import get_logger
34
31
 
35
32
  DEFAULT_BIG_NUMBER_DECIMALS = 2
36
33
  DEFAULT_SMALL_NUMBER_DECIMALS = 4
@@ -53,6 +50,8 @@ params = {
53
50
  pylab.rcParams.update(params)
54
51
  #################################
55
52
 
53
+ logger = get_logger(__name__)
54
+
56
55
 
57
56
  def is_notebook() -> bool:
58
57
  """
@@ -310,7 +309,7 @@ def run_async_check(func, *args, **kwargs):
310
309
  if task.get_name() == name:
311
310
  return task
312
311
 
313
- return run_async(func, name=name, *args, **kwargs)
312
+ return run_async(func, name=name, *args, **kwargs) # noqa B026
314
313
 
315
314
  except RuntimeError:
316
315
  pass
@@ -462,58 +461,34 @@ def md_to_html(md: str, mathml=False) -> str:
462
461
  return html
463
462
 
464
463
 
465
- def get_description_metadata(
466
- test_id,
467
- default_description,
468
- summary=None,
469
- figures=None,
470
- prefix="metric_description",
471
- ):
472
- """Get Metadata Dictionary for a Test or Metric Result
473
-
474
- Generates an LLM interpretation of the test results or uses the default
475
- description and returns a metadata object that can be logged with the test results.
476
-
477
- By default, the description is generated by an LLM that will interpret the test
478
- results and provide a human-readable description. If the summary or figures are
479
- not provided, or the `VALIDMIND_LLM_DESCRIPTIONS_ENABLED` environment variable is
480
- set to `0` or `false` or no LLM has been configured, the default description will
481
- be used as the test result description.
482
-
483
- Note: Either the summary or figures must be provided to generate the description.
464
+ def inspect_obj(obj):
465
+ # Filtering only attributes
466
+ print(len("Attributes:") * "-")
467
+ print("Attributes:")
468
+ print(len("Attributes:") * "-")
484
469
 
485
- Args:
486
- test_id (str): The test ID
487
- default_description (str): The default description for the test
488
- summary (Any): The test summary or results to interpret
489
- figures (List[Figure]): The figures to attach to the test suite result
490
- prefix (str): The prefix to use for the content ID (Default: "metric_description")
491
-
492
- Returns:
493
- dict: The metadata object to be logged with the test results
494
- """
495
- env_disabled = os.getenv("VALIDMIND_LLM_DESCRIPTIONS_ENABLED", "1") in [
496
- "0",
497
- "false",
470
+ # Get only attributes (not methods)
471
+ attributes = [
472
+ attr
473
+ for attr in dir(obj)
474
+ if not callable(getattr(obj, attr)) and not attr.startswith("__")
498
475
  ]
499
-
500
- if (summary or figures) and not env_disabled and is_configured():
501
- revision_name = AI_REVISION_NAME
502
-
503
- # get description future and set it as the description in the metadata
504
- # this will lazily retrieved so it can run in the background in parallel
505
- description = background_generate_description(
506
- test_id=test_id,
507
- test_description=default_description,
508
- test_summary=summary,
509
- figures=figures,
510
- )
511
-
512
- else:
513
- revision_name = DEFAULT_REVISION_NAME
514
- description = md_to_html(default_description, mathml=True)
515
-
516
- return {
517
- "content_id": f"{prefix}:{test_id}::{revision_name}",
518
- "text": description,
519
- }
476
+ for attr in attributes:
477
+ print(f"{attr}")
478
+
479
+ # Filtering only methods using inspect and displaying their parameters
480
+ print("\nMethods with Parameters:")
481
+
482
+ # Get only methods (functions) using inspect.ismethod
483
+ methods = inspect.getmembers(obj, predicate=inspect.ismethod)
484
+ print("Methods:")
485
+ for name, method in methods:
486
+ # Get the signature of the method
487
+ sig = inspect.signature(method)
488
+ print(len(f"{name}") * "-")
489
+ print(f"{name}")
490
+ print(len(f"{name}") * "-")
491
+ print("Parameters:")
492
+ # Loop through the parameters and print detailed information
493
+ for param_name, param in sig.parameters.items():
494
+ print(f"{param_name} - ({param.default})")
@@ -195,7 +195,19 @@ class VMDataset:
195
195
  probability_column: str = None,
196
196
  probability_values: list = None,
197
197
  prediction_probabilities: list = None, # DEPRECATED: use probability_values
198
+ **kwargs,
198
199
  ):
200
+ """Assign predictions and probabilities to the dataset.
201
+
202
+ Args:
203
+ model (VMModel): The model used to generate the predictions.
204
+ prediction_column (str, optional): The name of the column containing the predictions. Defaults to None.
205
+ prediction_values (list, optional): The values of the predictions. Defaults to None.
206
+ probability_column (str, optional): The name of the column containing the probabilities. Defaults to None.
207
+ probability_values (list, optional): The values of the probabilities. Defaults to None.
208
+ prediction_probabilities (list, optional): DEPRECATED: The values of the probabilities. Defaults to None.
209
+ kwargs: Additional keyword arguments that will get passed through to the model's `predict` method.
210
+ """
199
211
  if prediction_probabilities is not None:
200
212
  warnings.warn(
201
213
  "The `prediction_probabilities` argument is deprecated. Use `probability_values` instead.",
@@ -226,7 +238,9 @@ class VMDataset:
226
238
 
227
239
  if prediction_values is None:
228
240
  X = self.df if isinstance(model, (FunctionModel, PipelineModel)) else self.x
229
- probability_values, prediction_values = compute_predictions(model, X)
241
+ probability_values, prediction_values = compute_predictions(
242
+ model, X, **kwargs
243
+ )
230
244
 
231
245
  prediction_column = prediction_column or f"{model.input_id}_prediction"
232
246
  self._add_column(prediction_column, prediction_values)
@@ -356,8 +370,8 @@ class VMDataset:
356
370
  return as_df(self.df[self.probability_column(model)])
357
371
 
358
372
  def target_classes(self):
359
- """Returns the unique number of target classes for the target (Y) variable"""
360
- return [str(i) for i in np.unique(self.y)]
373
+ """Returns the target class labels or unique values of the target column."""
374
+ return self.target_class_labels or [str(i) for i in np.unique(self.y)]
361
375
 
362
376
  def __str__(self):
363
377
  return (
@@ -94,7 +94,7 @@ def _is_probabilties(output):
94
94
  return np.all((output >= 0) & (output <= 1)) and np.any((output > 0) & (output < 1))
95
95
 
96
96
 
97
- def compute_predictions(model, X) -> tuple:
97
+ def compute_predictions(model, X, **kwargs) -> tuple:
98
98
  probability_values = None
99
99
 
100
100
  try:
@@ -108,7 +108,7 @@ def compute_predictions(model, X) -> tuple:
108
108
 
109
109
  try:
110
110
  logger.info("Running predict()... This may take a while")
111
- prediction_values = model.predict(X)
111
+ prediction_values = model.predict(X, **kwargs)
112
112
  logger.info("Done running predict()")
113
113
  except MissingOrInvalidModelPredictFnError:
114
114
  raise MissingOrInvalidModelPredictFnError(
@@ -114,7 +114,7 @@ class VMModel(ABC):
114
114
 
115
115
  self.__post_init__()
116
116
 
117
- def __post_init__(self):
117
+ def __post_init__(self): # noqa: B027
118
118
  """Allows child classes to add their own post-init logic"""
119
119
  pass
120
120
 
@@ -12,8 +12,8 @@ from typing import ClassVar, List, Optional, Union
12
12
 
13
13
  import pandas as pd
14
14
 
15
+ from ...ai.test_descriptions import get_description_metadata
15
16
  from ...errors import MissingCacheResultsArgumentsError
16
- from ...utils import get_description_metadata
17
17
  from ..figure import Figure
18
18
  from .metric_result import MetricResult
19
19
  from .result_wrapper import MetricResultWrapper
@@ -36,13 +36,6 @@ class Metric(Test):
36
36
  # Instance Variables
37
37
  result: MetricResultWrapper = None # populated by cache_results() method
38
38
 
39
- @property
40
- def key(self):
41
- """
42
- Keep the key for compatibility reasons
43
- """
44
- return self._key if hasattr(self, "_key") else self.name
45
-
46
39
  @abstractmethod
47
40
  def summary(self, metric_value: Optional[Union[dict, list, pd.DataFrame]] = None):
48
41
  """
@@ -15,10 +15,10 @@ import pandas as pd
15
15
  from ipywidgets import HTML, GridBox, Layout, VBox
16
16
 
17
17
  from ... import api_client
18
- from ...ai import DescriptionFuture
18
+ from ...ai.test_descriptions import AI_REVISION_NAME, DescriptionFuture
19
19
  from ...input_registry import input_registry
20
20
  from ...logging import get_logger
21
- from ...utils import AI_REVISION_NAME, NumpyEncoder, display, run_async, test_id_to_name
21
+ from ...utils import NumpyEncoder, display, run_async, test_id_to_name
22
22
  from ..dataset import VMDataset
23
23
  from ..figure import Figure
24
24
  from .metric_result import MetricResult
@@ -52,6 +52,9 @@ class Test(TestUtils):
52
52
  "test_id is missing. It must be passed when initializing the test"
53
53
  )
54
54
  self._ref_id = str(uuid4())
55
+ self.key = (
56
+ self.test_id
57
+ ) # for backwards compatibility - figures really should get keyed automatically
55
58
 
56
59
  # TODO: add validation for required inputs
57
60
  if self.default_params is None:
@@ -11,7 +11,7 @@ avoid confusion with the "tests" in the general data science/modeling sense.
11
11
  from dataclasses import dataclass
12
12
  from typing import ClassVar, List, Optional
13
13
 
14
- from ...utils import get_description_metadata
14
+ from ...ai.test_descriptions import get_description_metadata
15
15
  from ..figure import Figure
16
16
  from .result_summary import ResultSummary, ResultTable
17
17
  from .result_wrapper import ThresholdTestResultWrapper
@@ -83,11 +83,14 @@ class TestSuiteRunner:
83
83
  test_configs = test_configs.get("params", {})
84
84
  else:
85
85
  if (test_configs) and ("params" not in test_configs):
86
- """[DEPRECATED] Deprecated method for setting test parameters directly in the 'config' parameter"""
87
- logger.info(
88
- "Setting test parameters directly in the 'config' parameter of the run_documentation_tests() method is deprecated. "
89
- 'Instead, use the new format of the config: config = {"test_id": {"params": {...}, "inputs": {...}}}'
86
+ # [DEPRECATED] This is the old way of setting test parameters
87
+ msg = (
88
+ "Setting test parameters directly in the 'config' parameter"
89
+ " of the run_documentation_tests() method is deprecated. "
90
+ "Instead, use the new format of the config: "
91
+ 'config = {"test_id": {"params": {...}, "inputs": {...}}}'
90
92
  )
93
+ logger.warning(msg)
91
94
 
92
95
  test.load(inputs=inputs, context=self.context, config=test_configs)
93
96
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: validmind
3
- Version: 2.2.6
3
+ Version: 2.3.3
4
4
  Summary: ValidMind Developer Framework
5
5
  License: Commercial License
6
6
  Author: Andres Rodriguez