validmind 2.7.2__py3-none-any.whl → 2.7.4__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 (25) hide show
  1. validmind/__version__.py +1 -1
  2. validmind/ai/test_descriptions.py +20 -4
  3. validmind/ai/test_result_description/user.jinja +5 -0
  4. validmind/datasets/credit_risk/lending_club.py +444 -14
  5. validmind/tests/data_validation/MutualInformation.py +129 -0
  6. validmind/tests/data_validation/ScoreBandDefaultRates.py +139 -0
  7. validmind/tests/data_validation/TooManyZeroValues.py +6 -5
  8. validmind/tests/data_validation/UniqueRows.py +3 -1
  9. validmind/tests/decorator.py +18 -16
  10. validmind/tests/model_validation/sklearn/CalibrationCurve.py +116 -0
  11. validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.py +261 -0
  12. validmind/tests/model_validation/sklearn/ConfusionMatrix.py +1 -0
  13. validmind/tests/model_validation/sklearn/HyperParametersTuning.py +144 -56
  14. validmind/tests/model_validation/sklearn/ModelParameters.py +74 -0
  15. validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.py +130 -0
  16. validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.py +5 -6
  17. validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.py +2 -3
  18. validmind/tests/run.py +43 -72
  19. validmind/utils.py +23 -7
  20. validmind/vm_models/result/result.py +18 -17
  21. {validmind-2.7.2.dist-info → validmind-2.7.4.dist-info}/METADATA +1 -1
  22. {validmind-2.7.2.dist-info → validmind-2.7.4.dist-info}/RECORD +25 -19
  23. {validmind-2.7.2.dist-info → validmind-2.7.4.dist-info}/LICENSE +0 -0
  24. {validmind-2.7.2.dist-info → validmind-2.7.4.dist-info}/WHEEL +0 -0
  25. {validmind-2.7.2.dist-info → validmind-2.7.4.dist-info}/entry_points.txt +0 -0
