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.
- validmind/__init__.py +2 -1
- validmind/__version__.py +1 -1
- validmind/{ai.py → ai/test_descriptions.py} +74 -82
- validmind/ai/utils.py +104 -0
- validmind/api_client.py +58 -19
- validmind/client.py +5 -5
- validmind/models/foundation.py +10 -6
- validmind/models/function.py +3 -1
- validmind/models/metadata.py +1 -1
- validmind/test_suites/__init__.py +1 -9
- validmind/test_suites/regression.py +0 -16
- validmind/test_suites/statsmodels_timeseries.py +1 -1
- validmind/tests/__init__.py +7 -7
- validmind/tests/__types__.py +170 -0
- validmind/tests/data_validation/ACFandPACFPlot.py +36 -27
- validmind/tests/{model_validation/statsmodels → data_validation}/ADF.py +42 -13
- validmind/tests/data_validation/BivariateScatterPlots.py +38 -41
- validmind/tests/{model_validation/statsmodels → data_validation}/DFGLSArch.py +67 -11
- validmind/tests/data_validation/HeatmapFeatureCorrelations.py +1 -1
- validmind/tests/data_validation/HighPearsonCorrelation.py +12 -3
- validmind/tests/data_validation/IsolationForestOutliers.py +2 -2
- validmind/tests/{model_validation/statsmodels → data_validation}/KPSS.py +64 -11
- validmind/tests/{model_validation/statsmodels → data_validation}/PhillipsPerronArch.py +65 -11
- validmind/tests/data_validation/ScatterPlot.py +1 -1
- validmind/tests/data_validation/SeasonalDecompose.py +12 -7
- validmind/tests/data_validation/TabularDateTimeHistograms.py +29 -33
- validmind/tests/data_validation/WOEBinPlots.py +1 -1
- validmind/tests/data_validation/WOEBinTable.py +1 -1
- validmind/tests/{model_validation/statsmodels → data_validation}/ZivotAndrewsArch.py +65 -11
- validmind/tests/data_validation/nlp/CommonWords.py +1 -1
- validmind/tests/data_validation/nlp/Hashtags.py +1 -1
- validmind/tests/data_validation/nlp/Mentions.py +1 -1
- validmind/tests/data_validation/nlp/PolarityAndSubjectivity.py +2 -1
- validmind/tests/data_validation/nlp/Punctuations.py +1 -1
- validmind/tests/data_validation/nlp/Sentiment.py +1 -1
- validmind/tests/data_validation/nlp/TextDescription.py +5 -1
- validmind/tests/data_validation/nlp/Toxicity.py +1 -1
- validmind/tests/decorator.py +13 -1
- validmind/tests/model_validation/FeaturesAUC.py +5 -3
- validmind/tests/model_validation/embeddings/CosineSimilarityComparison.py +4 -0
- validmind/tests/model_validation/embeddings/CosineSimilarityHeatmap.py +4 -0
- validmind/tests/model_validation/embeddings/EuclideanDistanceComparison.py +4 -0
- validmind/tests/model_validation/embeddings/EuclideanDistanceHeatmap.py +4 -0
- validmind/tests/model_validation/embeddings/PCAComponentsPairwisePlots.py +4 -0
- validmind/tests/model_validation/embeddings/TSNEComponentsPairwisePlots.py +4 -0
- validmind/tests/model_validation/ragas/AnswerCorrectness.py +3 -3
- validmind/tests/model_validation/ragas/AnswerRelevance.py +5 -4
- validmind/tests/model_validation/ragas/AnswerSimilarity.py +5 -4
- validmind/tests/model_validation/ragas/AspectCritique.py +14 -8
- validmind/tests/model_validation/ragas/ContextEntityRecall.py +3 -4
- validmind/tests/model_validation/ragas/ContextPrecision.py +4 -5
- validmind/tests/model_validation/ragas/ContextRecall.py +3 -4
- validmind/tests/model_validation/ragas/ContextRelevancy.py +5 -4
- validmind/tests/model_validation/ragas/Faithfulness.py +6 -5
- validmind/tests/model_validation/ragas/utils.py +35 -9
- validmind/tests/model_validation/sklearn/ClusterPerformance.py +2 -2
- validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.py +1 -1
- validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.py +6 -8
- validmind/tests/model_validation/sklearn/RegressionErrors.py +1 -1
- validmind/tests/model_validation/sklearn/RegressionModelsPerformanceComparison.py +14 -8
- validmind/tests/model_validation/sklearn/RegressionR2Square.py +1 -1
- validmind/tests/model_validation/statsmodels/DurbinWatsonTest.py +1 -1
- validmind/tests/model_validation/statsmodels/GINITable.py +1 -1
- validmind/tests/model_validation/statsmodels/JarqueBera.py +1 -1
- validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.py +1 -1
- validmind/tests/model_validation/statsmodels/LJungBox.py +1 -1
- validmind/tests/model_validation/statsmodels/Lilliefors.py +1 -1
- validmind/tests/model_validation/statsmodels/RegressionCoeffsPlot.py +4 -0
- validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.py +9 -4
- validmind/tests/model_validation/statsmodels/RegressionModelsCoeffs.py +2 -2
- validmind/tests/model_validation/statsmodels/RunsTest.py +1 -1
- validmind/tests/model_validation/statsmodels/ShapiroWilk.py +1 -1
- validmind/tests/prompt_validation/Bias.py +14 -11
- validmind/tests/prompt_validation/Clarity.py +14 -11
- validmind/tests/prompt_validation/Conciseness.py +14 -11
- validmind/tests/prompt_validation/Delimitation.py +14 -11
- validmind/tests/prompt_validation/NegativeInstruction.py +14 -11
- validmind/tests/prompt_validation/Robustness.py +11 -11
- validmind/tests/prompt_validation/Specificity.py +14 -11
- validmind/tests/prompt_validation/ai_powered_test.py +53 -75
- validmind/unit_metrics/composite.py +2 -1
- validmind/utils.py +34 -59
- validmind/vm_models/dataset/dataset.py +17 -3
- validmind/vm_models/dataset/utils.py +2 -2
- validmind/vm_models/model.py +1 -1
- validmind/vm_models/test/metric.py +1 -8
- validmind/vm_models/test/result_wrapper.py +2 -2
- validmind/vm_models/test/test.py +3 -0
- validmind/vm_models/test/threshold_test.py +1 -1
- validmind/vm_models/test_suite/runner.py +7 -4
- {validmind-2.2.6.dist-info → validmind-2.3.3.dist-info}/METADATA +1 -1
- {validmind-2.2.6.dist-info → validmind-2.3.3.dist-info}/RECORD +95 -103
- validmind/tests/data_validation/DefaultRatesbyRiskBandPlot.py +0 -114
- validmind/tests/data_validation/PiTCreditScoresHistogram.py +0 -150
- validmind/tests/data_validation/PiTPDHistogram.py +0 -152
- validmind/tests/model_validation/statsmodels/ADFTest.py +0 -88
- validmind/tests/model_validation/statsmodels/FeatureImportanceAndSignificance.py +0 -198
- validmind/tests/model_validation/statsmodels/PDRatingClassPlot.py +0 -151
- validmind/tests/model_validation/statsmodels/RegressionModelInsampleComparison.py +0 -146
- validmind/tests/model_validation/statsmodels/RegressionModelOutsampleComparison.py +0 -144
- validmind/tests/model_validation/statsmodels/RegressionModelsPerformance.py +0 -127
- validmind/tests/model_validation/statsmodels/ResidualsVisualInspection.py +0 -130
- {validmind-2.2.6.dist-info → validmind-2.3.3.dist-info}/LICENSE +0 -0
- {validmind-2.2.6.dist-info → validmind-2.3.3.dist-info}/WHEEL +0 -0
- {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
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
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
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
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
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
)
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
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(
|
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
|
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(
|
validmind/vm_models/model.py
CHANGED
@@ -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
|
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
|
validmind/vm_models/test/test.py
CHANGED
@@ -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 ...
|
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
|
-
|
87
|
-
|
88
|
-
"Setting test parameters directly in the 'config' parameter
|
89
|
-
|
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
|
|