validmind 2.7.12__py3-none-any.whl → 2.8.12__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 +58 -10
- validmind/__version__.py +1 -1
- validmind/ai/test_descriptions.py +17 -73
- validmind/api_client.py +18 -1
- validmind/models/r_model.py +5 -1
- validmind/tests/comparison.py +28 -2
- validmind/tests/data_validation/ACFandPACFPlot.py +4 -1
- validmind/tests/data_validation/AutoMA.py +1 -1
- validmind/tests/data_validation/BivariateScatterPlots.py +5 -1
- validmind/tests/data_validation/BoxPierce.py +3 -1
- validmind/tests/data_validation/ClassImbalance.py +1 -1
- validmind/tests/data_validation/DatasetDescription.py +1 -1
- validmind/tests/data_validation/DickeyFullerGLS.py +1 -1
- validmind/tests/data_validation/FeatureTargetCorrelationPlot.py +5 -10
- validmind/tests/data_validation/HighCardinality.py +5 -1
- validmind/tests/data_validation/HighPearsonCorrelation.py +1 -1
- validmind/tests/data_validation/IQROutliersBarPlot.py +5 -3
- validmind/tests/data_validation/IQROutliersTable.py +5 -2
- validmind/tests/data_validation/IsolationForestOutliers.py +5 -4
- validmind/tests/data_validation/JarqueBera.py +2 -2
- validmind/tests/data_validation/LJungBox.py +2 -2
- validmind/tests/data_validation/LaggedCorrelationHeatmap.py +1 -1
- validmind/tests/data_validation/MissingValues.py +14 -10
- validmind/tests/data_validation/MissingValuesBarPlot.py +3 -1
- validmind/tests/data_validation/MutualInformation.py +2 -1
- validmind/tests/data_validation/PearsonCorrelationMatrix.py +1 -1
- validmind/tests/data_validation/ProtectedClassesCombination.py +2 -0
- validmind/tests/data_validation/ProtectedClassesDescription.py +2 -2
- validmind/tests/data_validation/ProtectedClassesDisparity.py +9 -5
- validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.py +10 -2
- validmind/tests/data_validation/RollingStatsPlot.py +2 -1
- validmind/tests/data_validation/ScoreBandDefaultRates.py +4 -2
- validmind/tests/data_validation/SeasonalDecompose.py +1 -1
- validmind/tests/data_validation/ShapiroWilk.py +2 -2
- validmind/tests/data_validation/SpreadPlot.py +1 -1
- validmind/tests/data_validation/TabularCategoricalBarPlots.py +1 -1
- validmind/tests/data_validation/TabularDateTimeHistograms.py +1 -1
- validmind/tests/data_validation/TargetRateBarPlots.py +4 -1
- validmind/tests/data_validation/TimeSeriesFrequency.py +1 -1
- validmind/tests/data_validation/TimeSeriesOutliers.py +7 -2
- validmind/tests/data_validation/WOEBinPlots.py +1 -1
- validmind/tests/data_validation/WOEBinTable.py +1 -1
- validmind/tests/data_validation/ZivotAndrewsArch.py +5 -2
- validmind/tests/data_validation/nlp/CommonWords.py +1 -1
- validmind/tests/data_validation/nlp/Hashtags.py +1 -1
- validmind/tests/data_validation/nlp/LanguageDetection.py +1 -1
- validmind/tests/data_validation/nlp/Mentions.py +1 -1
- validmind/tests/data_validation/nlp/PolarityAndSubjectivity.py +5 -1
- validmind/tests/data_validation/nlp/Punctuations.py +1 -1
- validmind/tests/data_validation/nlp/Sentiment.py +3 -1
- validmind/tests/data_validation/nlp/TextDescription.py +1 -1
- validmind/tests/data_validation/nlp/Toxicity.py +1 -1
- validmind/tests/model_validation/BertScore.py +7 -1
- validmind/tests/model_validation/BleuScore.py +7 -1
- validmind/tests/model_validation/ClusterSizeDistribution.py +3 -1
- validmind/tests/model_validation/ContextualRecall.py +9 -1
- validmind/tests/model_validation/FeaturesAUC.py +1 -1
- validmind/tests/model_validation/MeteorScore.py +7 -1
- validmind/tests/model_validation/ModelPredictionResiduals.py +5 -1
- validmind/tests/model_validation/RegardScore.py +6 -1
- validmind/tests/model_validation/RegressionResidualsPlot.py +10 -1
- validmind/tests/model_validation/RougeScore.py +3 -1
- validmind/tests/model_validation/TimeSeriesPredictionWithCI.py +2 -0
- validmind/tests/model_validation/TimeSeriesPredictionsPlot.py +10 -2
- validmind/tests/model_validation/TimeSeriesR2SquareBySegments.py +6 -2
- validmind/tests/model_validation/TokenDisparity.py +5 -1
- validmind/tests/model_validation/ToxicityScore.py +3 -1
- validmind/tests/model_validation/embeddings/ClusterDistribution.py +1 -1
- validmind/tests/model_validation/embeddings/CosineSimilarityComparison.py +5 -1
- validmind/tests/model_validation/embeddings/CosineSimilarityDistribution.py +5 -1
- validmind/tests/model_validation/embeddings/CosineSimilarityHeatmap.py +5 -1
- validmind/tests/model_validation/embeddings/DescriptiveAnalytics.py +2 -0
- validmind/tests/model_validation/embeddings/EmbeddingsVisualization2D.py +5 -1
- validmind/tests/model_validation/embeddings/EuclideanDistanceComparison.py +6 -2
- validmind/tests/model_validation/embeddings/EuclideanDistanceHeatmap.py +3 -1
- validmind/tests/model_validation/embeddings/PCAComponentsPairwisePlots.py +4 -1
- validmind/tests/model_validation/embeddings/StabilityAnalysisKeyword.py +5 -1
- validmind/tests/model_validation/embeddings/StabilityAnalysisRandomNoise.py +5 -1
- validmind/tests/model_validation/embeddings/StabilityAnalysisSynonyms.py +5 -1
- validmind/tests/model_validation/embeddings/StabilityAnalysisTranslation.py +5 -1
- validmind/tests/model_validation/embeddings/TSNEComponentsPairwisePlots.py +6 -1
- validmind/tests/model_validation/embeddings/utils.py +6 -9
- validmind/tests/model_validation/ragas/AnswerCorrectness.py +1 -1
- validmind/tests/model_validation/ragas/AspectCritic.py +4 -1
- validmind/tests/model_validation/ragas/ContextEntityRecall.py +1 -1
- validmind/tests/model_validation/ragas/ContextPrecision.py +1 -1
- validmind/tests/model_validation/ragas/ContextPrecisionWithoutReference.py +1 -1
- validmind/tests/model_validation/ragas/ContextRecall.py +1 -1
- validmind/tests/model_validation/ragas/Faithfulness.py +1 -1
- validmind/tests/model_validation/ragas/NoiseSensitivity.py +1 -1
- validmind/tests/model_validation/ragas/ResponseRelevancy.py +1 -1
- validmind/tests/model_validation/ragas/SemanticSimilarity.py +1 -1
- validmind/tests/model_validation/ragas/utils.py +8 -7
- validmind/tests/model_validation/sklearn/AdjustedMutualInformation.py +9 -9
- validmind/tests/model_validation/sklearn/AdjustedRandIndex.py +9 -9
- validmind/tests/model_validation/sklearn/CalibrationCurve.py +5 -2
- validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.py +15 -2
- validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.py +5 -1
- validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.py +24 -14
- validmind/tests/model_validation/sklearn/CompletenessScore.py +8 -9
- validmind/tests/model_validation/sklearn/ConfusionMatrix.py +22 -3
- validmind/tests/model_validation/sklearn/FeatureImportance.py +6 -2
- validmind/tests/model_validation/sklearn/FowlkesMallowsScore.py +12 -9
- validmind/tests/model_validation/sklearn/HomogeneityScore.py +14 -9
- validmind/tests/model_validation/sklearn/HyperParametersTuning.py +4 -2
- validmind/tests/model_validation/sklearn/KMeansClustersOptimization.py +6 -1
- validmind/tests/model_validation/sklearn/MinimumAccuracy.py +12 -7
- validmind/tests/model_validation/sklearn/MinimumF1Score.py +12 -7
- validmind/tests/model_validation/sklearn/MinimumROCAUCScore.py +18 -7
- validmind/tests/model_validation/sklearn/OverfitDiagnosis.py +8 -2
- validmind/tests/model_validation/sklearn/PermutationFeatureImportance.py +5 -1
- validmind/tests/model_validation/sklearn/PopulationStabilityIndex.py +5 -1
- validmind/tests/model_validation/sklearn/PrecisionRecallCurve.py +6 -1
- validmind/tests/model_validation/sklearn/ROCCurve.py +3 -1
- validmind/tests/model_validation/sklearn/RegressionErrors.py +6 -2
- validmind/tests/model_validation/sklearn/RegressionPerformance.py +13 -8
- validmind/tests/model_validation/sklearn/RegressionR2Square.py +8 -5
- validmind/tests/model_validation/sklearn/RobustnessDiagnosis.py +5 -1
- validmind/tests/model_validation/sklearn/SHAPGlobalImportance.py +6 -1
- validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.py +10 -2
- validmind/tests/model_validation/sklearn/SilhouettePlot.py +5 -1
- validmind/tests/model_validation/sklearn/VMeasure.py +12 -9
- validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.py +5 -1
- validmind/tests/model_validation/statsmodels/DurbinWatsonTest.py +6 -1
- validmind/tests/model_validation/statsmodels/GINITable.py +8 -1
- validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.py +2 -2
- validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.py +6 -2
- validmind/tests/model_validation/statsmodels/RegressionCoeffs.py +8 -2
- validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.py +3 -1
- validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.py +7 -2
- validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.py +2 -0
- validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.py +2 -0
- validmind/tests/model_validation/statsmodels/RegressionModelSummary.py +11 -9
- validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.py +3 -1
- validmind/tests/ongoing_monitoring/CalibrationCurveDrift.py +11 -1
- validmind/tests/ongoing_monitoring/ClassificationAccuracyDrift.py +10 -2
- validmind/tests/ongoing_monitoring/ConfusionMatrixDrift.py +8 -1
- validmind/tests/ongoing_monitoring/CumulativePredictionProbabilitiesDrift.py +18 -2
- validmind/tests/ongoing_monitoring/FeatureDrift.py +9 -2
- validmind/tests/ongoing_monitoring/PredictionAcrossEachFeature.py +8 -2
- validmind/tests/ongoing_monitoring/PredictionCorrelation.py +13 -2
- validmind/tests/ongoing_monitoring/PredictionProbabilitiesHistogramDrift.py +13 -2
- validmind/tests/ongoing_monitoring/ROCCurveDrift.py +16 -2
- validmind/tests/ongoing_monitoring/ScoreBandsDrift.py +11 -2
- validmind/tests/ongoing_monitoring/TargetPredictionDistributionPlot.py +13 -2
- validmind/tests/prompt_validation/Clarity.py +1 -1
- validmind/tests/prompt_validation/NegativeInstruction.py +1 -1
- validmind/tests/prompt_validation/Robustness.py +6 -1
- validmind/tests/prompt_validation/Specificity.py +1 -1
- validmind/tests/prompt_validation/ai_powered_test.py +5 -4
- validmind/tests/run.py +5 -1
- validmind/utils.py +13 -0
- validmind/vm_models/result/result.py +43 -2
- {validmind-2.7.12.dist-info → validmind-2.8.12.dist-info}/METADATA +3 -2
- {validmind-2.7.12.dist-info → validmind-2.8.12.dist-info}/RECORD +158 -163
- validmind/ai/test_result_description/config.yaml +0 -29
- validmind/ai/test_result_description/context.py +0 -73
- validmind/ai/test_result_description/image_processing.py +0 -124
- validmind/ai/test_result_description/system.jinja +0 -39
- validmind/ai/test_result_description/user.jinja +0 -30
- {validmind-2.7.12.dist-info → validmind-2.8.12.dist-info}/LICENSE +0 -0
- {validmind-2.7.12.dist-info → validmind-2.8.12.dist-info}/WHEEL +0 -0
- {validmind-2.7.12.dist-info → validmind-2.8.12.dist-info}/entry_points.txt +0 -0
@@ -8,7 +8,7 @@ import numpy as np
|
|
8
8
|
import plotly.graph_objects as go
|
9
9
|
from sklearn.metrics import roc_auc_score, roc_curve
|
10
10
|
|
11
|
-
from validmind import tags, tasks
|
11
|
+
from validmind import RawData, tags, tasks
|
12
12
|
from validmind.errors import SkipTestError
|
13
13
|
from validmind.vm_models import VMDataset, VMModel
|
14
14
|
|
@@ -147,4 +147,18 @@ def ROCCurveDrift(datasets: List[VMDataset], model: VMModel):
|
|
147
147
|
height=500,
|
148
148
|
)
|
149
149
|
|
150
|
-
return
|
150
|
+
return (
|
151
|
+
fig1,
|
152
|
+
fig2,
|
153
|
+
RawData(
|
154
|
+
fpr_ref=fpr_ref,
|
155
|
+
tpr_ref=tpr_ref,
|
156
|
+
auc_ref=auc_ref,
|
157
|
+
fpr_mon=fpr_mon,
|
158
|
+
tpr_mon=tpr_mon,
|
159
|
+
auc_mon=auc_mon,
|
160
|
+
model=model.input_id,
|
161
|
+
dataset_reference=datasets[0].input_id,
|
162
|
+
dataset_monitoring=datasets[1].input_id,
|
163
|
+
),
|
164
|
+
)
|
@@ -7,7 +7,7 @@ from typing import List
|
|
7
7
|
import numpy as np
|
8
8
|
import pandas as pd
|
9
9
|
|
10
|
-
from validmind import tags, tasks
|
10
|
+
from validmind import RawData, tags, tasks
|
11
11
|
from validmind.vm_models import VMDataset, VMModel
|
12
12
|
|
13
13
|
|
@@ -209,4 +209,13 @@ def ScoreBandsDrift(
|
|
209
209
|
tables[table_name] = pd.DataFrame(rows)
|
210
210
|
all_passed &= metric_passed
|
211
211
|
|
212
|
-
|
212
|
+
# Collect raw data
|
213
|
+
raw_data = RawData(
|
214
|
+
ref_results=ref_results,
|
215
|
+
mon_results=mon_results,
|
216
|
+
model=model.input_id,
|
217
|
+
dataset_reference=datasets[0].input_id,
|
218
|
+
dataset_monitoring=datasets[1].input_id,
|
219
|
+
)
|
220
|
+
|
221
|
+
return tables, all_passed, raw_data
|
@@ -7,7 +7,7 @@ import plotly.figure_factory as ff
|
|
7
7
|
import plotly.graph_objects as go
|
8
8
|
from scipy.stats import kurtosis, skew
|
9
9
|
|
10
|
-
from validmind import tags, tasks
|
10
|
+
from validmind import RawData, tags, tasks
|
11
11
|
|
12
12
|
|
13
13
|
@tags("visualization")
|
@@ -142,4 +142,15 @@ def TargetPredictionDistributionPlot(datasets, model, drift_pct_threshold=20):
|
|
142
142
|
|
143
143
|
pass_fail_bool = (moments["Pass/Fail"] == "Pass").all()
|
144
144
|
|
145
|
-
return (
|
145
|
+
return (
|
146
|
+
{"Distribution Moments": moments},
|
147
|
+
fig,
|
148
|
+
pass_fail_bool,
|
149
|
+
RawData(
|
150
|
+
pred_ref=pred_ref,
|
151
|
+
pred_monitor=pred_monitor,
|
152
|
+
model=model.input_id,
|
153
|
+
dataset_reference=datasets[0].input_id,
|
154
|
+
dataset_monitoring=datasets[1].input_id,
|
155
|
+
),
|
156
|
+
)
|
@@ -130,5 +130,10 @@ def Robustness(model, dataset, num_tests=10):
|
|
130
130
|
return (
|
131
131
|
results,
|
132
132
|
all(result["Pass/Fail"] == "Pass" for result in results),
|
133
|
-
RawData(
|
133
|
+
RawData(
|
134
|
+
generated_inputs=generated_inputs,
|
135
|
+
responses=responses,
|
136
|
+
model=model.input_id,
|
137
|
+
dataset=dataset.input_id,
|
138
|
+
),
|
134
139
|
)
|
@@ -4,8 +4,7 @@
|
|
4
4
|
|
5
5
|
import re
|
6
6
|
|
7
|
-
from validmind.ai.utils import get_client_and_model
|
8
|
-
from validmind.client_config import client_config
|
7
|
+
from validmind.ai.utils import get_client_and_model, is_configured
|
9
8
|
|
10
9
|
missing_prompt_message = """
|
11
10
|
Cannot run prompt validation tests on a model with no prompt.
|
@@ -25,9 +24,11 @@ def call_model(
|
|
25
24
|
system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42
|
26
25
|
):
|
27
26
|
"""Call LLM with the given prompts and return the response"""
|
28
|
-
if not
|
27
|
+
if not is_configured():
|
29
28
|
raise ValueError(
|
30
|
-
"LLM
|
29
|
+
"LLM is not configured. Please set an `OPENAI_API_KEY` environment variable "
|
30
|
+
"or ensure that you are connected to the ValidMind API and ValidMind AI is "
|
31
|
+
"enabled for your account."
|
31
32
|
)
|
32
33
|
|
33
34
|
client, model = get_client_and_model()
|
validmind/tests/run.py
CHANGED
@@ -256,7 +256,7 @@ def _run_comparison_test(
|
|
256
256
|
combined_outputs, combined_inputs, combined_params = combine_results(results)
|
257
257
|
|
258
258
|
return build_test_result(
|
259
|
-
outputs=
|
259
|
+
outputs=combined_outputs,
|
260
260
|
test_id=test_id,
|
261
261
|
test_doc=test_doc,
|
262
262
|
inputs=combined_inputs,
|
@@ -400,5 +400,9 @@ def run_test( # noqa: C901
|
|
400
400
|
|
401
401
|
|
402
402
|
def print_env():
|
403
|
+
"""Prints a log of the running environment for debugging.
|
404
|
+
|
405
|
+
Output includes: ValidMind Library version, operating system details, installed dependencies, and the ISO 8601 timestamp at log creation.
|
406
|
+
"""
|
403
407
|
e = _get_run_metadata()
|
404
408
|
pprint.pp(e)
|
validmind/utils.py
CHANGED
@@ -60,6 +60,19 @@ pylab.rcParams.update(params)
|
|
60
60
|
logger = get_logger(__name__)
|
61
61
|
|
62
62
|
|
63
|
+
def parse_version(version: str) -> tuple[int, ...]:
|
64
|
+
"""
|
65
|
+
Parse a semver version string into a tuple of major, minor, patch integers
|
66
|
+
|
67
|
+
Args:
|
68
|
+
version (str): The semantic version string to parse
|
69
|
+
|
70
|
+
Returns:
|
71
|
+
tuple[int, ...]: A tuple of major, minor, patch integers
|
72
|
+
"""
|
73
|
+
return tuple(int(x) for x in version.split(".")[:3])
|
74
|
+
|
75
|
+
|
63
76
|
def is_notebook() -> bool:
|
64
77
|
"""
|
65
78
|
Checks if the code is running in a Jupyter notebook or IPython shell
|
@@ -171,6 +171,7 @@ class TestResult(Result):
|
|
171
171
|
metadata: Optional[Dict[str, Any]] = None
|
172
172
|
_was_description_generated: bool = False
|
173
173
|
_unsafe: bool = False
|
174
|
+
_client_config_cache: Optional[Any] = None
|
174
175
|
|
175
176
|
def __post_init__(self):
|
176
177
|
if self.ref_id is None:
|
@@ -329,13 +330,50 @@ class TestResult(Result):
|
|
329
330
|
|
330
331
|
return VBox(widgets)
|
331
332
|
|
333
|
+
@classmethod
|
334
|
+
def _get_client_config(cls):
|
335
|
+
"""Get the client config, loading it if not cached"""
|
336
|
+
if cls._client_config_cache is None:
|
337
|
+
api_client.reload()
|
338
|
+
cls._client_config_cache = api_client.client_config
|
339
|
+
|
340
|
+
if cls._client_config_cache is None:
|
341
|
+
raise ValueError(
|
342
|
+
"Failed to load client config: api_client.client_config is None"
|
343
|
+
)
|
344
|
+
|
345
|
+
if not hasattr(cls._client_config_cache, "documentation_template"):
|
346
|
+
raise ValueError(
|
347
|
+
"Invalid client config: missing documentation_template"
|
348
|
+
)
|
349
|
+
|
350
|
+
return cls._client_config_cache
|
351
|
+
|
352
|
+
def check_result_id_exist(self):
|
353
|
+
"""Check if the result_id exists in any test block across all sections"""
|
354
|
+
client_config = self._get_client_config()
|
355
|
+
|
356
|
+
# Iterate through all sections
|
357
|
+
for section in client_config.documentation_template["sections"]:
|
358
|
+
blocks = section.get("contents", [])
|
359
|
+
# Check each block in the section
|
360
|
+
for block in blocks:
|
361
|
+
if (
|
362
|
+
block.get("content_type") == "test"
|
363
|
+
and block.get("content_id") == self.result_id
|
364
|
+
):
|
365
|
+
return
|
366
|
+
|
367
|
+
logger.info(
|
368
|
+
f"Test driven block with result_id {self.result_id} does not exist in model's document"
|
369
|
+
)
|
370
|
+
|
332
371
|
def _validate_section_id_for_block(
|
333
372
|
self, section_id: str, position: Union[int, None] = None
|
334
373
|
):
|
335
374
|
"""Validate the section_id exits on the template before logging"""
|
336
|
-
|
375
|
+
client_config = self._get_client_config()
|
337
376
|
found = False
|
338
|
-
client_config = api_client.client_config
|
339
377
|
|
340
378
|
for section in client_config.documentation_template["sections"]:
|
341
379
|
if section["id"] == section_id:
|
@@ -440,6 +478,9 @@ class TestResult(Result):
|
|
440
478
|
unsafe (bool): If True, log the result even if it contains sensitive data
|
441
479
|
i.e. raw data from input datasets
|
442
480
|
"""
|
481
|
+
|
482
|
+
self.check_result_id_exist()
|
483
|
+
|
443
484
|
if not unsafe:
|
444
485
|
for table in self.tables or []:
|
445
486
|
check_for_sensitive_data(table.data, self._get_flat_inputs())
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: validmind
|
3
|
-
Version: 2.
|
3
|
+
Version: 2.8.12
|
4
4
|
Summary: ValidMind Library
|
5
5
|
License: Commercial License
|
6
6
|
Author: Andres Rodriguez
|
@@ -131,6 +131,7 @@ The ValidMind Library has optional dependencies that can be installed separately
|
|
131
131
|
- **R Models**: To use R models with the ValidMind Library, install the `r` extra:
|
132
132
|
|
133
133
|
```bash
|
134
|
-
pip install validmind
|
134
|
+
pip install validmind
|
135
|
+
pip install rpy2
|
135
136
|
```
|
136
137
|
|