validmind/tests/run.py CHANGED
@@ -134,11 +134,9 @@ def _get_test_kwargs(
134
134
  def build_test_result(
135
135
  outputs: Union[Any, Tuple[Any, ...]],
136
136
  test_id: str,
137
+ test_doc: str,
137
138
  inputs: Dict[str, Union[VMInput, List[VMInput]]],
138
139
  params: Union[Dict[str, Any], None],
139
- doc: str,
140
- description: str,
141
- generate_description: bool = True,
142
140
  title: Optional[str] = None,
143
141
  ):
144
142
  """Build a TestResult object from a set of raw test function outputs"""
@@ -150,7 +148,7 @@ def build_test_result(
150
148
  ref_id=ref_id,
151
149
  inputs=inputs,
152
150
  params=params if params else None, # None if empty dict or None
153
- doc=doc,
151
+ doc=test_doc,
154
152
  )
155
153
 
156
154
  if not isinstance(outputs, tuple):
@@ -159,16 +157,6 @@ def build_test_result(
159
157
  for item in outputs:
160
158
  process_output(item, result)
161
159
 
162
- result.description = get_result_description(
163
- test_id=test_id,
164
- test_description=description,
165
- tables=result.tables,
166
- figures=result.figures,
167
- metric=result.metric,
168
- should_generate=generate_description,
169
- title=title,
170
- )
171
-
172
160
  return result
173
161
 
174
162
 
@@ -179,7 +167,6 @@ def _run_composite_test(
179
167
  input_grid: Union[Dict[str, List[Any]], List[Dict[str, Any]], None],
180
168
  params: Union[Dict[str, Any], None],
181
169
  param_grid: Union[Dict[str, List[Any]], List[Dict[str, Any]], None],
182
- generate_description: bool,
183
170
  title: Optional[str] = None,
184
171
  ):
185
172
  """Run a composite test i.e. a test made up of multiple metrics"""
@@ -201,9 +188,12 @@ def _run_composite_test(
201
188
  if not all(result.metric is not None for result in results):
202
189
  raise ValueError("All tests must return a metric when used as a composite test")
203
190
 
204
- # Create composite doc from all test results
191
+ # Create composite docstring from all test results
205
192
  composite_doc = "\n\n".join(
206
- [f"{test_id_to_name(result.result_id)}:\n{result.doc}" for result in results]
193
+ [
194
+ f"{test_id_to_name(result.result_id)}:\n{_test_description(result.doc)}"
195
+ for result in results
196
+ ]
207
197
  )
208
198
 
209
199
  return build_test_result(
@@ -215,13 +205,9 @@ def _run_composite_test(
215
205
  for result in results
216
206
  ], # pass in a single table with metric values as our 'outputs'
217
207
  test_id=test_id,
208
+ test_doc=composite_doc,
218
209
  inputs=results[0].inputs,
219
210
  params=results[0].params,
220
- doc=composite_doc,
221
- description="\n\n".join(
222
- [_test_description(result.description, num_lines=1) for result in results]
223
- ), # join truncated (first line only) test descriptions
224
- generate_description=generate_description,
225
211
  title=title,
226
212
  )
227
213
 
@@ -234,7 +220,6 @@ def _run_comparison_test(
234
220
  input_grid: Union[Dict[str, List[Any]], List[Dict[str, Any]], None],
235
221
  params: Union[Dict[str, Any], None],
236
222
  param_grid: Union[Dict[str, List[Any]], List[Dict[str, Any]], None],
237
- generate_description: bool,
238
223
  title: Optional[str] = None,
239
224
  ):
240
225
  """Run a comparison test i.e. a test that compares multiple outputs of a test across
@@ -263,35 +248,43 @@ def _run_comparison_test(
263
248
  # composite tests have a test_id thats built from the name
264
249
  if not test_id:
265
250
  test_id = results[0].result_id
266
- description = results[0].description
251
+ test_doc = results[0].doc
267
252
  else:
268
- description = describe_test(test_id, raw=True)["Description"]
253
+ test_doc = describe_test(test_id, raw=True)["Description"]
269
254
 
270
255
  combined_outputs, combined_inputs, combined_params = combine_results(results)
271
256
 
272
- if unit_metrics:
273
- doc = "\n\n".join(
274
- [
275
- f"{test_id_to_name(unit_metric)}:\n{getdoc(load_test(unit_metric))}"
276
- for unit_metric in unit_metrics
277
- ]
278
- )
279
- else:
280
- doc = getdoc(load_test(test_id))
281
-
282
257
  return build_test_result(
283
258
  outputs=tuple(combined_outputs),
284
259
  test_id=test_id,
260
+ test_doc=test_doc,
285
261
  inputs=combined_inputs,
286
262
  params=combined_params,
287
- doc=doc,
288
- description=description,
289
- generate_description=generate_description,
290
263
  title=title,
291
264
  )
292
265
 
293
266
 
294
- def run_test(
267
+ def _run_test(test_id: TestID, inputs: Dict[str, Any], params: Dict[str, Any]):
268
+ """Run a standard test and return a TestResult object"""
269
+ test_func = load_test(test_id)
270
+ input_kwargs, param_kwargs = _get_test_kwargs(
271
+ test_func=test_func,
272
+ inputs=inputs or {},
273
+ params=params or {},
274
+ )
275
+
276
+ raw_result = test_func(**input_kwargs, **param_kwargs)
277
+
278
+ return build_test_result(
279
+ outputs=raw_result,
280
+ test_id=test_id,
281
+ test_doc=getdoc(test_func),
282
+ inputs=input_kwargs,
283
+ params=param_kwargs,
284
+ )
285
+
286
+
287
+ def run_test( # noqa: C901
295
288
  test_id: Union[TestID, None] = None,
296
289
  name: Union[str, None] = None,
297
290
  unit_metrics: Union[List[TestID], None] = None,
@@ -364,7 +357,6 @@ def run_test(
364
357
  input_grid=input_grid,
365
358
  params=params,
366
359
  param_grid=param_grid,
367
- generate_description=generate_description,
368
360
  )
369
361
 
370
362
  elif unit_metrics:
@@ -378,42 +370,11 @@ def run_test(
378
370
  input_grid=input_grid,
379
371
  params=params,
380
372
  param_grid=param_grid,
381
- generate_description=generate_description,
382
- title=title,
383
- )
384
-
385
- elif input_grid or param_grid:
386
- result = _run_comparison_test(
387
- test_id=test_id,
388
- inputs=inputs,
389
- input_grid=input_grid,
390
- params=params,
391
- param_grid=param_grid,
392
- generate_description=generate_description,
393
373
  title=title,
394
374
  )
395
375
 
396
376
  else:
397
- test_func = load_test(test_id)
398
-
399
- input_kwargs, param_kwargs = _get_test_kwargs(
400
- test_func, inputs or {}, params or {}
401
- )
402
-
403
- raw_result = test_func(**input_kwargs, **param_kwargs)
404
-
405
- doc = getdoc(test_func)
406
-
407
- result = build_test_result(
408
- outputs=raw_result,
409
- test_id=test_id,
410
- inputs=input_kwargs,
411
- params=param_kwargs,
412
- doc=doc,
413
- description=doc,
414
- generate_description=generate_description,
415
- title=title,
416
- )
377
+ result = _run_test(test_id, inputs, params)
417
378
 
418
379
  end_time = time.perf_counter()
419
380
  result.metadata = _get_run_metadata(duration_seconds=end_time - start_time)
@@ -421,6 +382,16 @@ def run_test(
421
382
  if post_process_fn:
422
383
  result = post_process_fn(result)
423
384
 
385
+ result.description = get_result_description(
386
+ test_id=test_id,
387
+ test_description=result.doc,
388
+ tables=result.tables,
389
+ figures=result.figures,
390
+ metric=result.metric,
391
+ should_generate=generate_description,
392
+ title=title,
393
+ )
394
+
424
395
  if show:
425
396
  result.show()
426
397
 
validmind/utils.py CHANGED
@@ -459,18 +459,23 @@ def get_dataset_info(dataset):
459
459
 
460
460
 
461
461
  def preview_test_config(config):
462
- formatted_json = json.dumps(config, indent=4)
462
+ """Preview test configuration in a collapsible HTML section.
463
+
464
+ Args:
465
+ config (dict): Test configuration dictionary
466
+ """
467
+
468
+ try:
469
+ formatted_json = json.dumps(serialize(config), indent=4)
470
+ except TypeError as e:
471
+ logger.error(f"JSON serialization failed: {e}")
472
+ return
463
473
 
464
- # JavaScript + HTML for the collapsible section
465
474
  collapsible_html = f"""
466
475
  <script>
467
476
  function toggleOutput() {{
468
477
  var content = document.getElementById("collapsibleContent");
469
- if (content.style.display === "none") {{
470
- content.style.display = "block";
471
- }} else {{
472
- content.style.display = "none";
473
- }}
478
+ content.style.display = content.style.display === "none" ? "block" : "none";
474
479
  }}
475
480
  </script>
476
481
  <button onclick="toggleOutput()">Preview Config</button>
@@ -556,3 +561,14 @@ def inspect_obj(obj):
556
561
  # Loop through the parameters and print detailed information
557
562
  for param_name, param in sig.parameters.items():
558
563
  print(f"{param_name} - ({param.default})")
564
+
565
+
566
+ def serialize(obj):
567
+ """Convert objects to JSON-serializable format with readable descriptions."""
568
+ if isinstance(obj, dict):
569
+ return {k: serialize(v) for k, v in obj.items()}
570
+ elif isinstance(obj, (list, tuple)):
571
+ return [serialize(x) for x in obj]
572
+ elif isinstance(obj, (pd.DataFrame, pd.Series)):
573
+ return "" # Simple empty string for non-serializable objects
574
+ return obj
@@ -172,10 +172,9 @@ class TestResult(Result):
172
172
  _was_description_generated: bool = False
173
173
  _unsafe: bool = False
174
174
 
175
- @property
176
- def test_name(self) -> str:
177
- """Get the test name, using custom title if available."""
178
- return self.title or test_id_to_name(self.result_id)
175
+ def __post_init__(self):
176
+ if self.ref_id is None:
177
+ self.ref_id = str(uuid4())
179
178
 
180
179
  def __repr__(self) -> str:
181
180
  attrs = [
@@ -199,9 +198,21 @@ class TestResult(Result):
199
198
 
200
199
  return f'TestResult("{self.result_id}", {", ".join(attrs)})'
201
200
 
202
- def __post_init__(self):
203
- if self.ref_id is None:
204
- self.ref_id = str(uuid4())
201
+ def __getattribute__(self, name):
202
+ # lazy load description if its a DescriptionFuture (generated in background)
203
+ if name == "description":
204
+ description = super().__getattribute__("description")
205
+
206
+ if isinstance(description, DescriptionFuture):
207
+ self._was_description_generated = True
208
+ self.description = description.get_description()
209
+
210
+ return super().__getattribute__(name)
211
+
212
+ @property
213
+ def test_name(self) -> str:
214
+ """Get the test name, using custom title if available."""
215
+ return self.title or test_id_to_name(self.result_id)
205
216
 
206
217
  def _get_flat_inputs(self):
207
218
  # remove duplicates by `input_id`
@@ -292,10 +303,6 @@ class TestResult(Result):
292
303
  self.figures.pop(index)
293
304
 
294
305
  def to_widget(self):
295
- if isinstance(self.description, DescriptionFuture):
296
- self.description = self.description.get_description()
297
- self._was_description_generated = True
298
-
299
306
  if self.metric is not None and not self.tables and not self.figures:
300
307
  return HTML(f"<h3>{self.test_name}: <code>{self.metric}</code></h3>")
301
308
 
@@ -310,8 +317,6 @@ class TestResult(Result):
310
317
  ),
311
318
  "show_metric": self.metric is not None,
312
319
  "metric": self.metric,
313
- "tables": self.tables,
314
- "figures": self.figures,
315
320
  }
316
321
  rendered = get_result_template().render(**template_data)
317
322
 
@@ -409,10 +414,6 @@ class TestResult(Result):
409
414
  )
410
415
 
411
416
  if self.description:
412
- if isinstance(self.description, DescriptionFuture):
413
- self.description = self.description.get_description()
414
- self._was_description_generated = True
415
-
416
417
  revision_name = (
417
418
  AI_REVISION_NAME
418
419
  if self._was_description_generated
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: validmind
3
- Version: 2.7.2
3
+ Version: 2.7.4
4
4
  Summary: ValidMind Library
5
5
  License: Commercial License
6
6
  Author: Andres Rodriguez
@@ -1,11 +1,11 @@
1
1
  validmind/__init__.py,sha256=U-S6pV31O3sVsbcEzlriz0tootyfvPnPOu4PHzXz9tM,2688
2
- validmind/__version__.py,sha256=H1WLrviWKvrPzDle8EWdCYYkzljxs0mtbXigYc-xaKA,22
3
- validmind/ai/test_descriptions.py,sha256=IlnRSNqbddpVbWoPldPrlpFldn0hGUsKUp0RBixu6j4,6914
2
+ validmind/__version__.py,sha256=yLdxKZXyzrDqew_33G4dvZoqgGxRCyEx9vhYW3y2Je4,22
3
+ validmind/ai/test_descriptions.py,sha256=OpdMyLkZqlvegxjKfg2iJ0o4PwjnRv4_kEzePyuQiYs,7345
4
4
  validmind/ai/test_result_description/config.yaml,sha256=E1gPd-uv-MzdrWZA_rP6LSk8pVmkYijx6v78hZ8ceL0,787
5
5
  validmind/ai/test_result_description/context.py,sha256=ebKulFMpXTDLqd6lOHAsG200GmLNnhnu7sMDnbo2Dhc,2339
6
6
  validmind/ai/test_result_description/image_processing.py,sha256=JNaO1zyM9293WWuyzUp1meQQbHuut0XN4kKUGzQTwYY,4061
7
7
  validmind/ai/test_result_description/system.jinja,sha256=BjMvZCC3UXEH8p3VPpnHtGjhnqnbNcEG2_kYZ_QZrgg,2358
8
- validmind/ai/test_result_description/user.jinja,sha256=kyWJK9RcBKvtPf6O2rEzCAHAdUFEIlAwK-exLhtoPRI,630
8
+ validmind/ai/test_result_description/user.jinja,sha256=CmqPQQiqdXjxtq47wFCZ-IT5csliWsRVM04psKxzXc4,689
9
9
  validmind/ai/utils.py,sha256=YHqXtmACjcL5imDS9_nzmz8MhQJzK3VybcDXMbj1SbQ,4168
10
10
  validmind/api_client.py,sha256=NYIMQdFvxeSKIPaguaJMoyJDGUW5xljhtCZbAGIDs_Y,14463
11
11
  validmind/client.py,sha256=lOv4lSZGDOUMxOa2FpNgAiT_GaEolffZTfvljewhl2I,18595
@@ -20,7 +20,7 @@ validmind/datasets/cluster/digits.py,sha256=E600pX6QPrqndfr73kwZ1sTNk0hC5kNj4Fhs
20
20
  validmind/datasets/credit_risk/__init__.py,sha256=vK0wyUcA2mpjasNR-EaBj_0MdPhJw5KK8xlrKj_xl68,295
21
21
  validmind/datasets/credit_risk/datasets/lending_club_biased.csv.gz,sha256=PdsyEqHtfShtfl_xoNWva2Ofyfx5hmrLhowPka4hLew,6266192
22
22
  validmind/datasets/credit_risk/datasets/lending_club_loan_data_2007_2014_clean.csv.gz,sha256=bAgdfmUxjYOdZMPvoHtKr_GLoXNAX04KUTfjn2L62eE,5493810
23
- validmind/datasets/credit_risk/lending_club.py,sha256=oscdu1zmDytSU6dJwinl97si4LDdzMBTFUgiJialRmE,11403
23
+ validmind/datasets/credit_risk/lending_club.py,sha256=vBqEx3pK1Q7WpRIHRg692FcgJOv_Z1G7UprhlOPdlfE,25547
24
24
  validmind/datasets/credit_risk/lending_club_bias.py,sha256=8_Xf1qxCTUPv1wYHYkjabO2WtQsfVudJ6eje3phQUrc,4461
25
25
  validmind/datasets/llm/rag/__init__.py,sha256=v8BygB6rGECoMIXv2_I1lVUAfPJ_gVo0GgVKhzk60h4,264
26
26
  validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_1.csv,sha256=8Ae8TD5Yh6rQ67HMCu7iKipj5tyOOhzylZqLppAeKzs,24095
@@ -123,6 +123,7 @@ validmind/tests/data_validation/LJungBox.py,sha256=8ujAg7ZcEYquYxHEqBZkD8otBnSpu
123
123
  validmind/tests/data_validation/LaggedCorrelationHeatmap.py,sha256=xSDlstwZ9AUuz8uDA_pbRGQcIvk5pGdnGVZyy0rOLO8,4492
124
124
  validmind/tests/data_validation/MissingValues.py,sha256=yrw9sxXBzWKWq4D4kjKCkR5QZQO2pPF8W-BFNhSvaOM,2829
125
125
  validmind/tests/data_validation/MissingValuesBarPlot.py,sha256=_oE0S63Kd3XcPkv4pAnyeAp7V4oZRx6XugIFnmZNoWU,5397
126
+ validmind/tests/data_validation/MutualInformation.py,sha256=GYQrJCKk16GXMrGlkDMHlMnY_jF4E_XN5qhKcq8LvUA,4748
126
127
  validmind/tests/data_validation/PearsonCorrelationMatrix.py,sha256=GB8Ca8UT4ARBV7Oeha53UL0aTOrvUrwrwsJHKYeEL74,3797
127
128
  validmind/tests/data_validation/PhillipsPerronArch.py,sha256=4abwhMBcdxTxY9aMogL5hEvCyATnvHb66mGssE1AJuk,4254
128
129
  validmind/tests/data_validation/ProtectedClassesCombination.py,sha256=YIZSgjnWKtDy5GmBsBdMiYZar6p9r2waBPSnmNEgNBA,6695
@@ -132,6 +133,7 @@ validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.py,sha256=w8n
132
133
  validmind/tests/data_validation/RollingStatsPlot.py,sha256=eA-3YIMAa7uSdOU2cudPy_5oOvrcZzKq7J4AV0SFXpo,4608
133
134
  validmind/tests/data_validation/RunsTest.py,sha256=0xbi4K86m-qL1nxQPeZIp_HWo3NiDv6MPGaeRhvL6I8,3475
134
135
  validmind/tests/data_validation/ScatterPlot.py,sha256=WeyeAq3QMY_OpzssY5S07a4Y46qiad6h2NunSVCYrQo,3423
136
+ validmind/tests/data_validation/ScoreBandDefaultRates.py,sha256=pdfvrSAP-HI3Zl8HaXXY_cc8_e5LP4OSTHEf6dcoz-s,4779
135
137
  validmind/tests/data_validation/SeasonalDecompose.py,sha256=wD76b1UJ7PPUc4VPrXDfWVqOd62EiOUXTCzeyv7BrEQ,5830
136
138
  validmind/tests/data_validation/ShapiroWilk.py,sha256=AhqJwbmKAy8lpac5ELM_hKt_60PA3DCUqO8kCgnVgQE,3132
137
139
  validmind/tests/data_validation/Skewness.py,sha256=aDPO3r4NLN1CNYQsAdJJUEpdOWSmt26FGZPmRY_FKEA,3296
@@ -148,8 +150,8 @@ validmind/tests/data_validation/TimeSeriesHistogram.py,sha256=iaOgvz1bFXFT0f3jEf
148
150
  validmind/tests/data_validation/TimeSeriesLinePlot.py,sha256=NeLL5AZ27HNOi96B0vStzQh7ZTsFDxzQrzKPwECHnIg,3553
149
151
  validmind/tests/data_validation/TimeSeriesMissingValues.py,sha256=XiUfYDviNPrCftkidlidKufQM3xjn8yxipBCW9RC2es,4445
150
152
  validmind/tests/data_validation/TimeSeriesOutliers.py,sha256=PnA26qA90qpYLzuNMIdhSpiUddR1yAlDt4VDCWhgU_o,4934
151
- validmind/tests/data_validation/TooManyZeroValues.py,sha256=xhWwJAOx66IK4myCvvl5yWWh8CEjXzn8T2BQ1G3yMMU,4192
152
- validmind/tests/data_validation/UniqueRows.py,sha256=cNaK3cMMKXvQdNZx4MA6j16t4ErCPzpEQ6vz-N3C35I,3262
153
+ validmind/tests/data_validation/TooManyZeroValues.py,sha256=NbkufcjiIRrrwo_ti66RpFB4TVh95-S2eZcwHoYgT9g,4269
154
+ validmind/tests/data_validation/UniqueRows.py,sha256=dQG6Ef3kpXnU1bCXq0GxyJ4sXbL8VkLMi8ZzfSLq6ws,3302
153
155
  validmind/tests/data_validation/WOEBinPlots.py,sha256=cfkBns4dtLZTUq-MIQQy5-dApKsMRQZXqdi926pxBpM,5700
154
156
  validmind/tests/data_validation/WOEBinTable.py,sha256=9TAHCUA4QU4GAOpQ4ugdYqU4QSO4cjz6WaVHZqa32ZQ,3302
155
157
  validmind/tests/data_validation/ZivotAndrewsArch.py,sha256=OVs4N7wuSoBL_ujMbgK7XN_Uao72psstp7L_aBwXtQY,3472
@@ -165,7 +167,7 @@ validmind/tests/data_validation/nlp/StopWords.py,sha256=Chb47T63EQMG-rgGJ1zsT72H
165
167
  validmind/tests/data_validation/nlp/TextDescription.py,sha256=k9PVKKiCDAKwj2uj_Oqqjav3nO6sKz07YR8qJ22ySUc,5668
166
168
  validmind/tests/data_validation/nlp/Toxicity.py,sha256=VyOeN2yR2OMXoaj_pBeBX5LfvgR4OdTJQe8nPEamD5A,2682
167
169
  validmind/tests/data_validation/nlp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
168
- validmind/tests/decorator.py,sha256=0SxG1RBZ9h7ZBF1863hD_iqwlvff0EioTzt9xfW-Qfw,4797
170
+ validmind/tests/decorator.py,sha256=fhHvE72FL3Doezwzk12s3dM13RWG047WHSHqPr9p2Fg,4784
169
171
  validmind/tests/load.py,sha256=V-bWhCc4cR5RYpnohKOccq4r5AOO53cr-B3qpp6mTwE,10943
170
172
  validmind/tests/model_validation/BertScore.py,sha256=nRR8lmY2ELBJlqVzKFNnOBgWOu3p27gciVb1zP85vCQ,5719
171
173
  validmind/tests/model_validation/BleuScore.py,sha256=W6XMg8aO_L09REQ3fI3w6cEZZ1MYxTMzlpXDEAApSL0,5096
@@ -212,19 +214,22 @@ validmind/tests/model_validation/ragas/SemanticSimilarity.py,sha256=yoRT7C5_J4ft
212
214
  validmind/tests/model_validation/ragas/utils.py,sha256=VCc3NcNLIwrYQ7RvuJ1ev4XhI86TKDVNzI8o12aHFHc,3363
213
215
  validmind/tests/model_validation/sklearn/AdjustedMutualInformation.py,sha256=5kk-etKeA7jfo6twQ4JVPEuNvWh0TBhhXUQL7SkrrWM,2858
214
216
  validmind/tests/model_validation/sklearn/AdjustedRandIndex.py,sha256=NCUM80CIFrV4Qm0P0wxMdf20y-BwLnPEJxOiPtv1eGk,2706
217
+ validmind/tests/model_validation/sklearn/CalibrationCurve.py,sha256=euHLyExDvgogt-OgdXDBUmojveWbM2WqGZ4FXzOdJTI,4158
215
218
  validmind/tests/model_validation/sklearn/ClassifierPerformance.py,sha256=GruRTbGbu4cpHyUwsKu5_oHxP_Ew2I8-IUtK7jEQV8M,4334
219
+ validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.py,sha256=RhzMEad4g8Mw3bBac45Wf-29SFaHfR8P_XmEnHWJ3Tc,9351
216
220
  validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.py,sha256=H79R2Nr5_OxU6dnfmISNRQ_VC39wYGluEJbe0z_b55o,4130
217
221
  validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.py,sha256=N9W17vO659vkgbHGnV-lXfeuJVCQhcphHIjam5ARmnQ,8649
218
222
  validmind/tests/model_validation/sklearn/CompletenessScore.py,sha256=oGOjSyuiQb4M8lQe5-4H5gdz6sZk4bLhdZV4g8AKLKQ,2538
219
- validmind/tests/model_validation/sklearn/ConfusionMatrix.py,sha256=ORHZUetU73UXoATc0vLWCByvIgVGNiksRarMmmZdNH8,4740
223
+ validmind/tests/model_validation/sklearn/ConfusionMatrix.py,sha256=gRLa4PlvGm7qpfUJRojSSDC0rPpd-LRmmZ6TVFrAe90,4779
220
224
  validmind/tests/model_validation/sklearn/FeatureImportance.py,sha256=JncmmQQgYFcNK-wmV8c-k1Dxxo5D8rKEkLtc5KNtxBs,3573
221
225
  validmind/tests/model_validation/sklearn/FowlkesMallowsScore.py,sha256=jrEle_3L76sxqdoP5VGnwE3ekJtIEUrYi8g8TL3b9_s,2990
222
226
  validmind/tests/model_validation/sklearn/HomogeneityScore.py,sha256=tB0CUB2S_ZUXJcnWfC_4BvdXP5KVOTdoBPu_4CAHVn0,2715
223
- validmind/tests/model_validation/sklearn/HyperParametersTuning.py,sha256=oZDm84hjmIywWBTcIaN97s_x6j0mwGLCUDt2pdxpoHU,3415
227
+ validmind/tests/model_validation/sklearn/HyperParametersTuning.py,sha256=3dHpjnoC4nPHcSmsm9QEwtFJ_lqtuNXfcGsQEp53tgw,5988
224
228
  validmind/tests/model_validation/sklearn/KMeansClustersOptimization.py,sha256=5IxGudebu5w_e3fXaRuYzcVltg4R9b6IltRh09qv5kw,5205
225
229
  validmind/tests/model_validation/sklearn/MinimumAccuracy.py,sha256=2FVtoEMUJJYUxDW6WwC5agAojtt7FUnO7nwcVaqPKao,2773
226
230
  validmind/tests/model_validation/sklearn/MinimumF1Score.py,sha256=CBOGD_wCqcHgMbKfp5TGTc1H8mJoG3RwMRSOUFHVGDc,3069
227
231
  validmind/tests/model_validation/sklearn/MinimumROCAUCScore.py,sha256=UpsCfXBbRQldkBWYuPNQ-WcerBImhGqXBusvfibu0Tw,3503
232
+ validmind/tests/model_validation/sklearn/ModelParameters.py,sha256=oI1GXG8dGIuZcwiLwOcds0Swxz2dwsmmDjfti1jbVF0,3059
228
233
  validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.py,sha256=wDxGUXgfzLA80wfjoRz7CzHO8NiQfuJyxIfuVFOuLYA,4658
229
234
  validmind/tests/model_validation/sklearn/OverfitDiagnosis.py,sha256=JM2HHEHyKIgTaRjZXRNe04aTY7JoFjoVCZAkbz6MnS8,9973
230
235
  validmind/tests/model_validation/sklearn/PermutationFeatureImportance.py,sha256=PaBsCye7mN_ZaxfoqLD07XnmkxU8Juc5V6K9tpklYUA,4094
@@ -238,18 +243,19 @@ validmind/tests/model_validation/sklearn/RegressionR2Square.py,sha256=jttavnKU1L
238
243
  validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.py,sha256=TfBL_Mnk4hWWkXXB8OHzboWYuGk0e_gHmIDscKzLx9M,3377
239
244
  validmind/tests/model_validation/sklearn/RobustnessDiagnosis.py,sha256=-hrJ7SbWK4kbOtDzV7u0_5FAUXVZAyJ5FJvYA9MFAHc,11434
240
245
  validmind/tests/model_validation/sklearn/SHAPGlobalImportance.py,sha256=8ta_2bfsECzDCJiCmO_Oc7ZC5UxWyZwGcu0IUa2RZEk,9071
246
+ validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.py,sha256=iv-Ep7FC2Lv4-Pm5t73BlTrZ9iZoi5xMbo9i4dB5sis,4380
241
247
  validmind/tests/model_validation/sklearn/SilhouettePlot.py,sha256=jUrVBRFgcvPz0Y-A6f4uk-1ewMG8p_hdAQI4NBbz4fk,4896
242
248
  validmind/tests/model_validation/sklearn/TrainingTestDegradation.py,sha256=gPxCnq1sPs0EiyRN1N9LxW1wyXU-KxOSzHOa7VAIOkk,4354
243
249
  validmind/tests/model_validation/sklearn/VMeasure.py,sha256=YpsrszR1s5MAufOzuvibBVnw9O2ebSISQweA3d06E74,2734
244
250
  validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.py,sha256=Wfb0R4f7sE761F-KU1Yw1ByyjDHHU9uC5JszXz645Gw,11465
245
251
  validmind/tests/model_validation/sklearn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
246
252
  validmind/tests/model_validation/statsmodels/AutoARIMA.py,sha256=4QNcEEY_iqt6wCzYwsBwZQ-aacZ1erX5uHbPtKmbTJk,4896
247
- validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.py,sha256=hXn0vBL-tvMR28sao1wnrnMEPl8gbl7eBYO6uW1WA-s,4625
253
+ validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.py,sha256=qyCR3Gu7t1ZVkl140lOxyc1vZbsXwzDK6CGnvLQ2UMs,4578
248
254
  validmind/tests/model_validation/statsmodels/DurbinWatsonTest.py,sha256=wY36j1-bzEUyXwmymQILXHLiI-tIKze0gI8dOMkYyyI,3632
249
255
  validmind/tests/model_validation/statsmodels/GINITable.py,sha256=voBMdMDMxfzEsolBCKDJIXUC64DV3CR5xtw35uudjT0,4276
250
256
  validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.py,sha256=vCFOpWNpdeTUKulJfp33rtC-7JzJX64tOCPo-wn69G8,3033
251
257
  validmind/tests/model_validation/statsmodels/Lilliefors.py,sha256=7sLzRqrZqzeskwqXp9_Lbjc1mel-dwqtCqQxpNz0WjY,3691
252
- validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.py,sha256=-c-FBs0QgXipWV-YQymXem9HdPx8-Fr-Yjwr4LAOm9k,4109
258
+ validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.py,sha256=zlGrTHCgVCeGslfZ6u4_w7OoTFsOrKjF2A5tPcSNR8A,3937
253
259
  validmind/tests/model_validation/statsmodels/RegressionCoeffs.py,sha256=NH6Qi-1fFxIO2kzma6NhVm8U7JWkYA_gKAXsasgZIX0,4175
254
260
  validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.py,sha256=ecXnety9-X45gt0dQ-RJRLcgzSRikPPf0oE5_6WFSCE,3909
255
261
  validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.py,sha256=XpzPACbdKkjP5egxESDUYb7aCZ8_VmJpMHCy3joEHmA,3648
@@ -274,7 +280,7 @@ validmind/tests/prompt_validation/Robustness.py,sha256=exMGzdzAtfRSTVSSY4xhbidln
274
280
  validmind/tests/prompt_validation/Specificity.py,sha256=B5XemQSoE2o6elSFZZ5NdWq0ie3NycZS_CTTSThopfM,4692
275
281
  validmind/tests/prompt_validation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
276
282
  validmind/tests/prompt_validation/ai_powered_test.py,sha256=Lc8WU-rJ50e_NbLGV3YZ-W9t6Vj2T-o7hMxZbUrv3pw,2229
277
- validmind/tests/run.py,sha256=Vz654OtevNM5r_OaFS052tAZZwhj2HGgFWGZ6DEj5Pw,14418
283
+ validmind/tests/run.py,sha256=co7QgGYw_l3e0u_l4axR8V3X_GLKvMKmTCPzvmFvaow,13419
278
284
  validmind/tests/test_providers.py,sha256=BceVuM_-bfQ4Zp-a5wwcP_wHeM6IOUpPIq1-MeT2-VY,6250
279
285
  validmind/tests/utils.py,sha256=mQuf1qgewPiE_pFN8iOoPSCGdyFqb4jbMFBVN3S3S2o,3526
280
286
  validmind/unit_metrics/__init__.py,sha256=lXeTJh8uq0TBRQHDBVhzKiHoV2eG9xOkHkI_pDXnkPU,952
@@ -294,7 +300,7 @@ validmind/unit_metrics/regression/MeanSquaredError.py,sha256=h-zgtlR3aigQwMGbi55
294
300
  validmind/unit_metrics/regression/QuantileLoss.py,sha256=rs0m9w4zIL6daQOHqYY-sEeQs6SDTpd0t3cN_KFZyqA,518
295
301
  validmind/unit_metrics/regression/RSquaredScore.py,sha256=z8-E-KSewvma9nu1OSUv97IfmFLpV5-rOq15jtlxklg,459
296
302
  validmind/unit_metrics/regression/RootMeanSquaredError.py,sha256=uIDsSpy75Z7W3zu4LditvW3mPJIkGxf-PdFQ7szWBZU,603
297
- validmind/utils.py,sha256=rS7XEiNwcaWzWrAEBlJEUVfOb7FD55LuXlY8-0XZro4,18117
303
+ validmind/utils.py,sha256=WvjKXskGmVGupEVYvEiy5-0cBT_jwpKfpH2HsCfy_B8,18655
298
304
  validmind/vm_models/__init__.py,sha256=lcqf9q2aRzrVrNN6R--81IkrnSa6BXPbhJ8SnkT_hcI,702
299
305
  validmind/vm_models/dataset/__init__.py,sha256=U4CxZjdoc0dd9u2AqBl5PJh1UVbzXWNrmundmjLF-qE,346
300
306
  validmind/vm_models/dataset/dataset.py,sha256=Zzquc3FhPGTMZhFxNlAIHf4AGXq5idpJmr-fkXUpi6A,26498
@@ -304,14 +310,14 @@ validmind/vm_models/input.py,sha256=qLdqz_bktr4v0YcPha2vFdDvmkC-btT1pH9zBIkt1OY,
304
310
  validmind/vm_models/model.py,sha256=PRNyrnKihIRtbYt4idLPHf8OCij71Vgc5Xug_oVZfBg,6486
305
311
  validmind/vm_models/result/__init__.py,sha256=Bs5GMGDxiTsxlwCdqxz5LmGkY0_fM6-_0-3tWSRoqps,341
306
312
  validmind/vm_models/result/result.jinja,sha256=Yvovwm5gInCBukFRlvJXNlDIUpl2eFz4dz1lS3Sn_Gc,311
307
- validmind/vm_models/result/result.py,sha256=v7sT6iadOTNii5DdD92FI1cUuEo1-VP7z6YQAMpAl1I,13785
313
+ validmind/vm_models/result/result.py,sha256=kMyr_7qOgo30ZW87MomIm-ck5d8Ph2Kx4cUE2hh-EEM,13784
308
314
  validmind/vm_models/result/utils.py,sha256=t6g-g1fJ3SU9lHqC1kMeozMkrUnfOMwYAep3Z5XFXNo,5122
309
315
  validmind/vm_models/test_suite/runner.py,sha256=Cpl9WKwHzJD5Zvrh71FzbEhGZkHM0x0MSd4PIwdOLDQ,5427
310
316
  validmind/vm_models/test_suite/summary.py,sha256=Ug3nMvpPL2DSTDujWagWMCrFiW9oDy0AqJL_zXN8pH0,4642
311
317
  validmind/vm_models/test_suite/test.py,sha256=uImjmPlBlLrlVPavsUzbaDK55bvpOn3PuFyWeyYyTac,3908
312
318
  validmind/vm_models/test_suite/test_suite.py,sha256=5Jppt2UXSMgvJ6FO5LIAKA4oN_-hh9SMr8APAFJzk9g,5080
313
- validmind-2.7.2.dist-info/LICENSE,sha256=XonPUfwjvrC5Ombl3y-ko0Wubb1xdG_7nzvIbkZRKHw,35772
314
- validmind-2.7.2.dist-info/METADATA,sha256=m0NFeDGlKjU5PvjtmjpfBLtDnxGz4HmS30Z5NgKehxA,6124
315
- validmind-2.7.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
316
- validmind-2.7.2.dist-info/entry_points.txt,sha256=HuW7YyOv9u_OEWpViQXtv0nfoI67uieJHawKWA4Hv9A,76
317
- validmind-2.7.2.dist-info/RECORD,,
319
+ validmind-2.7.4.dist-info/LICENSE,sha256=XonPUfwjvrC5Ombl3y-ko0Wubb1xdG_7nzvIbkZRKHw,35772
320
+ validmind-2.7.4.dist-info/METADATA,sha256=Q-LKRi7dXtjxFBM3_vg4MnJyz7lvaJmHRKI2Q4mEQk4,6124
321
+ validmind-2.7.4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
322
+ validmind-2.7.4.dist-info/entry_points.txt,sha256=HuW7YyOv9u_OEWpViQXtv0nfoI67uieJHawKWA4Hv9A,76
323
+ validmind-2.7.4.dist-info/RECORD,,