validmind 2.13.9__tar.gz → 2.13.12__tar.gz
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-2.13.9 → validmind-2.13.12}/.gitignore +0 -4
- {validmind-2.13.9 → validmind-2.13.12}/PKG-INFO +6 -4
- {validmind-2.13.9 → validmind-2.13.12}/pyproject.toml +7 -3
- validmind-2.13.12/validmind/__version__.py +1 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/ai/utils.py +5 -2
- {validmind-2.13.9 → validmind-2.13.12}/validmind/api_client.py +50 -10
- {validmind-2.13.9 → validmind-2.13.12}/validmind/client.py +8 -2
- {validmind-2.13.9 → validmind-2.13.12}/validmind/client_config.py +4 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/experimental/agents.py +3 -1
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/LaggedCorrelationHeatmap.py +11 -9
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TimeSeriesMissingValues.py +14 -8
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/RegressionResidualsPlot.py +42 -7
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/ConfusionMatrix.py +26 -16
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/TargetPredictionDistributionPlot.py +19 -18
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/output.py +3 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/run.py +5 -2
- {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/GiniCoefficient.py +5 -1
- {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/model.py +4 -2
- {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/result/result.py +42 -12
- {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/result/utils.py +13 -3
- validmind-2.13.9/validmind/__version__.py +0 -1
- {validmind-2.13.9 → validmind-2.13.12}/LICENSE +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/README.pypi.md +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/ai/test_descriptions.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/credentials_store.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/classification/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/classification/config.json +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/classification/customer_churn.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/classification/datasets/bank_customer_churn.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/classification/datasets/taiwan_credit.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/classification/taiwan_credit.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/cluster/digits.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/credit_risk/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/credit_risk/datasets/lending_club_biased.csv.gz +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/credit_risk/datasets/lending_club_loan_data_2007_2014_clean.csv.gz +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/credit_risk/lending_club.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/credit_risk/lending_club_bias.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/llm/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/llm/agent_dataset.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/llm/rag/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_1.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_2.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_3.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_4.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_5.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/llm/rag/rfp.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/nlp/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/nlp/cnn_dailymail.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/nlp/datasets/Covid_19.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/nlp/datasets/cnn_dailymail_100_with_predictions.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/nlp/datasets/cnn_dailymail_500_with_predictions.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/nlp/datasets/sentiments_with_predictions.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/nlp/twitter_covid_19.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/california_housing.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/california_housing.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/CPIAUCSL.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/CSUSHPISA.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/DRSFRMACBS.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/FEDFUNDS.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/GDP.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/GDPC1.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/GS10.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/GS3.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/GS5.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/MORTGAGE30US.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred/UNRATE.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred_loan_rates.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred_loan_rates_test_1.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred_loan_rates_test_2.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred_loan_rates_test_3.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred_loan_rates_test_4.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/fred_loan_rates_test_5.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/datasets/leanding_club_loan_rates.csv +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/fred.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/fred_timeseries.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/generate_california_housing_csv.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/datasets/regression/lending_club.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/errors.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/experimental/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/html_templates/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/html_templates/content_blocks.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/input_registry.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/logging.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/models/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/models/foundation.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/models/function.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/models/huggingface.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/models/metadata.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/models/pipeline.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/models/pytorch.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/models/r_model.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/models/sklearn.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/oidc_device.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/AbsoluteError.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/BrierScore.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/CalibrationError.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/ClassBalance.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/Confidence.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/Correctness.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/LogLoss.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/OutlierScore.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/ProbabilityError.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/Uncertainty.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/classification/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/AnswerRelevancy.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/ArgumentCorrectness.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/Bias.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/ContextualPrecision.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/ContextualRecall.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/ContextualRelevancy.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/Faithfulness.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/GEval.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/Hallucination.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/PlanAdherence.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/PlanQuality.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/Summarization.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/TaskCompletion.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/ToolCorrectness.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/scorers/llm/deepeval/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/template.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/classifier.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/cluster.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/embeddings.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/llm.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/nlp.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/parameters_optimization.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/regression.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/statsmodels_timeseries.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/summarization.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/tabular_datasets.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/text_data.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/test_suites/time_series.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/__types__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/_store.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/comparison.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ACFandPACFPlot.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ADF.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/AutoAR.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/AutoMA.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/AutoStationarity.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/BivariateScatterPlots.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/BoxPierce.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ChiSquaredFeaturesTable.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ClassImbalance.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/DatasetDescription.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/DatasetSplit.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/DescriptiveStatistics.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/DickeyFullerGLS.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/Duplicates.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/EngleGrangerCoint.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/FeatureTargetCorrelationPlot.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/HighCardinality.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/HighPearsonCorrelation.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/IQROutliersBarPlot.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/IQROutliersTable.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/IsolationForestOutliers.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/JarqueBera.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/KPSS.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/LJungBox.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/MissingValues.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/MissingValuesBarPlot.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/MutualInformation.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/PearsonCorrelationMatrix.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/PhillipsPerronArch.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ProtectedClassesCombination.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ProtectedClassesDescription.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ProtectedClassesDisparity.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/RollingStatsPlot.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/RunsTest.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ScatterPlot.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ScoreBandDefaultRates.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/SeasonalDecompose.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ShapiroWilk.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/Skewness.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/SpreadPlot.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TabularCategoricalBarPlots.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TabularDateTimeHistograms.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TabularDescriptionTables.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TabularNumericalHistograms.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TargetRateBarPlots.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TimeSeriesDescription.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TimeSeriesFrequency.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TimeSeriesHistogram.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TimeSeriesLinePlot.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TimeSeriesOutliers.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TooManyZeroValues.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/UniqueRows.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/WOEBinPlots.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/WOEBinTable.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/ZivotAndrewsArch.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/CommonWords.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/Hashtags.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/LanguageDetection.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/Mentions.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/Punctuations.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/Sentiment.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/StopWords.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/TextDescription.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/Toxicity.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/nlp/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/decorator.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/load.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/BertScore.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/BleuScore.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ClusterSizeDistribution.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ContextualRecall.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/FeaturesAUC.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/MeteorScore.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ModelMetadata.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ModelPredictionResiduals.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/RegardScore.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/RougeScore.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/TimeSeriesPredictionWithCI.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/TimeSeriesPredictionsPlot.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/TokenDisparity.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ToxicityScore.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/ClusterDistribution.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/CosineSimilarityComparison.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/CosineSimilarityDistribution.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/CosineSimilarityHeatmap.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/DescriptiveAnalytics.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/EmbeddingsVisualization2D.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/EuclideanDistanceComparison.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/EuclideanDistanceHeatmap.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/PCAComponentsPairwisePlots.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/StabilityAnalysisKeyword.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/StabilityAnalysisRandomNoise.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/StabilityAnalysisSynonyms.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/StabilityAnalysisTranslation.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/TSNEComponentsPairwisePlots.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/embeddings/utils.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/AnswerCorrectness.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/AspectCritic.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/ContextEntityRecall.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/ContextPrecision.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/ContextPrecisionWithoutReference.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/ContextRecall.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/Faithfulness.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/NoiseSensitivity.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/ResponseRelevancy.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/SemanticSimilarity.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/ragas/utils.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/AdjustedRandIndex.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/CalibrationCurve.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/ClassifierPerformance.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/CompletenessScore.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/FeatureImportance.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/HomogeneityScore.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/HyperParametersTuning.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/MinimumAccuracy.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/MinimumF1Score.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/ModelParameters.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/OverfitDiagnosis.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/ROCCurve.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/RegressionErrors.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/RegressionPerformance.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/RegressionR2Square.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/SilhouettePlot.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/TrainingTestDegradation.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/VMeasure.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/_diagnosis_metrics.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/_multiclass_proba.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/AutoARIMA.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/GINITable.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/Lilliefors.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/RegressionCoeffs.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/RegressionModelSummary.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/ScorecardHistogram.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/statsmodels/statsutils.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/CalibrationCurveDrift.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/ClassDiscriminationDrift.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/ClassImbalanceDrift.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/ClassificationAccuracyDrift.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/ConfusionMatrixDrift.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/CumulativePredictionProbabilitiesDrift.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/FeatureDrift.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/PredictionAcrossEachFeature.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/PredictionCorrelation.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/PredictionProbabilitiesHistogramDrift.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/PredictionQuantilesAcrossFeatures.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/ROCCurveDrift.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/ScoreBandsDrift.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/ongoing_monitoring/ScorecardHistogramDrift.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/plots/BoxPlot.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/plots/CorrelationHeatmap.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/plots/HistogramPlot.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/plots/ViolinPlot.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/plots/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/prompt_validation/Bias.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/prompt_validation/Clarity.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/prompt_validation/Conciseness.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/prompt_validation/Delimitation.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/prompt_validation/NegativeInstruction.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/prompt_validation/Robustness.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/prompt_validation/Specificity.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/prompt_validation/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/prompt_validation/ai_powered_test.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/stats/CorrelationAnalysis.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/stats/DescriptiveStats.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/stats/NormalityTests.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/stats/OutlierDetection.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/stats/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/test_providers.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/tests/utils.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/classification/Accuracy.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/classification/F1.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/classification/Precision.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/classification/ROC_AUC.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/classification/Recall.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/AdjustedRSquaredScore.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/HuberLoss.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/KolmogorovSmirnovStatistic.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/MeanAbsoluteError.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/MeanAbsolutePercentageError.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/MeanBiasDeviation.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/MeanSquaredError.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/QuantileLoss.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/RSquaredScore.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/unit_metrics/regression/RootMeanSquaredError.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/utils.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/dataset/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/dataset/dataset.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/dataset/utils.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/figure.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/html_progress.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/html_renderer.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/input.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/result/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/result/pii_filter.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/result/result.jinja +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/test_suite/__init__.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/test_suite/runner.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/test_suite/summary.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/test_suite/test.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/test_suite/test_suite.py +0 -0
- {validmind-2.13.9 → validmind-2.13.12}/validmind/vm_models/text_generation_summary.py +0 -0
|
@@ -189,12 +189,8 @@ lending_club_loan_data_*.csv
|
|
|
189
189
|
|
|
190
190
|
# Pickle files
|
|
191
191
|
*.pkl
|
|
192
|
-
# Sample application scorecard model for validation notebook — do not remove!
|
|
193
|
-
!notebooks/use_cases/validation/xgb_model_champion.pkl
|
|
194
192
|
# Sample logistic regression model for validation series — do not remove!
|
|
195
193
|
!notebooks/tutorials/validation/lr_model_champion.pkl
|
|
196
|
-
# Sample XGBoost model for validation quickstart — do not remove!
|
|
197
|
-
!notebooks/quickstart/xgboost_model_champion.pkl
|
|
198
194
|
|
|
199
195
|
notebooks/llm/datasets/*.jsonl
|
|
200
196
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: validmind
|
|
3
|
-
Version: 2.13.
|
|
3
|
+
Version: 2.13.12
|
|
4
4
|
Summary: ValidMind Library
|
|
5
5
|
Author-email: Andres Rodriguez <andres@validmind.ai>, Juan Martinez <juan@validmind.ai>, Anil Sorathiya <anil@validmind.ai>, Luis Pallares <luis@validmind.ai>, John Walz <john@validmind.ai>
|
|
6
6
|
License: DUAL LICENSE NOTICE
|
|
@@ -735,6 +735,7 @@ Requires-Dist: pyarrow<23,>=22; (python_version >= '3.14') and extra == 'all'
|
|
|
735
735
|
Requires-Dist: pycocoevalcap; extra == 'all'
|
|
736
736
|
Requires-Dist: ragas<=0.2.7,>=0.2.3; extra == 'all'
|
|
737
737
|
Requires-Dist: rouge>=1; extra == 'all'
|
|
738
|
+
Requires-Dist: scikit-learn<1.8; extra == 'all'
|
|
738
739
|
Requires-Dist: scipy; extra == 'all'
|
|
739
740
|
Requires-Dist: scorecardpy==0.1.9.6; extra == 'all'
|
|
740
741
|
Requires-Dist: sentencepiece<0.3.0,>=0.2.0; extra == 'all'
|
|
@@ -744,7 +745,7 @@ Requires-Dist: statsmodels<0.15.0,>=0.14.2; extra == 'all'
|
|
|
744
745
|
Requires-Dist: textblob<0.19.0,>=0.18.0.post0; extra == 'all'
|
|
745
746
|
Requires-Dist: torch>=2.0.0; extra == 'all'
|
|
746
747
|
Requires-Dist: transformers<5.0.0,>=4.32.0; extra == 'all'
|
|
747
|
-
Requires-Dist: xgboost<3,>=1.5.2; extra == 'all'
|
|
748
|
+
Requires-Dist: xgboost<3.1,>=1.5.2; extra == 'all'
|
|
748
749
|
Provides-Extra: credit-risk
|
|
749
750
|
Requires-Dist: scorecardpy==0.1.9.6; extra == 'credit-risk'
|
|
750
751
|
Requires-Dist: setuptools<82; extra == 'credit-risk'
|
|
@@ -802,7 +803,8 @@ Requires-Dist: arch>=7.0.0; extra == 'stats'
|
|
|
802
803
|
Requires-Dist: scipy; extra == 'stats'
|
|
803
804
|
Requires-Dist: statsmodels<0.15.0,>=0.14.2; extra == 'stats'
|
|
804
805
|
Provides-Extra: xgboost
|
|
805
|
-
Requires-Dist:
|
|
806
|
+
Requires-Dist: scikit-learn<1.8; extra == 'xgboost'
|
|
807
|
+
Requires-Dist: xgboost<3.1,>=1.5.2; extra == 'xgboost'
|
|
806
808
|
Description-Content-Type: text/markdown
|
|
807
809
|
|
|
808
810
|
# ValidMind Library
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "validmind"
|
|
3
|
-
version = "2.13.
|
|
3
|
+
version = "2.13.12"
|
|
4
4
|
description = "ValidMind Library"
|
|
5
5
|
readme = "README.pypi.md"
|
|
6
6
|
requires-python = ">=3.9,<3.15"
|
|
@@ -40,7 +40,8 @@ dependencies = [
|
|
|
40
40
|
[project.optional-dependencies]
|
|
41
41
|
all = [
|
|
42
42
|
"torch (>=2.0.0)",
|
|
43
|
-
"xgboost (>=1.5.2,<3)",
|
|
43
|
+
"xgboost (>=1.5.2,<3.1)",
|
|
44
|
+
"scikit-learn (<1.8)",
|
|
44
45
|
"transformers (>=4.32.0,<5.0.0)",
|
|
45
46
|
"pycocoevalcap",
|
|
46
47
|
"ragas (>=0.2.3,<=0.2.7)",
|
|
@@ -108,7 +109,10 @@ nlp = [
|
|
|
108
109
|
]
|
|
109
110
|
pytorch = ["torch (>=2.0.0)"]
|
|
110
111
|
stats = ["scipy", "statsmodels (>=0.14.2,<0.15.0)", "arch (>=7.0.0)"]
|
|
111
|
-
xgboost = [
|
|
112
|
+
xgboost = [
|
|
113
|
+
"xgboost (>=1.5.2,<3.1)",
|
|
114
|
+
"scikit-learn (<1.8)",
|
|
115
|
+
]
|
|
112
116
|
explainability = [
|
|
113
117
|
"shap (>=0.46.0)",
|
|
114
118
|
"numba (>=0.65.1) ; python_version >= '3.14'",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2.13.12"
|
|
@@ -8,7 +8,7 @@ import os
|
|
|
8
8
|
from openai import AzureOpenAI, OpenAI
|
|
9
9
|
|
|
10
10
|
from ..logging import get_logger
|
|
11
|
-
from ..utils import md_to_html
|
|
11
|
+
from ..utils import is_html, md_to_html
|
|
12
12
|
|
|
13
13
|
logger = get_logger(__name__)
|
|
14
14
|
|
|
@@ -38,6 +38,7 @@ class DescriptionFuture:
|
|
|
38
38
|
|
|
39
39
|
def __init__(self, future):
|
|
40
40
|
self._future = future
|
|
41
|
+
self.markdown_source = None
|
|
41
42
|
|
|
42
43
|
def get_description(self):
|
|
43
44
|
if isinstance(self._future, tuple):
|
|
@@ -46,7 +47,9 @@ class DescriptionFuture:
|
|
|
46
47
|
# This will block until the future is completed
|
|
47
48
|
description = self._future.result()
|
|
48
49
|
|
|
49
|
-
|
|
50
|
+
source, was_generated = description
|
|
51
|
+
self.markdown_source = source if not is_html(source) else None
|
|
52
|
+
return md_to_html(source, mathml=True), was_generated
|
|
50
53
|
|
|
51
54
|
|
|
52
55
|
def _get_google_api_key():
|
|
@@ -588,6 +588,7 @@ async def alog_metadata(
|
|
|
588
588
|
text: Optional[str] = None,
|
|
589
589
|
_json: Optional[Dict[str, Any]] = None,
|
|
590
590
|
section_id: Optional[str] = None,
|
|
591
|
+
text_format: Optional[str] = None,
|
|
591
592
|
) -> Dict[str, Any]:
|
|
592
593
|
"""Logs free-form metadata to ValidMind API.
|
|
593
594
|
|
|
@@ -597,6 +598,9 @@ async def alog_metadata(
|
|
|
597
598
|
_json (dict, optional): Free-form key-value pairs to assign to the metadata. Defaults to None.
|
|
598
599
|
section_id (str, optional): Section ID to append the text block to when the
|
|
599
600
|
content ID does not already exist.
|
|
601
|
+
text_format (str, optional): Format of ``text``. Markdown is sent as-is when
|
|
602
|
+
the backend advertises support so conversion happens after the request
|
|
603
|
+
passes through the WAF. Older backends receive locally converted HTML.
|
|
600
604
|
|
|
601
605
|
Raises:
|
|
602
606
|
Exception: If the API call fails.
|
|
@@ -604,11 +608,17 @@ async def alog_metadata(
|
|
|
604
608
|
Returns:
|
|
605
609
|
dict: The response from the API.
|
|
606
610
|
"""
|
|
611
|
+
if text_format == "markdown" and not client_config.supports_log_metadata_markdown():
|
|
612
|
+
text = md_to_html(text, mathml=True)
|
|
613
|
+
text_format = None
|
|
614
|
+
|
|
607
615
|
metadata_dict = {"content_id": content_id}
|
|
608
616
|
if text is not None:
|
|
609
617
|
metadata_dict["text"] = text
|
|
610
618
|
if _json is not None:
|
|
611
619
|
metadata_dict["json"] = _json
|
|
620
|
+
if text_format is not None:
|
|
621
|
+
metadata_dict["text_format"] = text_format
|
|
612
622
|
|
|
613
623
|
request_params = {}
|
|
614
624
|
if section_id:
|
|
@@ -808,11 +818,18 @@ def generate_qualitative_text(text_generation_data: Dict[str, Any]) -> Dict[str,
|
|
|
808
818
|
return r.json()
|
|
809
819
|
|
|
810
820
|
|
|
811
|
-
def
|
|
812
|
-
"""Validate text
|
|
821
|
+
def _validate_logged_text(text: str, field_name: str) -> str:
|
|
822
|
+
"""Validate text accepted by log_text."""
|
|
813
823
|
if not isinstance(text, str) or not text:
|
|
814
824
|
raise ValueError(f"`{field_name}` must be a non-empty string")
|
|
815
825
|
|
|
826
|
+
return text
|
|
827
|
+
|
|
828
|
+
|
|
829
|
+
def _normalize_logged_text(text: str, field_name: str) -> str:
|
|
830
|
+
"""Validate text content and convert Markdown to HTML for local rendering."""
|
|
831
|
+
text = _validate_logged_text(text, field_name)
|
|
832
|
+
|
|
816
833
|
if not is_html(text):
|
|
817
834
|
return md_to_html(text, mathml=True)
|
|
818
835
|
|
|
@@ -828,7 +845,7 @@ def _validate_manual_log_text_args(
|
|
|
828
845
|
if context is not None:
|
|
829
846
|
raise ValueError("`context` is only supported when `text` is omitted")
|
|
830
847
|
|
|
831
|
-
return
|
|
848
|
+
return _validate_logged_text(text, "text")
|
|
832
849
|
|
|
833
850
|
|
|
834
851
|
def _build_log_text_generation_request(
|
|
@@ -860,13 +877,13 @@ def _build_log_text_generation_request(
|
|
|
860
877
|
return request_data
|
|
861
878
|
|
|
862
879
|
|
|
863
|
-
def
|
|
880
|
+
def _generate_log_text_source(
|
|
864
881
|
content_id: str,
|
|
865
882
|
prompt: Optional[str],
|
|
866
883
|
context: Optional[Dict[str, Any]],
|
|
867
884
|
section_id: Optional[str] = None,
|
|
868
885
|
) -> str:
|
|
869
|
-
"""Generate
|
|
886
|
+
"""Generate and validate source text without converting it to HTML."""
|
|
870
887
|
request_data = _build_log_text_generation_request(
|
|
871
888
|
content_id,
|
|
872
889
|
prompt,
|
|
@@ -874,6 +891,22 @@ def _generate_log_text(
|
|
|
874
891
|
section_id=section_id,
|
|
875
892
|
)
|
|
876
893
|
generated_text = generate_qualitative_text(request_data)["content"]
|
|
894
|
+
return _validate_logged_text(generated_text, "generated text")
|
|
895
|
+
|
|
896
|
+
|
|
897
|
+
def _generate_log_text(
|
|
898
|
+
content_id: str,
|
|
899
|
+
prompt: Optional[str],
|
|
900
|
+
context: Optional[Dict[str, Any]],
|
|
901
|
+
section_id: Optional[str] = None,
|
|
902
|
+
) -> str:
|
|
903
|
+
"""Generate text and normalize it to HTML for local result rendering."""
|
|
904
|
+
generated_text = _generate_log_text_source(
|
|
905
|
+
content_id,
|
|
906
|
+
prompt,
|
|
907
|
+
context,
|
|
908
|
+
section_id=section_id,
|
|
909
|
+
)
|
|
877
910
|
return _normalize_logged_text(generated_text, "generated text")
|
|
878
911
|
|
|
879
912
|
|
|
@@ -902,14 +935,21 @@ async def alog_text(
|
|
|
902
935
|
if text is not None:
|
|
903
936
|
text = _validate_manual_log_text_args(text, prompt, context)
|
|
904
937
|
else:
|
|
905
|
-
text =
|
|
938
|
+
text = _generate_log_text_source(
|
|
906
939
|
content_id,
|
|
907
940
|
prompt,
|
|
908
941
|
context,
|
|
909
942
|
section_id=section_id,
|
|
910
943
|
)
|
|
911
944
|
|
|
912
|
-
|
|
945
|
+
text_format = None if is_html(text) else "markdown"
|
|
946
|
+
return await alog_metadata(
|
|
947
|
+
content_id,
|
|
948
|
+
text,
|
|
949
|
+
_json,
|
|
950
|
+
section_id=section_id,
|
|
951
|
+
text_format=text_format,
|
|
952
|
+
)
|
|
913
953
|
|
|
914
954
|
|
|
915
955
|
def log_text(
|
|
@@ -924,9 +964,9 @@ def log_text(
|
|
|
924
964
|
|
|
925
965
|
Args:
|
|
926
966
|
content_id (str): Unique content identifier for the text.
|
|
927
|
-
text (str, optional): The text to log.
|
|
928
|
-
|
|
929
|
-
|
|
967
|
+
text (str, optional): The text to log. Markdown is sent to the backend for
|
|
968
|
+
HTML and math conversion. If omitted, text is generated using the
|
|
969
|
+
qualitative text generation backend.
|
|
930
970
|
prompt (str, optional): Custom prompt used for AI-assisted text
|
|
931
971
|
generation. Only supported when `text` is omitted.
|
|
932
972
|
context (dict, optional): Context object for AI-assisted text
|
|
@@ -38,7 +38,7 @@ from .template import preview_template as _preview_template
|
|
|
38
38
|
from .test_suites import get_by_id as get_test_suite_by_id
|
|
39
39
|
from .tests.run import _get_run_metadata
|
|
40
40
|
from .utils import display as vm_display
|
|
41
|
-
from .utils import get_dataset_info, get_model_info
|
|
41
|
+
from .utils import get_dataset_info, get_model_info, is_html
|
|
42
42
|
from .vm_models import TestSuite, TestSuiteRunner
|
|
43
43
|
from .vm_models.dataset import DataFrameDataset, PolarsDataset, TorchDataset, VMDataset
|
|
44
44
|
from .vm_models.html_progress import HTMLLabel, HTMLProgressBar
|
|
@@ -479,9 +479,12 @@ def run_text_generation(
|
|
|
479
479
|
A TextGenerationResult containing the generated text.
|
|
480
480
|
"""
|
|
481
481
|
start_time = time.perf_counter()
|
|
482
|
-
|
|
482
|
+
description_source = api_client._generate_log_text_source(
|
|
483
483
|
content_id, prompt, context, section_id=section_id
|
|
484
484
|
)
|
|
485
|
+
description = api_client._normalize_logged_text(
|
|
486
|
+
description_source, "generated text"
|
|
487
|
+
)
|
|
485
488
|
metadata = _get_run_metadata(duration_seconds=time.perf_counter() - start_time)
|
|
486
489
|
result = TextGenerationResult(
|
|
487
490
|
result_id=content_id,
|
|
@@ -494,6 +497,9 @@ def run_text_generation(
|
|
|
494
497
|
section_id=section_id,
|
|
495
498
|
context=context,
|
|
496
499
|
_was_description_generated=True,
|
|
500
|
+
_description_source=(
|
|
501
|
+
description_source if not is_html(description_source) else None
|
|
502
|
+
),
|
|
497
503
|
)
|
|
498
504
|
|
|
499
505
|
if show:
|
|
@@ -39,6 +39,10 @@ class ClientConfig:
|
|
|
39
39
|
"""Returns True if the client can generate LLM-based test descriptions."""
|
|
40
40
|
return self.feature_flags.get("llm_test_descriptions", True)
|
|
41
41
|
|
|
42
|
+
def supports_log_metadata_markdown(self):
|
|
43
|
+
"""Return whether the backend converts Markdown logged as metadata."""
|
|
44
|
+
return self.feature_flags.get("log_metadata_markdown", False)
|
|
45
|
+
|
|
42
46
|
|
|
43
47
|
client_config = ClientConfig(
|
|
44
48
|
model=None,
|
|
@@ -54,7 +54,8 @@ def run_task(
|
|
|
54
54
|
else:
|
|
55
55
|
raise ValueError(f"Unsupported task: {task}")
|
|
56
56
|
|
|
57
|
-
if not is_html(generated_text)
|
|
57
|
+
description_source = generated_text if not is_html(generated_text) else None
|
|
58
|
+
if description_source is not None:
|
|
58
59
|
generated_text = md_to_html(generated_text, mathml=True)
|
|
59
60
|
|
|
60
61
|
# Create a test result with the generated text
|
|
@@ -68,6 +69,7 @@ def run_task(
|
|
|
68
69
|
section_id=input.get("section_id"),
|
|
69
70
|
context=input.get("context"),
|
|
70
71
|
_was_description_generated=True,
|
|
72
|
+
_description_source=description_source,
|
|
71
73
|
)
|
|
72
74
|
if show:
|
|
73
75
|
result.show()
|
{validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/LaggedCorrelationHeatmap.py
RENAMED
|
@@ -6,7 +6,6 @@ from typing import Tuple
|
|
|
6
6
|
|
|
7
7
|
import numpy as np
|
|
8
8
|
import pandas as pd
|
|
9
|
-
import plotly.figure_factory as ff
|
|
10
9
|
import plotly.graph_objects as go
|
|
11
10
|
|
|
12
11
|
from validmind import RawData, tags, tasks
|
|
@@ -86,13 +85,15 @@ def LaggedCorrelationHeatmap(
|
|
|
86
85
|
index=dataset.feature_columns,
|
|
87
86
|
)
|
|
88
87
|
|
|
89
|
-
fig =
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
88
|
+
fig = go.Figure(
|
|
89
|
+
go.Heatmap(
|
|
90
|
+
z=correlation_df.values,
|
|
91
|
+
x=list(correlation_df.columns),
|
|
92
|
+
y=list(correlation_df.index),
|
|
93
|
+
colorscale=COOLWARM,
|
|
94
|
+
showscale=True,
|
|
95
|
+
texttemplate="%{z:.2f}",
|
|
96
|
+
)
|
|
96
97
|
)
|
|
97
98
|
fig.update_layout(
|
|
98
99
|
title={
|
|
@@ -103,7 +104,8 @@ def LaggedCorrelationHeatmap(
|
|
|
103
104
|
"yanchor": "top",
|
|
104
105
|
},
|
|
105
106
|
font=dict(size=14),
|
|
106
|
-
|
|
107
|
+
xaxis=dict(title="Lags", side="top", dtick=1),
|
|
108
|
+
yaxis=dict(dtick=1),
|
|
107
109
|
)
|
|
108
110
|
|
|
109
111
|
return fig, RawData(correlation_matrix=correlation_df, dataset=dataset.input_id)
|
{validmind-2.13.9 → validmind-2.13.12}/validmind/tests/data_validation/TimeSeriesMissingValues.py
RENAMED
|
@@ -6,7 +6,6 @@ from typing import Any, Dict, List, Tuple
|
|
|
6
6
|
|
|
7
7
|
import pandas as pd
|
|
8
8
|
import plotly.express as px
|
|
9
|
-
import plotly.figure_factory as ff
|
|
10
9
|
import plotly.graph_objects as go
|
|
11
10
|
|
|
12
11
|
from validmind import RawData, tags, tasks
|
|
@@ -94,16 +93,23 @@ def TimeSeriesMissingValues(
|
|
|
94
93
|
z = missing_mask.T.astype(int).values
|
|
95
94
|
x = missing_mask.index.tolist()
|
|
96
95
|
y = missing_mask.columns.tolist()
|
|
97
|
-
heatmap =
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
96
|
+
heatmap = go.Figure(
|
|
97
|
+
go.Heatmap(
|
|
98
|
+
z=z,
|
|
99
|
+
x=x,
|
|
100
|
+
y=y,
|
|
101
|
+
colorscale="Reds",
|
|
102
|
+
showscale=False,
|
|
103
|
+
texttemplate="%{z}",
|
|
104
|
+
)
|
|
103
105
|
)
|
|
104
106
|
|
|
105
107
|
# Update the layout after creation
|
|
106
|
-
heatmap.update_layout(
|
|
108
|
+
heatmap.update_layout(
|
|
109
|
+
title="Missing Values Heatmap",
|
|
110
|
+
xaxis=dict(side="top", dtick=1),
|
|
111
|
+
yaxis=dict(dtick=1),
|
|
112
|
+
)
|
|
107
113
|
|
|
108
114
|
return (
|
|
109
115
|
[
|
{validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/RegressionResidualsPlot.py
RENAMED
|
@@ -5,12 +5,29 @@
|
|
|
5
5
|
from typing import Tuple
|
|
6
6
|
|
|
7
7
|
import numpy as np
|
|
8
|
-
import plotly.figure_factory as ff
|
|
9
8
|
import plotly.graph_objects as go
|
|
10
9
|
|
|
11
10
|
from validmind import RawData, tags, tasks
|
|
11
|
+
from validmind.errors import MissingDependencyError
|
|
12
12
|
from validmind.vm_models import VMDataset, VMModel
|
|
13
13
|
|
|
14
|
+
# The first colour in Plotly's default distplot palette, kept so the ported figure
|
|
15
|
+
# matches what `ff.create_distplot` produced.
|
|
16
|
+
KDE_COLOR = "rgb(31, 119, 180)"
|
|
17
|
+
|
|
18
|
+
try:
|
|
19
|
+
from scipy.stats import gaussian_kde
|
|
20
|
+
except ImportError as e:
|
|
21
|
+
if "scipy" in str(e):
|
|
22
|
+
raise MissingDependencyError(
|
|
23
|
+
"Missing required package `scipy` for RegressionResidualsPlot. "
|
|
24
|
+
"Please run `pip install validmind[stats]` to use statistical tests",
|
|
25
|
+
required_dependencies=["scipy"],
|
|
26
|
+
extra="stats",
|
|
27
|
+
) from e
|
|
28
|
+
|
|
29
|
+
raise e
|
|
30
|
+
|
|
14
31
|
|
|
15
32
|
@tags("model_performance", "visualization")
|
|
16
33
|
@tasks("regression")
|
|
@@ -65,12 +82,30 @@ def RegressionResidualsPlot(
|
|
|
65
82
|
|
|
66
83
|
# Residuals plot
|
|
67
84
|
residuals = y_true.flatten() - y_pred.flatten()
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
85
|
+
# A 500-point KDE across the data range, which is what `ff.create_distplot`
|
|
86
|
+
# computed internally with scipy before Plotly 7 removed it.
|
|
87
|
+
curve_x = np.linspace(residuals.min(), residuals.max(), 500, endpoint=False)
|
|
88
|
+
curve_y = gaussian_kde(residuals)(curve_x)
|
|
89
|
+
fig = go.Figure(
|
|
90
|
+
data=[
|
|
91
|
+
go.Histogram(
|
|
92
|
+
x=residuals,
|
|
93
|
+
histnorm="probability density",
|
|
94
|
+
autobinx=False,
|
|
95
|
+
xbins=dict(start=residuals.min(), end=residuals.max(), size=bin_size),
|
|
96
|
+
name="Residuals",
|
|
97
|
+
marker=dict(color=KDE_COLOR),
|
|
98
|
+
opacity=0.7,
|
|
99
|
+
),
|
|
100
|
+
go.Scatter(
|
|
101
|
+
x=curve_x,
|
|
102
|
+
y=curve_y,
|
|
103
|
+
mode="lines",
|
|
104
|
+
name="Residuals",
|
|
105
|
+
showlegend=False,
|
|
106
|
+
marker=dict(color=KDE_COLOR),
|
|
107
|
+
),
|
|
108
|
+
]
|
|
74
109
|
)
|
|
75
110
|
fig.update_layout(
|
|
76
111
|
title="Distribution of Residuals",
|
{validmind-2.13.9 → validmind-2.13.12}/validmind/tests/model_validation/sklearn/ConfusionMatrix.py
RENAMED
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
from typing import Tuple
|
|
7
7
|
|
|
8
8
|
import numpy as np
|
|
9
|
-
import plotly.figure_factory as ff
|
|
10
9
|
import plotly.graph_objects as go
|
|
11
10
|
from sklearn.metrics import confusion_matrix
|
|
12
11
|
|
|
@@ -42,9 +41,9 @@ def ConfusionMatrix(
|
|
|
42
41
|
The mechanism used involves taking the predicted results (`y_test_predict`) from the classification model and
|
|
43
42
|
comparing them against the actual values (`y_test_true`). A confusion matrix is built using the unique labels
|
|
44
43
|
extracted from `y_test_true`, employing scikit-learn's metrics. The matrix is then visually rendered with the help
|
|
45
|
-
of Plotly
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
of a Plotly heatmap. A heatmap is created which provides a two-dimensional graphical representation of the
|
|
45
|
+
model's performance, showcasing distributions of True Positives (TP), True Negatives (TN), False Positives (FP),
|
|
46
|
+
and False Negatives (FN).
|
|
48
47
|
|
|
49
48
|
### Signs of High Risk
|
|
50
49
|
|
|
@@ -110,21 +109,32 @@ def ConfusionMatrix(
|
|
|
110
109
|
],
|
|
111
110
|
]
|
|
112
111
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
112
|
+
if text is None:
|
|
113
|
+
text = cm.astype(str)
|
|
114
|
+
|
|
115
|
+
fig = go.Figure(
|
|
116
|
+
go.Heatmap(
|
|
117
|
+
z=cm,
|
|
118
|
+
x=labels,
|
|
119
|
+
y=labels,
|
|
120
|
+
colorscale="Blues",
|
|
121
|
+
showscale=False,
|
|
122
|
+
text=text,
|
|
123
|
+
texttemplate="%{text}",
|
|
124
|
+
# Heatmap text auto-shrinks to fit the cell; pin it to the layout font
|
|
125
|
+
# size so the cells read the same as the old annotation-based figure.
|
|
126
|
+
textfont=dict(size=12),
|
|
127
|
+
hovertemplate=(
|
|
128
|
+
"True Label:%{y}<br>Predicted Label:%{x}<br>Count:%{z}<extra></extra>"
|
|
129
|
+
),
|
|
130
|
+
)
|
|
119
131
|
)
|
|
120
132
|
|
|
121
|
-
fig["data"][0][
|
|
122
|
-
"hovertemplate"
|
|
123
|
-
] = "True Label:%{y}<br>Predicted Label:%{x}<br>Count:%{z}<extra></extra>"
|
|
124
|
-
|
|
125
133
|
fig.update_layout(
|
|
126
|
-
|
|
127
|
-
|
|
134
|
+
# `side="top"` and `dtick=1` keep the axis placement and per-class ticks that
|
|
135
|
+
# `ff.create_annotated_heatmap` used to apply for us.
|
|
136
|
+
xaxis=dict(title="Predicted label", side="top", dtick=1),
|
|
137
|
+
yaxis=dict(title="True label", dtick=1),
|
|
128
138
|
autosize=False,
|
|
129
139
|
width=600,
|
|
130
140
|
height=600,
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
from typing import Dict, List, Tuple
|
|
6
6
|
|
|
7
|
+
import numpy as np
|
|
7
8
|
import pandas as pd
|
|
8
|
-
import plotly.figure_factory as ff
|
|
9
9
|
import plotly.graph_objects as go
|
|
10
10
|
|
|
11
11
|
from validmind import RawData, tags, tasks
|
|
@@ -13,7 +13,7 @@ from validmind.errors import MissingDependencyError
|
|
|
13
13
|
from validmind.vm_models import VMDataset, VMModel
|
|
14
14
|
|
|
15
15
|
try:
|
|
16
|
-
from scipy.stats import kurtosis, skew
|
|
16
|
+
from scipy.stats import gaussian_kde, kurtosis, skew
|
|
17
17
|
except ImportError as e:
|
|
18
18
|
if "scipy" in str(e):
|
|
19
19
|
raise MissingDependencyError(
|
|
@@ -26,6 +26,17 @@ except ImportError as e:
|
|
|
26
26
|
raise e
|
|
27
27
|
|
|
28
28
|
|
|
29
|
+
def _kde_curve(values):
|
|
30
|
+
"""A 500-point KDE across the data range.
|
|
31
|
+
|
|
32
|
+
This is what `ff.create_distplot(..., show_hist=False)` computed internally
|
|
33
|
+
before Plotly 7 removed the Figure Factory functions.
|
|
34
|
+
"""
|
|
35
|
+
x = np.linspace(values.min(), values.max(), 500, endpoint=False)
|
|
36
|
+
|
|
37
|
+
return x, gaussian_kde(values)(x)
|
|
38
|
+
|
|
39
|
+
|
|
29
40
|
@tags("visualization")
|
|
30
41
|
@tasks("monitoring")
|
|
31
42
|
def TargetPredictionDistributionPlot(
|
|
@@ -110,18 +121,8 @@ def TargetPredictionDistributionPlot(
|
|
|
110
121
|
moments = moments.set_index("Statistic", drop=False)
|
|
111
122
|
|
|
112
123
|
# Create KDE for both distributions
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
["Reference"],
|
|
116
|
-
show_hist=False,
|
|
117
|
-
show_rug=False,
|
|
118
|
-
)
|
|
119
|
-
monitor_kde = ff.create_distplot(
|
|
120
|
-
[pred_monitor["Monitoring Prediction"].values],
|
|
121
|
-
["Monitoring"],
|
|
122
|
-
show_hist=False,
|
|
123
|
-
show_rug=False,
|
|
124
|
-
)
|
|
124
|
+
ref_x, ref_y = _kde_curve(pred_ref["Reference Prediction"].values)
|
|
125
|
+
monitor_x, monitor_y = _kde_curve(pred_monitor["Monitoring Prediction"].values)
|
|
125
126
|
|
|
126
127
|
# Create new figure
|
|
127
128
|
fig = go.Figure()
|
|
@@ -129,8 +130,8 @@ def TargetPredictionDistributionPlot(
|
|
|
129
130
|
# Add reference distribution
|
|
130
131
|
fig.add_trace(
|
|
131
132
|
go.Scatter(
|
|
132
|
-
x=
|
|
133
|
-
y=
|
|
133
|
+
x=ref_x,
|
|
134
|
+
y=ref_y,
|
|
134
135
|
fill="tozeroy",
|
|
135
136
|
name="Reference Prediction",
|
|
136
137
|
line=dict(color="blue", width=2),
|
|
@@ -141,8 +142,8 @@ def TargetPredictionDistributionPlot(
|
|
|
141
142
|
# Add monitoring distribution
|
|
142
143
|
fig.add_trace(
|
|
143
144
|
go.Scatter(
|
|
144
|
-
x=
|
|
145
|
-
y=
|
|
145
|
+
x=monitor_x,
|
|
146
|
+
y=monitor_y,
|
|
146
147
|
fill="tozeroy",
|
|
147
148
|
name="Monitor Prediction",
|
|
148
149
|
line=dict(color="red", width=2),
|
|
@@ -184,7 +184,10 @@ class StringOutputHandler(OutputHandler):
|
|
|
184
184
|
|
|
185
185
|
def process(self, item: Any, result: TestResult) -> None:
|
|
186
186
|
if not is_html(item):
|
|
187
|
+
result._description_source = item
|
|
187
188
|
item = md_to_html(item, mathml=True)
|
|
189
|
+
else:
|
|
190
|
+
result._description_source = None
|
|
188
191
|
|
|
189
192
|
result.description = item
|
|
190
193
|
|
|
@@ -16,7 +16,7 @@ from validmind.ai.test_descriptions import get_result_description
|
|
|
16
16
|
from validmind.errors import MissingRequiredTestInputError
|
|
17
17
|
from validmind.input_registry import input_registry
|
|
18
18
|
from validmind.logging import get_logger
|
|
19
|
-
from validmind.utils import test_id_to_name
|
|
19
|
+
from validmind.utils import is_html, test_id_to_name
|
|
20
20
|
from validmind.vm_models.input import VMInput
|
|
21
21
|
from validmind.vm_models.result import TestResult
|
|
22
22
|
|
|
@@ -451,7 +451,7 @@ def run_test( # noqa: C901
|
|
|
451
451
|
result = post_process_fn(result)
|
|
452
452
|
|
|
453
453
|
if not result.description:
|
|
454
|
-
|
|
454
|
+
description = get_result_description(
|
|
455
455
|
test_id=test_id,
|
|
456
456
|
test_description=result.doc,
|
|
457
457
|
tables=result.tables,
|
|
@@ -463,6 +463,9 @@ def run_test( # noqa: C901
|
|
|
463
463
|
additional_context=additional_context,
|
|
464
464
|
params=result.params,
|
|
465
465
|
)
|
|
466
|
+
result.description = description
|
|
467
|
+
if isinstance(description, str) and result.doc and not is_html(result.doc):
|
|
468
|
+
result._description_source = result.doc
|
|
466
469
|
|
|
467
470
|
if show:
|
|
468
471
|
result.show()
|
|
@@ -7,6 +7,10 @@ import numpy as np
|
|
|
7
7
|
from validmind import tags, tasks
|
|
8
8
|
from validmind.vm_models import VMDataset, VMModel
|
|
9
9
|
|
|
10
|
+
# NumPy 2 removed `np.trapz` in favour of `np.trapezoid`; the library supports both
|
|
11
|
+
# (numpy<2 below Python 3.14, numpy>=2.3 from 3.14 on).
|
|
12
|
+
_trapezoid = getattr(np, "trapezoid", None) or np.trapz
|
|
13
|
+
|
|
10
14
|
|
|
11
15
|
@tags("regression")
|
|
12
16
|
@tasks("regression")
|
|
@@ -29,7 +33,7 @@ def GiniCoefficient(dataset: VMDataset, model: VMModel) -> float:
|
|
|
29
33
|
cumsum_pred_norm = cumsum_pred / np.max(cumsum_pred)
|
|
30
34
|
|
|
31
35
|
# Compute area under the Lorenz curve
|
|
32
|
-
area_lorenz =
|
|
36
|
+
area_lorenz = _trapezoid(cumsum_pred_norm, x=cumsum_true_norm)
|
|
33
37
|
|
|
34
38
|
# Compute Gini coefficient
|
|
35
39
|
return 1 - 2 * area_lorenz
|