validmind 2.0.1__tar.gz → 2.1.0__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.0.1 → validmind-2.1.0}/PKG-INFO +18 -18
- {validmind-2.0.1 → validmind-2.1.0}/pyproject.toml +29 -22
- {validmind-2.0.1 → validmind-2.1.0}/validmind/__init__.py +6 -3
- validmind-2.1.0/validmind/__version__.py +1 -0
- validmind-2.1.0/validmind/ai.py +193 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/api_client.py +45 -31
- {validmind-2.0.1 → validmind-2.1.0}/validmind/client.py +33 -6
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/classification/customer_churn.py +2 -2
- validmind-2.1.0/validmind/datasets/credit_risk/__init__.py +11 -0
- validmind-2.1.0/validmind/datasets/credit_risk/datasets/lending_club_loan_data_2007_2014_clean.csv.gz +0 -0
- validmind-2.1.0/validmind/datasets/credit_risk/lending_club.py +394 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/nlp/__init__.py +5 -0
- validmind-2.1.0/validmind/datasets/nlp/cnn_dailymail.py +98 -0
- validmind-2.1.0/validmind/datasets/nlp/datasets/cnn_dailymail_100_with_predictions.csv +255 -0
- validmind-2.1.0/validmind/datasets/nlp/datasets/cnn_dailymail_500_with_predictions.csv +1277 -0
- validmind-2.1.0/validmind/datasets/nlp/datasets/sentiments_with_predictions.csv +4847 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/errors.py +11 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/logging.py +9 -2
- {validmind-2.0.1 → validmind-2.1.0}/validmind/models/huggingface.py +2 -2
- {validmind-2.0.1 → validmind-2.1.0}/validmind/models/pytorch.py +3 -3
- {validmind-2.0.1 → validmind-2.1.0}/validmind/models/sklearn.py +4 -4
- {validmind-2.0.1 → validmind-2.1.0}/validmind/template.py +2 -2
- {validmind-2.0.1 → validmind-2.1.0}/validmind/test_suites/__init__.py +4 -2
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/__init__.py +130 -45
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/DatasetDescription.py +0 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/FeatureTargetCorrelationPlot.py +3 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/PiTCreditScoresHistogram.py +1 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/ScatterPlot.py +8 -2
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/nlp/StopWords.py +1 -6
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/nlp/TextDescription.py +20 -9
- validmind-2.1.0/validmind/tests/decorator.py +313 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/BertScore.py +1 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/BertScoreAggregate.py +1 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/BleuScore.py +1 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/ClusterSizeDistribution.py +1 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/ContextualRecall.py +1 -1
- validmind-2.1.0/validmind/tests/model_validation/FeaturesAUC.py +110 -0
- validmind-2.1.0/validmind/tests/model_validation/MeteorScore.py +92 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/RegardHistogram.py +6 -7
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/RegardScore.py +4 -6
- validmind-2.1.0/validmind/tests/model_validation/RegressionResidualsPlot.py +127 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/RougeMetrics.py +7 -5
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/RougeMetricsAggregate.py +1 -1
- validmind-2.1.0/validmind/tests/model_validation/SelfCheckNLIScore.py +112 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/TokenDisparity.py +1 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/ToxicityHistogram.py +1 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/ToxicityScore.py +1 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/embeddings/ClusterDistribution.py +1 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/embeddings/CosineSimilarityDistribution.py +1 -3
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/embeddings/DescriptiveAnalytics.py +17 -22
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/embeddings/EmbeddingsVisualization2D.py +1 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/ClassifierPerformance.py +16 -17
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.py +1 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/ClusterPerformance.py +2 -2
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/ConfusionMatrix.py +21 -3
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/MinimumAccuracy.py +1 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/MinimumF1Score.py +1 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.py +1 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.py +5 -4
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/OverfitDiagnosis.py +2 -2
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/ROCCurve.py +6 -12
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/RegressionErrors.py +2 -2
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/RegressionModelsPerformanceComparison.py +6 -4
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/RegressionR2Square.py +2 -2
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.py +55 -5
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/SilhouettePlot.py +1 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/TrainingTestDegradation.py +11 -5
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.py +2 -2
- validmind-2.1.0/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.py +140 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/GINITable.py +22 -45
- validmind-2.0.1/validmind/tests/model_validation/statsmodels/LogisticRegPredictionHistogram.py → validmind-2.1.0/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.py +67 -92
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.py +2 -2
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.py +2 -2
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/RegressionModelInsampleComparison.py +1 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/RegressionModelOutsampleComparison.py +1 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/RegressionModelSummary.py +1 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/RegressionModelsPerformance.py +2 -2
- validmind-2.1.0/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.py +128 -0
- validmind-2.1.0/validmind/tests/model_validation/statsmodels/ScorecardHistogram.py +139 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/prompt_validation/ai_powered_test.py +2 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/test_providers.py +14 -124
- {validmind-2.0.1 → validmind-2.1.0}/validmind/unit_metrics/__init__.py +75 -70
- validmind-2.1.0/validmind/unit_metrics/classification/sklearn/Accuracy.py +14 -0
- validmind-2.1.0/validmind/unit_metrics/classification/sklearn/F1.py +13 -0
- validmind-2.1.0/validmind/unit_metrics/classification/sklearn/Precision.py +13 -0
- validmind-2.1.0/validmind/unit_metrics/classification/sklearn/ROC_AUC.py +13 -0
- validmind-2.1.0/validmind/unit_metrics/classification/sklearn/Recall.py +13 -0
- validmind-2.1.0/validmind/unit_metrics/composite.py +228 -0
- validmind-2.1.0/validmind/unit_metrics/regression/GiniCoefficient.py +33 -0
- validmind-2.1.0/validmind/unit_metrics/regression/HuberLoss.py +23 -0
- validmind-2.1.0/validmind/unit_metrics/regression/KolmogorovSmirnovStatistic.py +30 -0
- validmind-2.1.0/validmind/unit_metrics/regression/MeanAbsolutePercentageError.py +16 -0
- validmind-2.1.0/validmind/unit_metrics/regression/MeanBiasDeviation.py +13 -0
- validmind-2.1.0/validmind/unit_metrics/regression/QuantileLoss.py +15 -0
- validmind-2.1.0/validmind/unit_metrics/regression/sklearn/AdjustedRSquaredScore.py +21 -0
- validmind-2.1.0/validmind/unit_metrics/regression/sklearn/MeanAbsoluteError.py +13 -0
- validmind-2.1.0/validmind/unit_metrics/regression/sklearn/MeanSquaredError.py +13 -0
- validmind-2.1.0/validmind/unit_metrics/regression/sklearn/RSquaredScore.py +13 -0
- validmind-2.1.0/validmind/unit_metrics/regression/sklearn/RootMeanSquaredError.py +20 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/utils.py +20 -31
- {validmind-2.0.1 → validmind-2.1.0}/validmind/vm_models/__init__.py +0 -2
- validmind-2.1.0/validmind/vm_models/dataset.py +1303 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/vm_models/figure.py +52 -17
- {validmind-2.0.1 → validmind-2.1.0}/validmind/vm_models/test/metric.py +33 -31
- {validmind-2.0.1 → validmind-2.1.0}/validmind/vm_models/test/output_template.py +0 -27
- {validmind-2.0.1 → validmind-2.1.0}/validmind/vm_models/test/result_wrapper.py +68 -36
- {validmind-2.0.1 → validmind-2.1.0}/validmind/vm_models/test/test.py +4 -2
- {validmind-2.0.1 → validmind-2.1.0}/validmind/vm_models/test/threshold_test.py +24 -14
- {validmind-2.0.1 → validmind-2.1.0}/validmind/vm_models/test_context.py +7 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/vm_models/test_suite/runner.py +1 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/vm_models/test_suite/summary.py +3 -3
- {validmind-2.0.1 → validmind-2.1.0}/validmind/vm_models/test_suite/test.py +1 -1
- {validmind-2.0.1 → validmind-2.1.0}/validmind/vm_models/test_suite/test_suite.py +2 -1
- validmind-2.0.1/validmind/__version__.py +0 -1
- validmind-2.0.1/validmind/tests/__types__.py +0 -62
- validmind-2.0.1/validmind/tests/model_validation/statsmodels/LogRegressionConfusionMatrix.py +0 -128
- validmind-2.0.1/validmind/tests/model_validation/statsmodels/LogisticRegCumulativeProb.py +0 -172
- validmind-2.0.1/validmind/tests/model_validation/statsmodels/ScorecardBucketHistogram.py +0 -181
- validmind-2.0.1/validmind/tests/model_validation/statsmodels/ScorecardHistogram.py +0 -172
- validmind-2.0.1/validmind/tests/model_validation/statsmodels/ScorecardProbabilitiesHistogram.py +0 -175
- validmind-2.0.1/validmind/unit_metrics/sklearn/classification/Accuracy.py +0 -20
- validmind-2.0.1/validmind/unit_metrics/sklearn/classification/F1.py +0 -22
- validmind-2.0.1/validmind/unit_metrics/sklearn/classification/Precision.py +0 -22
- validmind-2.0.1/validmind/unit_metrics/sklearn/classification/ROC_AUC.py +0 -20
- validmind-2.0.1/validmind/unit_metrics/sklearn/classification/Recall.py +0 -20
- validmind-2.0.1/validmind/vm_models/dataset.py +0 -709
- validmind-2.0.1/validmind/vm_models/test/unit_metric.py +0 -88
- {validmind-2.0.1 → validmind-2.1.0}/LICENSE +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/README.pypi.md +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/client_config.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/__init__.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/classification/__init__.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/classification/datasets/bank_customer_churn.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/classification/datasets/taiwan_credit.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/classification/taiwan_credit.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/cluster/digits.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/nlp/datasets/Covid_19.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/nlp/twitter_covid_19.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/__init__.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/california_housing.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/datasets/fred/CPIAUCSL.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/datasets/fred/CSUSHPISA.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/datasets/fred/DRSFRMACBS.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/datasets/fred/FEDFUNDS.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/datasets/fred/GDP.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/datasets/fred/GDPC1.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/datasets/fred/GS10.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/datasets/fred/GS3.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/datasets/fred/GS5.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/datasets/fred/MORTGAGE30US.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/datasets/fred/UNRATE.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/datasets/fred_loan_rates.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/datasets/fred_loan_rates_test_1.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/datasets/fred_loan_rates_test_2.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/datasets/fred_loan_rates_test_3.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/datasets/fred_loan_rates_test_4.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/datasets/fred_loan_rates_test_5.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/datasets/lending_club_loan_rates.csv +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/fred.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/lending_club.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/models/fred_loan_rates_model_1.pkl +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/models/fred_loan_rates_model_2.pkl +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/models/fred_loan_rates_model_3.pkl +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/models/fred_loan_rates_model_4.pkl +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/datasets/regression/models/fred_loan_rates_model_5.pkl +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/html_templates/content_blocks.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/input_registry.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/models/__init__.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/models/catboost.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/models/foundation.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/models/r_model.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/models/statsmodels.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/models/xgboost.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/test_suites/classifier.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/test_suites/cluster.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/test_suites/embeddings.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/test_suites/llm.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/test_suites/nlp.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/test_suites/parameters_optimization.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/test_suites/regression.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/test_suites/statsmodels_timeseries.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/test_suites/summarization.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/test_suites/tabular_datasets.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/test_suites/text_data.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/test_suites/time_series.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/ACFandPACFPlot.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/ANOVAOneWayTable.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/AutoAR.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/AutoMA.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/AutoSeasonality.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/AutoStationarity.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/BivariateFeaturesBarPlots.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/BivariateHistograms.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/BivariateScatterPlots.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/ChiSquaredFeaturesTable.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/ClassImbalance.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/DatasetSplit.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/DefaultRatesbyRiskBandPlot.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/DescriptiveStatistics.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/Duplicates.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/EngleGrangerCoint.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/HeatmapFeatureCorrelations.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/HighCardinality.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/HighPearsonCorrelation.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/IQROutliersBarPlot.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/IQROutliersTable.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/IsolationForestOutliers.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/LaggedCorrelationHeatmap.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/MissingValues.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/MissingValuesBarPlot.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/MissingValuesRisk.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/PearsonCorrelationMatrix.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/PiTPDHistogram.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/RollingStatsPlot.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/SeasonalDecompose.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/Skewness.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/SpreadPlot.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/TabularCategoricalBarPlots.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/TabularDateTimeHistograms.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/TabularDescriptionTables.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/TabularNumericalHistograms.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/TargetRateBarPlots.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/TimeSeriesFrequency.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/TimeSeriesHistogram.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/TimeSeriesLinePlot.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/TimeSeriesMissingValues.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/TimeSeriesOutliers.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/TooManyZeroValues.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/UniqueRows.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/WOEBinPlots.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/WOEBinTable.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/__init__.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/nlp/CommonWords.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/nlp/Hashtags.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/nlp/Mentions.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/nlp/Punctuations.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/data_validation/nlp/__init__.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/ModelMetadata.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/__init__.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/embeddings/StabilityAnalysis.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/embeddings/StabilityAnalysisKeyword.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/embeddings/StabilityAnalysisRandomNoise.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/embeddings/StabilityAnalysisSynonyms.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/embeddings/StabilityAnalysisTranslation.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/AdjustedRandIndex.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/CompletenessScore.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/HomogeneityScore.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/HyperParametersTuning.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/VMeasure.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/sklearn/__init__.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/ADF.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/ADFTest.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/AutoARIMA.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/BoxPierce.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/DFGLSArch.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/FeatureImportanceAndSignificance.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/JarqueBera.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/KPSS.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/LJungBox.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/Lilliefors.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/PDRatingClassPlot.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/PhillipsPerronArch.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/RegressionCoeffsPlot.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/RegressionModelsCoeffs.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/ResidualsVisualInspection.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/RunsTest.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/ShapiroWilk.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/ZivotAndrewsArch.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/__init__.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/model_validation/statsmodels/statsutils.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/prompt_validation/Bias.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/prompt_validation/Clarity.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/prompt_validation/Conciseness.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/prompt_validation/Delimitation.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/prompt_validation/NegativeInstruction.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/prompt_validation/Robustness.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/prompt_validation/Specificity.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/tests/prompt_validation/__init__.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/vm_models/model.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/vm_models/test/metric_result.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/vm_models/test/result_summary.py +0 -0
- {validmind-2.0.1 → validmind-2.1.0}/validmind/vm_models/test/threshold_test_result.py +0 -0
@@ -1,16 +1,17 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: validmind
|
3
|
-
Version: 2.0
|
3
|
+
Version: 2.1.0
|
4
4
|
Summary: ValidMind Developer Framework
|
5
5
|
License: Commercial License
|
6
6
|
Author: Andres Rodriguez
|
7
7
|
Author-email: andres@validmind.ai
|
8
|
-
Requires-Python: >=3.8,<3.
|
8
|
+
Requires-Python: >=3.8,<3.12
|
9
9
|
Classifier: License :: Other/Proprietary License
|
10
10
|
Classifier: Programming Language :: Python :: 3
|
11
11
|
Classifier: Programming Language :: Python :: 3.8
|
12
12
|
Classifier: Programming Language :: Python :: 3.9
|
13
13
|
Classifier: Programming Language :: Python :: 3.10
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
14
15
|
Provides-Extra: all
|
15
16
|
Provides-Extra: llm
|
16
17
|
Provides-Extra: pytorch
|
@@ -21,36 +22,35 @@ Requires-Dist: arch (>=5.4.0,<6.0.0)
|
|
21
22
|
Requires-Dist: bert-score (>=0.3.13,<0.4.0)
|
22
23
|
Requires-Dist: catboost (>=1.2,<2.0)
|
23
24
|
Requires-Dist: click (>=8.0.4,<9.0.0)
|
24
|
-
Requires-Dist: datasets (>=2.14.5,<3.0.0) ; extra == "all" or extra == "llm"
|
25
|
-
Requires-Dist: dython (>=0.7.1,<0.8.0)
|
26
25
|
Requires-Dist: evaluate (>=0.4.0,<0.5.0)
|
27
|
-
Requires-Dist: ipython (==7.34.0)
|
28
26
|
Requires-Dist: ipywidgets (>=8.0.6,<9.0.0)
|
29
|
-
Requires-Dist:
|
30
|
-
Requires-Dist: kaleido (==0.2.1)
|
27
|
+
Requires-Dist: kaleido (>=0.2.1,<0.3.0,!=0.2.1.post1)
|
31
28
|
Requires-Dist: langdetect (>=1.0.9,<2.0.0)
|
32
29
|
Requires-Dist: levenshtein (>=0.21.1,<0.22.0) ; extra == "all" or extra == "llm"
|
33
|
-
Requires-Dist:
|
34
|
-
Requires-Dist:
|
30
|
+
Requires-Dist: llvmlite (>=0.42.0) ; python_version >= "3.12"
|
31
|
+
Requires-Dist: llvmlite ; python_version >= "3.8" and python_full_version <= "3.11.0"
|
32
|
+
Requires-Dist: matplotlib (<3.8.3)
|
33
|
+
Requires-Dist: mistune (>=3.0.2,<4.0.0)
|
35
34
|
Requires-Dist: nltk (>=3.8.1,<4.0.0)
|
36
|
-
Requires-Dist:
|
35
|
+
Requires-Dist: numba (<0.59.0)
|
36
|
+
Requires-Dist: numpy (>=1.23.3,<2.0.0) ; python_version >= "3.8" and python_full_version <= "3.11.0"
|
37
|
+
Requires-Dist: numpy (>=1.26.0) ; python_version >= "3.12"
|
37
38
|
Requires-Dist: openai (>=1.3.7,<2.0.0) ; extra == "all" or extra == "llm"
|
38
|
-
Requires-Dist: pandas (
|
39
|
-
Requires-Dist: pandas-profiling (>=3.6.6,<4.0.0)
|
40
|
-
Requires-Dist: pdoc (>=13.1.1,<14.0.0)
|
39
|
+
Requires-Dist: pandas (>=1.1,<2)
|
41
40
|
Requires-Dist: plotly (>=5.14.1,<6.0.0)
|
42
41
|
Requires-Dist: plotly-express (>=0.4.1,<0.5.0)
|
42
|
+
Requires-Dist: polars (>=0.20.15,<0.21.0)
|
43
43
|
Requires-Dist: pycocoevalcap (>=1.2,<2.0) ; extra == "all" or extra == "llm"
|
44
|
-
Requires-Dist: pydantic (>=1.9.1,<2.0.0)
|
45
44
|
Requires-Dist: pypmml (>=0.9.17,<0.10.0)
|
46
45
|
Requires-Dist: python-dotenv (>=0.20.0,<0.21.0)
|
47
|
-
Requires-Dist: requests (>=2.27.1,<3.0.0)
|
48
46
|
Requires-Dist: rouge (>=1.0.1,<2.0.0)
|
49
47
|
Requires-Dist: rpy2 (>=3.5.10,<4.0.0) ; extra == "all" or extra == "r-support"
|
50
48
|
Requires-Dist: scikit-learn (>=1.0.2,<2.0.0)
|
49
|
+
Requires-Dist: scipy (>=1.12) ; python_version >= "3.12"
|
50
|
+
Requires-Dist: scipy ; python_version >= "3.8" and python_full_version <= "3.11.0"
|
51
51
|
Requires-Dist: scorecardpy (>=0.1.9.6,<0.2.0.0)
|
52
52
|
Requires-Dist: seaborn (>=0.11.2,<0.12.0)
|
53
|
-
Requires-Dist:
|
53
|
+
Requires-Dist: selfcheckgpt (>=0.1.7,<0.2.0)
|
54
54
|
Requires-Dist: sentry-sdk (>=1.24.0,<2.0.0)
|
55
55
|
Requires-Dist: shap (>=0.42.0,<0.43.0)
|
56
56
|
Requires-Dist: statsmodels (>=0.13.5,<0.14.0)
|
@@ -60,8 +60,8 @@ Requires-Dist: torch (>=1.10.0) ; extra == "all" or extra == "llm" or extra == "
|
|
60
60
|
Requires-Dist: torchmetrics (>=1.1.1,<2.0.0) ; extra == "all" or extra == "llm"
|
61
61
|
Requires-Dist: tqdm (>=4.64.0,<5.0.0)
|
62
62
|
Requires-Dist: transformers (>=4.32.0,<5.0.0) ; extra == "all" or extra == "llm" or extra == "transformers"
|
63
|
-
Requires-Dist:
|
64
|
-
Requires-Dist:
|
63
|
+
Requires-Dist: xgboost (>=1.5.2,<3)
|
64
|
+
Requires-Dist: ydata-profiling (>=4.7.0,<5.0.0)
|
65
65
|
Description-Content-Type: text/markdown
|
66
66
|
|
67
67
|
# ValidMind Developer Framework
|
@@ -10,7 +10,7 @@ description = "ValidMind Developer Framework"
|
|
10
10
|
license = "Commercial License"
|
11
11
|
name = "validmind"
|
12
12
|
readme = "README.pypi.md"
|
13
|
-
version = "2.0
|
13
|
+
version = "2.1.0"
|
14
14
|
|
15
15
|
[tool.poetry.dependencies]
|
16
16
|
aiohttp = {extras = ["speedups"], version = "^3.8.4"}
|
@@ -18,37 +18,42 @@ arch = "^5.4.0"
|
|
18
18
|
bert-score = "^0.3.13"
|
19
19
|
catboost = "^1.2"
|
20
20
|
click = "^8.0.4"
|
21
|
-
datasets = {version = "^2.14.5", optional = true}
|
22
|
-
dython = "^0.7.1"
|
23
21
|
evaluate = "^0.4.0"
|
24
|
-
ipython = "7.34.0"
|
25
22
|
ipywidgets = "^8.0.6"
|
26
|
-
|
27
|
-
kaleido = "0.2.1"
|
23
|
+
kaleido = "^0.2.1,!=0.2.1.post1"
|
28
24
|
langdetect = "^1.0.9"
|
29
25
|
levenshtein = {version = "^0.21.1", optional = true}
|
30
|
-
|
31
|
-
|
26
|
+
llvmlite = [
|
27
|
+
{version = "*", python = ">=3.8,<=3.11"},
|
28
|
+
{version = ">=0.42.0", python = ">=3.12"},
|
29
|
+
]
|
30
|
+
matplotlib = "<3.8.3"
|
31
|
+
mistune = "^3.0.2"
|
32
32
|
nltk = "^3.8.1"
|
33
|
-
|
33
|
+
numba = "<0.59.0" # TODO: https://github.com/validmind/developer-framework/pull/28
|
34
|
+
numpy = [
|
35
|
+
{version = "^1.23.3", python = ">=3.8,<=3.11"},
|
36
|
+
{version = ">=1.26.0", python = ">=3.12"},
|
37
|
+
]
|
34
38
|
openai = {version = "^1.3.7", optional = true}
|
35
|
-
pandas = "1.
|
36
|
-
pandas-profiling = "^3.6.6"
|
37
|
-
pdoc = "^13.1.1"
|
39
|
+
pandas = ">=1.1,<2" # TODO small issues blocking 2.0 but it would speed things up to use arrow backend
|
38
40
|
plotly = "^5.14.1"
|
39
41
|
plotly-express = "^0.4.1"
|
42
|
+
polars = "^0.20.15"
|
40
43
|
pycocoevalcap = {version = "^1.2", optional = true}
|
41
|
-
pydantic = "^1.9.1"
|
42
44
|
pypmml = "^0.9.17"
|
43
|
-
python = ">=3.8,<3.
|
45
|
+
python = ">=3.8,<3.12"
|
44
46
|
python-dotenv = "^0.20.0"
|
45
|
-
requests = "^2.27.1"
|
46
47
|
rouge = "^1.0.1"
|
47
48
|
rpy2 = {version = "^3.5.10", optional = true}
|
48
49
|
scikit-learn = "^1.0.2"
|
50
|
+
scipy = [
|
51
|
+
{version = "*", python = ">=3.8,<=3.11"},
|
52
|
+
{version = ">=1.12", python = ">=3.12"},
|
53
|
+
]
|
49
54
|
scorecardpy = "^0.1.9.6"
|
50
55
|
seaborn = "^0.11.2"
|
51
|
-
|
56
|
+
selfcheckgpt = "^0.1.7"
|
52
57
|
sentry-sdk = "^1.24.0"
|
53
58
|
shap = "^0.42.0"
|
54
59
|
statsmodels = "^0.13.5"
|
@@ -57,9 +62,9 @@ textstat = "^0.7.3"
|
|
57
62
|
torch = {version = ">=1.10.0", optional = true}
|
58
63
|
torchmetrics = {version = "^1.1.1", optional = true}
|
59
64
|
tqdm = "^4.64.0"
|
60
|
-
transformers = "^4.32.0"
|
61
|
-
|
62
|
-
|
65
|
+
transformers = {version = "^4.32.0", optional = true}
|
66
|
+
xgboost = ">=1.5.2,<3"
|
67
|
+
ydata-profiling = "^4.7.0"
|
63
68
|
|
64
69
|
[tool.poetry.group.dev.dependencies]
|
65
70
|
black = "^22.1.0"
|
@@ -69,9 +74,10 @@ flake8 = "^4.0.1"
|
|
69
74
|
gradio = "^3.43.2"
|
70
75
|
ipykernel = "^6.22.0"
|
71
76
|
isort = "^5.12.0"
|
72
|
-
|
77
|
+
jupyter = "^1.0.0"
|
73
78
|
openai = "^1.3.7"
|
74
79
|
papermill = "^2.4.0"
|
80
|
+
pdoc = "^14.4.0"
|
75
81
|
pre-commit = "^3.3.3"
|
76
82
|
pytest = "^5.2"
|
77
83
|
sphinx = "^6.1.3"
|
@@ -88,7 +94,6 @@ all = [
|
|
88
94
|
"pycocoevalcap",
|
89
95
|
"torchmetrics",
|
90
96
|
"levenshtein",
|
91
|
-
"datasets",
|
92
97
|
]
|
93
98
|
llm = [
|
94
99
|
"torch",
|
@@ -97,7 +102,6 @@ llm = [
|
|
97
102
|
"pycocoevalcap",
|
98
103
|
"torchmetrics",
|
99
104
|
"levenshtein",
|
100
|
-
"datasets",
|
101
105
|
]
|
102
106
|
pytorch = ["torch"]
|
103
107
|
r-support = ["rpy2"]
|
@@ -110,3 +114,6 @@ requires = ["poetry-core>=1.0.0"]
|
|
110
114
|
[tool.isort]
|
111
115
|
known_first_party = "validmind"
|
112
116
|
profile = "black"
|
117
|
+
|
118
|
+
[tool.poetry.scripts]
|
119
|
+
vm-create-new-test = "scripts.create_new_test:generate_test"
|
@@ -50,7 +50,7 @@ from .__version__ import __version__ # noqa: E402
|
|
50
50
|
from .api_client import init
|
51
51
|
from .api_client import log_figure as _log_figure_async
|
52
52
|
from .api_client import log_metrics as _log_metrics_async
|
53
|
-
from .api_client import log_test_results
|
53
|
+
from .api_client import log_test_results, reload
|
54
54
|
from .client import ( # noqa: E402
|
55
55
|
get_test_suite,
|
56
56
|
init_dataset,
|
@@ -60,7 +60,7 @@ from .client import ( # noqa: E402
|
|
60
60
|
run_documentation_tests,
|
61
61
|
run_test_suite,
|
62
62
|
)
|
63
|
-
from .
|
63
|
+
from .tests.decorator import metric, tags, tasks
|
64
64
|
from .utils import run_async # noqa: E402
|
65
65
|
|
66
66
|
|
@@ -105,9 +105,13 @@ __all__ = [ # noqa
|
|
105
105
|
"init_dataset",
|
106
106
|
"init_model",
|
107
107
|
"init_r_model",
|
108
|
+
"metric",
|
108
109
|
"preview_template",
|
110
|
+
"reload",
|
109
111
|
"run_documentation_tests",
|
110
112
|
"run_test_suite",
|
113
|
+
"tags",
|
114
|
+
"tasks",
|
111
115
|
"tests",
|
112
116
|
"test_suites",
|
113
117
|
"vm_models",
|
@@ -116,5 +120,4 @@ __all__ = [ # noqa
|
|
116
120
|
"log_figure",
|
117
121
|
"log_metrics",
|
118
122
|
"log_test_results",
|
119
|
-
"run_metric",
|
120
123
|
]
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "2.1.0"
|
@@ -0,0 +1,193 @@
|
|
1
|
+
# Copyright © 2023-2024 ValidMind Inc. All rights reserved.
|
2
|
+
# See the LICENSE file in the root of this repository for details.
|
3
|
+
# SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial
|
4
|
+
|
5
|
+
import concurrent.futures
|
6
|
+
import os
|
7
|
+
|
8
|
+
from openai import AzureOpenAI, OpenAI
|
9
|
+
|
10
|
+
SYSTEM_PROMPT = """
|
11
|
+
You are an expert data scientist and MRM specialist tasked with providing concise and'
|
12
|
+
objective insights based on the results of quantitative model or dataset analysis.
|
13
|
+
|
14
|
+
Examine the provided statistical test results and compose a brief summary. Highlight crucial
|
15
|
+
insights, focusing on the distribution characteristics, central tendencies (such as mean or median),
|
16
|
+
and the variability (including standard deviation and range) of the metrics. Evaluate how
|
17
|
+
these statistics might influence the development and performance of a predictive model. Identify
|
18
|
+
and explain any discernible trends or anomalies in the test results.
|
19
|
+
|
20
|
+
Your analysis will act as the description of the result in the model documentation.
|
21
|
+
|
22
|
+
Avoid long sentences and complex vocabulary.
|
23
|
+
Structure the response clearly and logically.
|
24
|
+
Use valid Markdown syntax to format the response (tables are supported).
|
25
|
+
Use the Test ID that is provided to form the Test Name e.g. "ClassImbalance" -> "Class Imbalance".
|
26
|
+
Use the following format for the response (feel free to modify slightly if necessary):
|
27
|
+
```
|
28
|
+
**<Test Name>** <continue to explain what it does in detail>...
|
29
|
+
|
30
|
+
The results of this test <detailed explanation of the results>...
|
31
|
+
|
32
|
+
In summary the following key insights can be gained:
|
33
|
+
|
34
|
+
- **<key insight 1 - title>**: <explanation of key insight 1>
|
35
|
+
- ...<continue with any other key insights using the same format>
|
36
|
+
```
|
37
|
+
It is very important that the text is nicely formatted and contains enough information to be useful to the user as documentation.
|
38
|
+
""".strip()
|
39
|
+
USER_PROMPT = """
|
40
|
+
Test ID: {test_name}
|
41
|
+
Test Description: {test_description}
|
42
|
+
Test Results (the raw results of the test):
|
43
|
+
{test_results}
|
44
|
+
Test Summary (what the user sees in the documentation):
|
45
|
+
{test_summary}
|
46
|
+
""".strip()
|
47
|
+
USER_PROMPT_FIGURES = """
|
48
|
+
Test ID: {test_name}
|
49
|
+
Test Description: {test_description}
|
50
|
+
The attached plots show the results of the test.
|
51
|
+
""".strip()
|
52
|
+
|
53
|
+
__client = None
|
54
|
+
__model = None
|
55
|
+
|
56
|
+
__executor = concurrent.futures.ThreadPoolExecutor()
|
57
|
+
|
58
|
+
|
59
|
+
def __get_client_and_model():
|
60
|
+
"""
|
61
|
+
Get the model to use for generating interpretations
|
62
|
+
"""
|
63
|
+
global __client, __model
|
64
|
+
|
65
|
+
if __client and __model:
|
66
|
+
return __client, __model
|
67
|
+
|
68
|
+
if "OPENAI_API_KEY" in os.environ:
|
69
|
+
__client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
|
70
|
+
__model = os.environ.get("VM_OPENAI_MODEL", "gpt-4-turbo")
|
71
|
+
|
72
|
+
elif "AZURE_OPENAI_KEY" in os.environ:
|
73
|
+
if "AZURE_OPENAI_ENDPOINT" not in os.environ:
|
74
|
+
raise ValueError(
|
75
|
+
"AZURE_OPENAI_ENDPOINT must be set to run LLM tests with Azure"
|
76
|
+
)
|
77
|
+
|
78
|
+
if "AZURE_OPENAI_MODEL" not in os.environ:
|
79
|
+
raise ValueError(
|
80
|
+
"AZURE_OPENAI_MODEL must be set to run LLM tests with Azure"
|
81
|
+
)
|
82
|
+
|
83
|
+
__client = AzureOpenAI(
|
84
|
+
azure_endpoint=os.environ.get("AZURE_OPENAI_ENDPOINT"),
|
85
|
+
api_key=os.environ.get("AZURE_OPENAI_KEY"),
|
86
|
+
api_version=os.environ.get("AZURE_OPENAI_VERSION", "2023-05-15"),
|
87
|
+
)
|
88
|
+
__model = os.environ.get("AZURE_OPENAI_MODEL")
|
89
|
+
|
90
|
+
else:
|
91
|
+
raise ValueError("OPENAI_API_KEY or AZURE_OPENAI_KEY must be set")
|
92
|
+
|
93
|
+
return __client, __model
|
94
|
+
|
95
|
+
|
96
|
+
class DescriptionFuture:
|
97
|
+
"""This will be immediately returned from generate_description so that
|
98
|
+
the tests can continue to be run in parallel while the description is
|
99
|
+
retrieved asynchronously.
|
100
|
+
|
101
|
+
The value will be retrieved later and if its not ready yet, it should
|
102
|
+
block until it is.
|
103
|
+
"""
|
104
|
+
|
105
|
+
def __init__(self, future):
|
106
|
+
self._future = future
|
107
|
+
|
108
|
+
def get_description(self):
|
109
|
+
# This will block until the future is completed
|
110
|
+
return self._future.result()
|
111
|
+
|
112
|
+
|
113
|
+
def generate_description_async(
|
114
|
+
test_name: str,
|
115
|
+
test_description: str,
|
116
|
+
test_results: str,
|
117
|
+
test_summary: str,
|
118
|
+
figures: list = None,
|
119
|
+
):
|
120
|
+
"""Generate the description for the test results"""
|
121
|
+
client, _ = __get_client_and_model()
|
122
|
+
|
123
|
+
# get last part of test id
|
124
|
+
test_name = test_name.split(".")[-1]
|
125
|
+
|
126
|
+
if not test_results and not test_summary:
|
127
|
+
if not figures:
|
128
|
+
raise ValueError("No results, summary or figures provided")
|
129
|
+
|
130
|
+
response = client.chat.completions.create(
|
131
|
+
model="gpt-4-turbo",
|
132
|
+
messages=[
|
133
|
+
{"role": "system", "content": SYSTEM_PROMPT},
|
134
|
+
{
|
135
|
+
"role": "user",
|
136
|
+
"content": [
|
137
|
+
{
|
138
|
+
"type": "text",
|
139
|
+
"text": USER_PROMPT_FIGURES.format(
|
140
|
+
test_name=test_name,
|
141
|
+
test_description=test_description,
|
142
|
+
),
|
143
|
+
},
|
144
|
+
*[
|
145
|
+
{
|
146
|
+
"type": "image_url",
|
147
|
+
"image_url": {
|
148
|
+
"url": figure._get_b64_url(),
|
149
|
+
},
|
150
|
+
}
|
151
|
+
for figure in figures
|
152
|
+
],
|
153
|
+
],
|
154
|
+
},
|
155
|
+
],
|
156
|
+
)
|
157
|
+
else:
|
158
|
+
response = client.chat.completions.create(
|
159
|
+
model="gpt-4-turbo",
|
160
|
+
messages=[
|
161
|
+
{"role": "system", "content": SYSTEM_PROMPT},
|
162
|
+
{
|
163
|
+
"role": "user",
|
164
|
+
"content": USER_PROMPT.format(
|
165
|
+
test_name=test_name,
|
166
|
+
test_description=test_description,
|
167
|
+
test_results=test_results,
|
168
|
+
test_summary=test_summary,
|
169
|
+
),
|
170
|
+
},
|
171
|
+
],
|
172
|
+
)
|
173
|
+
|
174
|
+
return response.choices[0].message.content.strip("```").strip()
|
175
|
+
|
176
|
+
|
177
|
+
def generate_description(
|
178
|
+
test_name: str,
|
179
|
+
test_description: str,
|
180
|
+
test_results: str,
|
181
|
+
test_summary: str,
|
182
|
+
figures: list = None,
|
183
|
+
):
|
184
|
+
future = __executor.submit(
|
185
|
+
generate_description_async,
|
186
|
+
test_name,
|
187
|
+
test_description,
|
188
|
+
test_results,
|
189
|
+
test_summary,
|
190
|
+
figures,
|
191
|
+
)
|
192
|
+
|
193
|
+
return DescriptionFuture(future)
|
@@ -16,6 +16,7 @@ from io import BytesIO
|
|
16
16
|
from typing import Any, Callable, Dict, List, Optional, Tuple, Union
|
17
17
|
|
18
18
|
import aiohttp
|
19
|
+
import mistune
|
19
20
|
import requests
|
20
21
|
from aiohttp import FormData
|
21
22
|
|
@@ -171,6 +172,18 @@ def __ping() -> Dict[str, Any]:
|
|
171
172
|
)
|
172
173
|
|
173
174
|
|
175
|
+
def reload():
|
176
|
+
"""Reconnect to the ValidMind API and reload the project configuration"""
|
177
|
+
|
178
|
+
try:
|
179
|
+
__ping()
|
180
|
+
except Exception as e:
|
181
|
+
# if the api host is https, assume we're not in dev mode and send to sentry
|
182
|
+
if _api_host.startswith("https://"):
|
183
|
+
send_single_error(e)
|
184
|
+
raise e
|
185
|
+
|
186
|
+
|
174
187
|
async def __get_url(endpoint: str, params: Optional[Dict[str, str]] = None) -> str:
|
175
188
|
if not _run_cuid:
|
176
189
|
start_run()
|
@@ -282,45 +295,46 @@ async def log_figures(figures: List[Figure]) -> Dict[str, Any]:
|
|
282
295
|
Returns:
|
283
296
|
dict: The response from the API
|
284
297
|
"""
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
298
|
+
# this actually slows things down - better to log them in parallel
|
299
|
+
# if client_config.can_log_figures(): # check if the backend supports batch logging
|
300
|
+
# try:
|
301
|
+
# data = {}
|
302
|
+
# files = {}
|
303
|
+
# for figure in figures:
|
304
|
+
# data.update(
|
305
|
+
# {f"{k}-{figure.key}": v for k, v in figure.serialize().items()}
|
306
|
+
# )
|
307
|
+
# files.update(
|
308
|
+
# {
|
309
|
+
# f"{k}-{figure.key}": v
|
310
|
+
# for k, v in figure.serialize_files().items()
|
311
|
+
# }
|
312
|
+
# )
|
313
|
+
|
314
|
+
# return await _post(
|
315
|
+
# "log_figures",
|
316
|
+
# data=data,
|
317
|
+
# files=files,
|
318
|
+
# )
|
319
|
+
# except Exception as e:
|
320
|
+
# logger.error("Error logging figures to ValidMind API")
|
321
|
+
# raise e
|
322
|
+
|
323
|
+
# else:
|
324
|
+
return await asyncio.gather(*[log_figure(figure) for figure in figures])
|
311
325
|
|
312
326
|
|
313
327
|
async def log_metadata(
|
314
328
|
content_id: str,
|
315
329
|
text: Optional[str] = None,
|
316
|
-
|
330
|
+
_json: Optional[Dict[str, Any]] = None,
|
317
331
|
) -> Dict[str, Any]:
|
318
332
|
"""Logs free-form metadata to ValidMind API.
|
319
333
|
|
320
334
|
Args:
|
321
335
|
content_id (str): Unique content identifier for the metadata
|
322
336
|
text (str, optional): Free-form text to assign to the metadata. Defaults to None.
|
323
|
-
|
337
|
+
_json (dict, optional): Free-form key-value pairs to assign to the metadata. Defaults to None.
|
324
338
|
|
325
339
|
Raises:
|
326
340
|
Exception: If the API call fails
|
@@ -330,9 +344,9 @@ async def log_metadata(
|
|
330
344
|
"""
|
331
345
|
metadata_dict = {"content_id": content_id}
|
332
346
|
if text is not None:
|
333
|
-
metadata_dict["text"] = text
|
334
|
-
if
|
335
|
-
metadata_dict["
|
347
|
+
metadata_dict["text"] = mistune.html(text)
|
348
|
+
if _json is not None:
|
349
|
+
metadata_dict["json"] = _json
|
336
350
|
|
337
351
|
try:
|
338
352
|
return await _post(
|
@@ -7,6 +7,7 @@ Client interface for all data and model validation functions
|
|
7
7
|
"""
|
8
8
|
|
9
9
|
import pandas as pd
|
10
|
+
import polars as pl
|
10
11
|
|
11
12
|
from .api_client import _log_input as log_input
|
12
13
|
from .client_config import client_config
|
@@ -26,7 +27,13 @@ from .template import preview_template as _preview_template
|
|
26
27
|
from .test_suites import get_by_id as get_test_suite_by_id
|
27
28
|
from .utils import get_dataset_info, get_model_info
|
28
29
|
from .vm_models import TestInput, TestSuite, TestSuiteRunner
|
29
|
-
from .vm_models.dataset import
|
30
|
+
from .vm_models.dataset import (
|
31
|
+
DataFrameDataset,
|
32
|
+
NumpyDataset,
|
33
|
+
PolarsDataset,
|
34
|
+
TorchDataset,
|
35
|
+
VMDataset,
|
36
|
+
)
|
30
37
|
from .vm_models.model import VMModel, get_model_class
|
31
38
|
|
32
39
|
pd.option_context("format.precision", 2)
|
@@ -54,11 +61,16 @@ def init_dataset(
|
|
54
61
|
"""
|
55
62
|
Initializes a VM Dataset, which can then be passed to other functions
|
56
63
|
that can perform additional analysis and tests on the data. This function
|
57
|
-
also ensures we are reading a valid dataset type.
|
58
|
-
|
64
|
+
also ensures we are reading a valid dataset type.
|
65
|
+
|
66
|
+
The following dataset types are supported:
|
67
|
+
- Pandas DataFrame
|
68
|
+
- Polars DataFrame
|
69
|
+
- Numpy ndarray
|
70
|
+
- Torch TensorDataset
|
59
71
|
|
60
72
|
Args:
|
61
|
-
dataset
|
73
|
+
dataset : dataset from various python libraries
|
62
74
|
model (VMModel): ValidMind model object
|
63
75
|
options (dict): A dictionary of options for the dataset
|
64
76
|
targets (vm.vm.DatasetTargets): A list of target variables
|
@@ -89,7 +101,7 @@ def init_dataset(
|
|
89
101
|
input_id = input_id or "dataset"
|
90
102
|
|
91
103
|
# Instantiate supported dataset types here
|
92
|
-
if
|
104
|
+
if isinstance(dataset, pd.DataFrame):
|
93
105
|
logger.info("Pandas dataset detected. Initializing VM Dataset instance...")
|
94
106
|
vm_dataset = DataFrameDataset(
|
95
107
|
input_id=input_id,
|
@@ -102,6 +114,19 @@ def init_dataset(
|
|
102
114
|
target_class_labels=class_labels,
|
103
115
|
date_time_index=date_time_index,
|
104
116
|
)
|
117
|
+
elif isinstance(dataset, pl.DataFrame):
|
118
|
+
logger.info("Polars dataset detected. Initializing VM Dataset instance...")
|
119
|
+
vm_dataset = PolarsDataset(
|
120
|
+
input_id=input_id,
|
121
|
+
raw_dataset=dataset,
|
122
|
+
model=model,
|
123
|
+
target_column=target_column,
|
124
|
+
feature_columns=feature_columns,
|
125
|
+
text_column=text_column,
|
126
|
+
extra_columns=extra_columns,
|
127
|
+
target_class_labels=class_labels,
|
128
|
+
date_time_index=date_time_index,
|
129
|
+
)
|
105
130
|
elif dataset_class == "ndarray":
|
106
131
|
logger.info("Numpy ndarray detected. Initializing VM Dataset instance...")
|
107
132
|
vm_dataset = NumpyDataset(
|
@@ -360,7 +385,7 @@ def preview_template():
|
|
360
385
|
|
361
386
|
|
362
387
|
def run_documentation_tests(
|
363
|
-
section=None, send=True, fail_fast=False, inputs=None, **kwargs
|
388
|
+
section=None, send=True, fail_fast=False, inputs=None, config=None, **kwargs
|
364
389
|
):
|
365
390
|
"""Collect and run all the tests associated with a template
|
366
391
|
|
@@ -373,6 +398,7 @@ def run_documentation_tests(
|
|
373
398
|
send (bool, optional): Whether to send the results to the ValidMind API. Defaults to True.
|
374
399
|
fail_fast (bool, optional): Whether to stop running tests after the first failure. Defaults to False.
|
375
400
|
inputs (dict, optional): A dictionary of test inputs to pass to the TestSuite
|
401
|
+
config: A dictionary of test parameters to override the defaults
|
376
402
|
**kwargs: backwards compatibility for passing in test inputs using keyword arguments
|
377
403
|
|
378
404
|
Returns:
|
@@ -401,6 +427,7 @@ def run_documentation_tests(
|
|
401
427
|
send=send,
|
402
428
|
fail_fast=fail_fast,
|
403
429
|
inputs=inputs,
|
430
|
+
config=config,
|
404
431
|
**kwargs,
|
405
432
|
)
|
406
433
|
test_suites[_section] = test_suite
|
@@ -60,7 +60,7 @@ def preprocess(df):
|
|
60
60
|
return train_df, validation_df, test_df
|
61
61
|
|
62
62
|
|
63
|
-
def get_demo_test_config():
|
63
|
+
def get_demo_test_config(test_suite=None):
|
64
64
|
"""
|
65
65
|
Returns input configuration for the default documentation
|
66
66
|
template assigned to this demo model
|
@@ -81,7 +81,7 @@ def get_demo_test_config():
|
|
81
81
|
- The only exception is ClassifierPerformance since that runs twice: once
|
82
82
|
with the train_dataset (in sample) and once with the test_dataset (out of sample)
|
83
83
|
"""
|
84
|
-
default_config = vm.get_test_suite().get_default_config()
|
84
|
+
default_config = (test_suite or vm.get_test_suite()).get_default_config()
|
85
85
|
|
86
86
|
for _, test_config in default_config.items():
|
87
87
|
if "model" in test_config["inputs"]:
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# Copyright © 2023-2024 ValidMind Inc. All rights reserved.
|
2
|
+
# See the LICENSE file in the root of this repository for details.
|
3
|
+
# SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial
|
4
|
+
|
5
|
+
"""
|
6
|
+
Entrypoint for credit risk datasets.
|
7
|
+
"""
|
8
|
+
|
9
|
+
__all__ = [
|
10
|
+
"lending_club",
|
11
|
+
]
|