validmind 2.6.10__tar.gz → 2.7.2__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.
Files changed (317) hide show
  1. {validmind-2.6.10 → validmind-2.7.2}/PKG-INFO +1 -1
  2. {validmind-2.6.10 → validmind-2.7.2}/pyproject.toml +1 -1
  3. {validmind-2.6.10 → validmind-2.7.2}/validmind/__init__.py +2 -0
  4. validmind-2.7.2/validmind/__version__.py +1 -0
  5. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/ROCCurve.py +26 -23
  6. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/output.py +10 -1
  7. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/run.py +29 -2
  8. {validmind-2.6.10 → validmind-2.7.2}/validmind/utils.py +11 -0
  9. {validmind-2.6.10 → validmind-2.7.2}/validmind/vm_models/figure.py +15 -0
  10. {validmind-2.6.10 → validmind-2.7.2}/validmind/vm_models/result/__init__.py +2 -2
  11. {validmind-2.6.10 → validmind-2.7.2}/validmind/vm_models/result/result.py +118 -6
  12. validmind-2.6.10/validmind/__version__.py +0 -1
  13. {validmind-2.6.10 → validmind-2.7.2}/LICENSE +0 -0
  14. {validmind-2.6.10 → validmind-2.7.2}/README.pypi.md +0 -0
  15. {validmind-2.6.10 → validmind-2.7.2}/validmind/ai/test_descriptions.py +0 -0
  16. {validmind-2.6.10 → validmind-2.7.2}/validmind/ai/test_result_description/config.yaml +0 -0
  17. {validmind-2.6.10 → validmind-2.7.2}/validmind/ai/test_result_description/context.py +0 -0
  18. {validmind-2.6.10 → validmind-2.7.2}/validmind/ai/test_result_description/image_processing.py +0 -0
  19. {validmind-2.6.10 → validmind-2.7.2}/validmind/ai/test_result_description/system.jinja +0 -0
  20. {validmind-2.6.10 → validmind-2.7.2}/validmind/ai/test_result_description/user.jinja +0 -0
  21. {validmind-2.6.10 → validmind-2.7.2}/validmind/ai/utils.py +0 -0
  22. {validmind-2.6.10 → validmind-2.7.2}/validmind/api_client.py +0 -0
  23. {validmind-2.6.10 → validmind-2.7.2}/validmind/client.py +0 -0
  24. {validmind-2.6.10 → validmind-2.7.2}/validmind/client_config.py +0 -0
  25. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/__init__.py +0 -0
  26. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/classification/__init__.py +0 -0
  27. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/classification/customer_churn.py +0 -0
  28. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/classification/datasets/bank_customer_churn.csv +0 -0
  29. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/classification/datasets/taiwan_credit.csv +0 -0
  30. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/classification/taiwan_credit.py +0 -0
  31. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/cluster/digits.py +0 -0
  32. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/credit_risk/__init__.py +0 -0
  33. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/credit_risk/datasets/lending_club_biased.csv.gz +0 -0
  34. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/credit_risk/datasets/lending_club_loan_data_2007_2014_clean.csv.gz +0 -0
  35. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/credit_risk/lending_club.py +0 -0
  36. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/credit_risk/lending_club_bias.py +0 -0
  37. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/llm/rag/__init__.py +0 -0
  38. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_1.csv +0 -0
  39. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_2.csv +0 -0
  40. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_3.csv +0 -0
  41. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_4.csv +0 -0
  42. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_5.csv +0 -0
  43. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/llm/rag/rfp.py +0 -0
  44. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/nlp/__init__.py +0 -0
  45. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/nlp/cnn_dailymail.py +0 -0
  46. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/nlp/datasets/Covid_19.csv +0 -0
  47. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/nlp/datasets/cnn_dailymail_100_with_predictions.csv +0 -0
  48. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/nlp/datasets/cnn_dailymail_500_with_predictions.csv +0 -0
  49. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/nlp/datasets/sentiments_with_predictions.csv +0 -0
  50. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/nlp/twitter_covid_19.py +0 -0
  51. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/__init__.py +0 -0
  52. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/california_housing.py +0 -0
  53. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/datasets/fred/CPIAUCSL.csv +0 -0
  54. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/datasets/fred/CSUSHPISA.csv +0 -0
  55. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/datasets/fred/DRSFRMACBS.csv +0 -0
  56. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/datasets/fred/FEDFUNDS.csv +0 -0
  57. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/datasets/fred/GDP.csv +0 -0
  58. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/datasets/fred/GDPC1.csv +0 -0
  59. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/datasets/fred/GS10.csv +0 -0
  60. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/datasets/fred/GS3.csv +0 -0
  61. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/datasets/fred/GS5.csv +0 -0
  62. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/datasets/fred/MORTGAGE30US.csv +0 -0
  63. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/datasets/fred/UNRATE.csv +0 -0
  64. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/datasets/fred_loan_rates.csv +0 -0
  65. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/datasets/fred_loan_rates_test_1.csv +0 -0
  66. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/datasets/fred_loan_rates_test_2.csv +0 -0
  67. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/datasets/fred_loan_rates_test_3.csv +0 -0
  68. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/datasets/fred_loan_rates_test_4.csv +0 -0
  69. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/datasets/fred_loan_rates_test_5.csv +0 -0
  70. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/datasets/leanding_club_loan_rates.csv +0 -0
  71. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/fred.py +0 -0
  72. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/fred_timeseries.py +0 -0
  73. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/lending_club.py +0 -0
  74. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/models/fred_loan_rates_model_1.pkl +0 -0
  75. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/models/fred_loan_rates_model_2.pkl +0 -0
  76. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/models/fred_loan_rates_model_3.pkl +0 -0
  77. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/models/fred_loan_rates_model_4.pkl +0 -0
  78. {validmind-2.6.10 → validmind-2.7.2}/validmind/datasets/regression/models/fred_loan_rates_model_5.pkl +0 -0
  79. {validmind-2.6.10 → validmind-2.7.2}/validmind/errors.py +0 -0
  80. {validmind-2.6.10 → validmind-2.7.2}/validmind/html_templates/__init__.py +0 -0
  81. {validmind-2.6.10 → validmind-2.7.2}/validmind/html_templates/content_blocks.py +0 -0
  82. {validmind-2.6.10 → validmind-2.7.2}/validmind/input_registry.py +0 -0
  83. {validmind-2.6.10 → validmind-2.7.2}/validmind/logging.py +0 -0
  84. {validmind-2.6.10 → validmind-2.7.2}/validmind/models/__init__.py +0 -0
  85. {validmind-2.6.10 → validmind-2.7.2}/validmind/models/foundation.py +0 -0
  86. {validmind-2.6.10 → validmind-2.7.2}/validmind/models/function.py +0 -0
  87. {validmind-2.6.10 → validmind-2.7.2}/validmind/models/huggingface.py +0 -0
  88. {validmind-2.6.10 → validmind-2.7.2}/validmind/models/metadata.py +0 -0
  89. {validmind-2.6.10 → validmind-2.7.2}/validmind/models/pipeline.py +0 -0
  90. {validmind-2.6.10 → validmind-2.7.2}/validmind/models/pytorch.py +0 -0
  91. {validmind-2.6.10 → validmind-2.7.2}/validmind/models/r_model.py +0 -0
  92. {validmind-2.6.10 → validmind-2.7.2}/validmind/models/sklearn.py +0 -0
  93. {validmind-2.6.10 → validmind-2.7.2}/validmind/template.py +0 -0
  94. {validmind-2.6.10 → validmind-2.7.2}/validmind/test_suites/__init__.py +0 -0
  95. {validmind-2.6.10 → validmind-2.7.2}/validmind/test_suites/classifier.py +0 -0
  96. {validmind-2.6.10 → validmind-2.7.2}/validmind/test_suites/cluster.py +0 -0
  97. {validmind-2.6.10 → validmind-2.7.2}/validmind/test_suites/embeddings.py +0 -0
  98. {validmind-2.6.10 → validmind-2.7.2}/validmind/test_suites/llm.py +0 -0
  99. {validmind-2.6.10 → validmind-2.7.2}/validmind/test_suites/nlp.py +0 -0
  100. {validmind-2.6.10 → validmind-2.7.2}/validmind/test_suites/parameters_optimization.py +0 -0
  101. {validmind-2.6.10 → validmind-2.7.2}/validmind/test_suites/regression.py +0 -0
  102. {validmind-2.6.10 → validmind-2.7.2}/validmind/test_suites/statsmodels_timeseries.py +0 -0
  103. {validmind-2.6.10 → validmind-2.7.2}/validmind/test_suites/summarization.py +0 -0
  104. {validmind-2.6.10 → validmind-2.7.2}/validmind/test_suites/tabular_datasets.py +0 -0
  105. {validmind-2.6.10 → validmind-2.7.2}/validmind/test_suites/text_data.py +0 -0
  106. {validmind-2.6.10 → validmind-2.7.2}/validmind/test_suites/time_series.py +0 -0
  107. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/__init__.py +0 -0
  108. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/__types__.py +0 -0
  109. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/_store.py +0 -0
  110. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/comparison.py +0 -0
  111. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/ACFandPACFPlot.py +0 -0
  112. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/ADF.py +0 -0
  113. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/AutoAR.py +0 -0
  114. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/AutoMA.py +0 -0
  115. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/AutoStationarity.py +0 -0
  116. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/BivariateScatterPlots.py +0 -0
  117. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/BoxPierce.py +0 -0
  118. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/ChiSquaredFeaturesTable.py +0 -0
  119. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/ClassImbalance.py +0 -0
  120. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/DatasetDescription.py +0 -0
  121. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/DatasetSplit.py +0 -0
  122. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/DescriptiveStatistics.py +0 -0
  123. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/DickeyFullerGLS.py +0 -0
  124. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/Duplicates.py +0 -0
  125. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/EngleGrangerCoint.py +0 -0
  126. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/FeatureTargetCorrelationPlot.py +0 -0
  127. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/HighCardinality.py +0 -0
  128. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/HighPearsonCorrelation.py +0 -0
  129. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/IQROutliersBarPlot.py +0 -0
  130. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/IQROutliersTable.py +0 -0
  131. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/IsolationForestOutliers.py +0 -0
  132. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/JarqueBera.py +0 -0
  133. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/KPSS.py +0 -0
  134. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/LJungBox.py +0 -0
  135. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/LaggedCorrelationHeatmap.py +0 -0
  136. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/MissingValues.py +0 -0
  137. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/MissingValuesBarPlot.py +0 -0
  138. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/PearsonCorrelationMatrix.py +0 -0
  139. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/PhillipsPerronArch.py +0 -0
  140. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/ProtectedClassesCombination.py +0 -0
  141. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/ProtectedClassesDescription.py +0 -0
  142. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/ProtectedClassesDisparity.py +0 -0
  143. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.py +0 -0
  144. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/RollingStatsPlot.py +0 -0
  145. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/RunsTest.py +0 -0
  146. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/ScatterPlot.py +0 -0
  147. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/SeasonalDecompose.py +0 -0
  148. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/ShapiroWilk.py +0 -0
  149. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/Skewness.py +0 -0
  150. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/SpreadPlot.py +0 -0
  151. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/TabularCategoricalBarPlots.py +0 -0
  152. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/TabularDateTimeHistograms.py +0 -0
  153. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/TabularDescriptionTables.py +0 -0
  154. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/TabularNumericalHistograms.py +0 -0
  155. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/TargetRateBarPlots.py +0 -0
  156. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/TimeSeriesDescription.py +0 -0
  157. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.py +0 -0
  158. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/TimeSeriesFrequency.py +0 -0
  159. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/TimeSeriesHistogram.py +0 -0
  160. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/TimeSeriesLinePlot.py +0 -0
  161. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/TimeSeriesMissingValues.py +0 -0
  162. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/TimeSeriesOutliers.py +0 -0
  163. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/TooManyZeroValues.py +0 -0
  164. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/UniqueRows.py +0 -0
  165. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/WOEBinPlots.py +0 -0
  166. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/WOEBinTable.py +0 -0
  167. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/ZivotAndrewsArch.py +0 -0
  168. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/__init__.py +0 -0
  169. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/nlp/CommonWords.py +0 -0
  170. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/nlp/Hashtags.py +0 -0
  171. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/nlp/LanguageDetection.py +0 -0
  172. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/nlp/Mentions.py +0 -0
  173. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.py +0 -0
  174. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/nlp/Punctuations.py +0 -0
  175. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/nlp/Sentiment.py +0 -0
  176. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/nlp/StopWords.py +0 -0
  177. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/nlp/TextDescription.py +0 -0
  178. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/nlp/Toxicity.py +0 -0
  179. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/data_validation/nlp/__init__.py +0 -0
  180. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/decorator.py +0 -0
  181. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/load.py +0 -0
  182. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/BertScore.py +0 -0
  183. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/BleuScore.py +0 -0
  184. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/ClusterSizeDistribution.py +0 -0
  185. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/ContextualRecall.py +0 -0
  186. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/FeaturesAUC.py +0 -0
  187. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/MeteorScore.py +0 -0
  188. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/ModelMetadata.py +0 -0
  189. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/ModelPredictionResiduals.py +0 -0
  190. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/RegardScore.py +0 -0
  191. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/RegressionResidualsPlot.py +0 -0
  192. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/RougeScore.py +0 -0
  193. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/TimeSeriesPredictionWithCI.py +0 -0
  194. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/TimeSeriesPredictionsPlot.py +0 -0
  195. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.py +0 -0
  196. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/TokenDisparity.py +0 -0
  197. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/ToxicityScore.py +0 -0
  198. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/__init__.py +0 -0
  199. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/embeddings/ClusterDistribution.py +0 -0
  200. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/embeddings/CosineSimilarityComparison.py +0 -0
  201. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/embeddings/CosineSimilarityDistribution.py +0 -0
  202. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/embeddings/CosineSimilarityHeatmap.py +0 -0
  203. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/embeddings/DescriptiveAnalytics.py +0 -0
  204. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/embeddings/EmbeddingsVisualization2D.py +0 -0
  205. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/embeddings/EuclideanDistanceComparison.py +0 -0
  206. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/embeddings/EuclideanDistanceHeatmap.py +0 -0
  207. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/embeddings/PCAComponentsPairwisePlots.py +0 -0
  208. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/embeddings/StabilityAnalysisKeyword.py +0 -0
  209. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/embeddings/StabilityAnalysisRandomNoise.py +0 -0
  210. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/embeddings/StabilityAnalysisSynonyms.py +0 -0
  211. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/embeddings/StabilityAnalysisTranslation.py +0 -0
  212. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/embeddings/TSNEComponentsPairwisePlots.py +0 -0
  213. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/embeddings/utils.py +0 -0
  214. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/ragas/AnswerCorrectness.py +0 -0
  215. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/ragas/AspectCritic.py +0 -0
  216. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/ragas/ContextEntityRecall.py +0 -0
  217. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/ragas/ContextPrecision.py +0 -0
  218. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/ragas/ContextPrecisionWithoutReference.py +0 -0
  219. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/ragas/ContextRecall.py +0 -0
  220. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/ragas/Faithfulness.py +0 -0
  221. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/ragas/NoiseSensitivity.py +0 -0
  222. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/ragas/ResponseRelevancy.py +0 -0
  223. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/ragas/SemanticSimilarity.py +0 -0
  224. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/ragas/utils.py +0 -0
  225. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.py +0 -0
  226. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/AdjustedRandIndex.py +0 -0
  227. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/ClassifierPerformance.py +0 -0
  228. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.py +0 -0
  229. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.py +0 -0
  230. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/CompletenessScore.py +0 -0
  231. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/ConfusionMatrix.py +0 -0
  232. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/FeatureImportance.py +0 -0
  233. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.py +0 -0
  234. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/HomogeneityScore.py +0 -0
  235. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/HyperParametersTuning.py +0 -0
  236. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.py +0 -0
  237. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/MinimumAccuracy.py +0 -0
  238. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/MinimumF1Score.py +0 -0
  239. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.py +0 -0
  240. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.py +0 -0
  241. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/OverfitDiagnosis.py +0 -0
  242. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.py +0 -0
  243. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.py +0 -0
  244. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.py +0 -0
  245. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/RegressionErrors.py +0 -0
  246. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.py +0 -0
  247. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/RegressionPerformance.py +0 -0
  248. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/RegressionR2Square.py +0 -0
  249. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.py +0 -0
  250. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.py +0 -0
  251. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.py +0 -0
  252. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/SilhouettePlot.py +0 -0
  253. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/TrainingTestDegradation.py +0 -0
  254. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/VMeasure.py +0 -0
  255. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.py +0 -0
  256. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/sklearn/__init__.py +0 -0
  257. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/statsmodels/AutoARIMA.py +0 -0
  258. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.py +0 -0
  259. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.py +0 -0
  260. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/statsmodels/GINITable.py +0 -0
  261. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.py +0 -0
  262. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/statsmodels/Lilliefors.py +0 -0
  263. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.py +0 -0
  264. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/statsmodels/RegressionCoeffs.py +0 -0
  265. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.py +0 -0
  266. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.py +0 -0
  267. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.py +0 -0
  268. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.py +0 -0
  269. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/statsmodels/RegressionModelSummary.py +0 -0
  270. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.py +0 -0
  271. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/statsmodels/ScorecardHistogram.py +0 -0
  272. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/statsmodels/__init__.py +0 -0
  273. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/model_validation/statsmodels/statsutils.py +0 -0
  274. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/ongoing_monitoring/FeatureDrift.py +0 -0
  275. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/ongoing_monitoring/PredictionAcrossEachFeature.py +0 -0
  276. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/ongoing_monitoring/PredictionCorrelation.py +0 -0
  277. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/ongoing_monitoring/TargetPredictionDistributionPlot.py +0 -0
  278. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/prompt_validation/Bias.py +0 -0
  279. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/prompt_validation/Clarity.py +0 -0
  280. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/prompt_validation/Conciseness.py +0 -0
  281. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/prompt_validation/Delimitation.py +0 -0
  282. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/prompt_validation/NegativeInstruction.py +0 -0
  283. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/prompt_validation/Robustness.py +0 -0
  284. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/prompt_validation/Specificity.py +0 -0
  285. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/prompt_validation/__init__.py +0 -0
  286. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/prompt_validation/ai_powered_test.py +0 -0
  287. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/test_providers.py +0 -0
  288. {validmind-2.6.10 → validmind-2.7.2}/validmind/tests/utils.py +0 -0
  289. {validmind-2.6.10 → validmind-2.7.2}/validmind/unit_metrics/__init__.py +0 -0
  290. {validmind-2.6.10 → validmind-2.7.2}/validmind/unit_metrics/classification/Accuracy.py +0 -0
  291. {validmind-2.6.10 → validmind-2.7.2}/validmind/unit_metrics/classification/F1.py +0 -0
  292. {validmind-2.6.10 → validmind-2.7.2}/validmind/unit_metrics/classification/Precision.py +0 -0
  293. {validmind-2.6.10 → validmind-2.7.2}/validmind/unit_metrics/classification/ROC_AUC.py +0 -0
  294. {validmind-2.6.10 → validmind-2.7.2}/validmind/unit_metrics/classification/Recall.py +0 -0
  295. {validmind-2.6.10 → validmind-2.7.2}/validmind/unit_metrics/regression/AdjustedRSquaredScore.py +0 -0
  296. {validmind-2.6.10 → validmind-2.7.2}/validmind/unit_metrics/regression/GiniCoefficient.py +0 -0
  297. {validmind-2.6.10 → validmind-2.7.2}/validmind/unit_metrics/regression/HuberLoss.py +0 -0
  298. {validmind-2.6.10 → validmind-2.7.2}/validmind/unit_metrics/regression/KolmogorovSmirnovStatistic.py +0 -0
  299. {validmind-2.6.10 → validmind-2.7.2}/validmind/unit_metrics/regression/MeanAbsoluteError.py +0 -0
  300. {validmind-2.6.10 → validmind-2.7.2}/validmind/unit_metrics/regression/MeanAbsolutePercentageError.py +0 -0
  301. {validmind-2.6.10 → validmind-2.7.2}/validmind/unit_metrics/regression/MeanBiasDeviation.py +0 -0
  302. {validmind-2.6.10 → validmind-2.7.2}/validmind/unit_metrics/regression/MeanSquaredError.py +0 -0
  303. {validmind-2.6.10 → validmind-2.7.2}/validmind/unit_metrics/regression/QuantileLoss.py +0 -0
  304. {validmind-2.6.10 → validmind-2.7.2}/validmind/unit_metrics/regression/RSquaredScore.py +0 -0
  305. {validmind-2.6.10 → validmind-2.7.2}/validmind/unit_metrics/regression/RootMeanSquaredError.py +0 -0
  306. {validmind-2.6.10 → validmind-2.7.2}/validmind/vm_models/__init__.py +0 -0
  307. {validmind-2.6.10 → validmind-2.7.2}/validmind/vm_models/dataset/__init__.py +0 -0
  308. {validmind-2.6.10 → validmind-2.7.2}/validmind/vm_models/dataset/dataset.py +0 -0
  309. {validmind-2.6.10 → validmind-2.7.2}/validmind/vm_models/dataset/utils.py +0 -0
  310. {validmind-2.6.10 → validmind-2.7.2}/validmind/vm_models/input.py +0 -0
  311. {validmind-2.6.10 → validmind-2.7.2}/validmind/vm_models/model.py +0 -0
  312. {validmind-2.6.10 → validmind-2.7.2}/validmind/vm_models/result/result.jinja +0 -0
  313. {validmind-2.6.10 → validmind-2.7.2}/validmind/vm_models/result/utils.py +0 -0
  314. {validmind-2.6.10 → validmind-2.7.2}/validmind/vm_models/test_suite/runner.py +0 -0
  315. {validmind-2.6.10 → validmind-2.7.2}/validmind/vm_models/test_suite/summary.py +0 -0
  316. {validmind-2.6.10 → validmind-2.7.2}/validmind/vm_models/test_suite/test.py +0 -0
  317. {validmind-2.6.10 → validmind-2.7.2}/validmind/vm_models/test_suite/test_suite.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: validmind
3
- Version: 2.6.10
3
+ Version: 2.7.2
4
4
  Summary: ValidMind Library
5
5
  License: Commercial License
6
6
  Author: Andres Rodriguez
@@ -10,7 +10,7 @@ description = "ValidMind Library"
10
10
  license = "Commercial License"
11
11
  name = "validmind"
12
12
  readme = "README.pypi.md"
13
- version = "2.6.10"
13
+ version = "2.7.2"
14
14
 
15
15
  [tool.poetry.dependencies]
16
16
  aiohttp = {extras = ["speedups"], version = "*"}
@@ -50,6 +50,7 @@ from .client import ( # noqa: E402
50
50
  run_test_suite,
51
51
  )
52
52
  from .tests.decorator import tags, tasks, test
53
+ from .vm_models.result import RawData
53
54
 
54
55
  __all__ = [ # noqa
55
56
  "__version__",
@@ -62,6 +63,7 @@ __all__ = [ # noqa
62
63
  "init_model",
63
64
  "init_r_model",
64
65
  "preview_template",
66
+ "RawData",
65
67
  "reload",
66
68
  "run_documentation_tests",
67
69
  "run_test_suite",
@@ -0,0 +1 @@
1
+ __version__ = "2.7.2"
@@ -6,7 +6,7 @@ import numpy as np
6
6
  import plotly.graph_objects as go
7
7
  from sklearn.metrics import roc_auc_score, roc_curve
8
8
 
9
- from validmind import tags, tasks
9
+ from validmind import RawData, tags, tasks
10
10
  from validmind.errors import SkipTestError
11
11
  from validmind.vm_models import VMDataset, VMModel
12
12
 
@@ -77,28 +77,31 @@ def ROCCurve(model: VMModel, dataset: VMDataset):
77
77
  fpr, tpr, _ = roc_curve(y_true, y_prob, drop_intermediate=False)
78
78
  auc = roc_auc_score(y_true, y_prob)
79
79
 
80
- return go.Figure(
81
- data=[
82
- go.Scatter(
83
- x=fpr,
84
- y=tpr,
85
- mode="lines",
86
- name=f"ROC curve (AUC = {auc:.2f})",
87
- line=dict(color="#DE257E"),
80
+ return (
81
+ RawData(fpr=fpr, tpr=tpr, auc=auc),
82
+ go.Figure(
83
+ data=[
84
+ go.Scatter(
85
+ x=fpr,
86
+ y=tpr,
87
+ mode="lines",
88
+ name=f"ROC curve (AUC = {auc:.2f})",
89
+ line=dict(color="#DE257E"),
90
+ ),
91
+ go.Scatter(
92
+ x=[0, 1],
93
+ y=[0, 1],
94
+ mode="lines",
95
+ name="Random (AUC = 0.5)",
96
+ line=dict(color="grey", dash="dash"),
97
+ ),
98
+ ],
99
+ layout=go.Layout(
100
+ title=f"ROC Curve for {model.input_id} on {dataset.input_id}",
101
+ xaxis=dict(title="False Positive Rate"),
102
+ yaxis=dict(title="True Positive Rate"),
103
+ width=700,
104
+ height=500,
88
105
  ),
89
- go.Scatter(
90
- x=[0, 1],
91
- y=[0, 1],
92
- mode="lines",
93
- name="Random (AUC = 0.5)",
94
- line=dict(color="grey", dash="dash"),
95
- ),
96
- ],
97
- layout=go.Layout(
98
- title=f"ROC Curve for {model.input_id} on {dataset.input_id}",
99
- xaxis=dict(title="False Positive Rate"),
100
- yaxis=dict(title="True Positive Rate"),
101
- width=700,
102
- height=500,
103
106
  ),
104
107
  )
@@ -15,7 +15,7 @@ from validmind.vm_models.figure import (
15
15
  is_plotly_figure,
16
16
  is_png_image,
17
17
  )
18
- from validmind.vm_models.result import ResultTable, TestResult
18
+ from validmind.vm_models.result import RawData, ResultTable, TestResult
19
19
 
20
20
 
21
21
  class OutputHandler(ABC):
@@ -103,6 +103,14 @@ class TableOutputHandler(OutputHandler):
103
103
  result.add_table(ResultTable(data=table_data, title=table_name or None))
104
104
 
105
105
 
106
+ class RawDataOutputHandler(OutputHandler):
107
+ def can_handle(self, item: Any) -> bool:
108
+ return isinstance(item, RawData)
109
+
110
+ def process(self, item: Any, result: TestResult) -> None:
111
+ result.raw_data = item
112
+
113
+
106
114
  def process_output(item: Any, result: TestResult) -> None:
107
115
  """Process a single test output item and update the TestResult."""
108
116
  handlers = [
@@ -110,6 +118,7 @@ def process_output(item: Any, result: TestResult) -> None:
110
118
  MetricOutputHandler(),
111
119
  FigureOutputHandler(),
112
120
  TableOutputHandler(),
121
+ RawDataOutputHandler(),
113
122
  ]
114
123
 
115
124
  for handler in handlers:
@@ -7,7 +7,7 @@ import subprocess
7
7
  import time
8
8
  from datetime import datetime
9
9
  from inspect import getdoc
10
- from typing import Any, Dict, List, Optional, Tuple, Union
10
+ from typing import Any, Callable, Dict, List, Optional, Tuple, Union
11
11
  from uuid import uuid4
12
12
 
13
13
  from validmind import __version__
@@ -136,6 +136,7 @@ def build_test_result(
136
136
  test_id: str,
137
137
  inputs: Dict[str, Union[VMInput, List[VMInput]]],
138
138
  params: Union[Dict[str, Any], None],
139
+ doc: str,
139
140
  description: str,
140
141
  generate_description: bool = True,
141
142
  title: Optional[str] = None,
@@ -149,6 +150,7 @@ def build_test_result(
149
150
  ref_id=ref_id,
150
151
  inputs=inputs,
151
152
  params=params if params else None, # None if empty dict or None
153
+ doc=doc,
152
154
  )
153
155
 
154
156
  if not isinstance(outputs, tuple):
@@ -199,6 +201,11 @@ def _run_composite_test(
199
201
  if not all(result.metric is not None for result in results):
200
202
  raise ValueError("All tests must return a metric when used as a composite test")
201
203
 
204
+ # Create composite doc from all test results
205
+ composite_doc = "\n\n".join(
206
+ [f"{test_id_to_name(result.result_id)}:\n{result.doc}" for result in results]
207
+ )
208
+
202
209
  return build_test_result(
203
210
  outputs=[
204
211
  {
@@ -210,6 +217,7 @@ def _run_composite_test(
210
217
  test_id=test_id,
211
218
  inputs=results[0].inputs,
212
219
  params=results[0].params,
220
+ doc=composite_doc,
213
221
  description="\n\n".join(
214
222
  [_test_description(result.description, num_lines=1) for result in results]
215
223
  ), # join truncated (first line only) test descriptions
@@ -261,11 +269,22 @@ def _run_comparison_test(
261
269
 
262
270
  combined_outputs, combined_inputs, combined_params = combine_results(results)
263
271
 
272
+ if unit_metrics:
273
+ doc = "\n\n".join(
274
+ [
275
+ f"{test_id_to_name(unit_metric)}:\n{getdoc(load_test(unit_metric))}"
276
+ for unit_metric in unit_metrics
277
+ ]
278
+ )
279
+ else:
280
+ doc = getdoc(load_test(test_id))
281
+
264
282
  return build_test_result(
265
283
  outputs=tuple(combined_outputs),
266
284
  test_id=test_id,
267
285
  inputs=combined_inputs,
268
286
  params=combined_params,
287
+ doc=doc,
269
288
  description=description,
270
289
  generate_description=generate_description,
271
290
  title=title,
@@ -283,6 +302,7 @@ def run_test(
283
302
  show: bool = True,
284
303
  generate_description: bool = True,
285
304
  title: Optional[str] = None,
305
+ post_process_fn: Union[Callable[[TestResult], None], None] = None,
286
306
  **kwargs,
287
307
  ) -> TestResult:
288
308
  """Run a ValidMind or custom test
@@ -306,6 +326,7 @@ def run_test(
306
326
  show (bool, optional): Whether to display results. Defaults to True.
307
327
  generate_description (bool, optional): Whether to generate a description. Defaults to True.
308
328
  title (str, optional): Custom title for the test result
329
+ post_process_fn (Callable[[TestResult], None], optional): Function to post-process the test result
309
330
 
310
331
  Returns:
311
332
  TestResult: A TestResult object containing the test results
@@ -381,12 +402,15 @@ def run_test(
381
402
 
382
403
  raw_result = test_func(**input_kwargs, **param_kwargs)
383
404
 
405
+ doc = getdoc(test_func)
406
+
384
407
  result = build_test_result(
385
408
  outputs=raw_result,
386
409
  test_id=test_id,
387
410
  inputs=input_kwargs,
388
411
  params=param_kwargs,
389
- description=getdoc(test_func),
412
+ doc=doc,
413
+ description=doc,
390
414
  generate_description=generate_description,
391
415
  title=title,
392
416
  )
@@ -394,6 +418,9 @@ def run_test(
394
418
  end_time = time.perf_counter()
395
419
  result.metadata = _get_run_metadata(duration_seconds=end_time - start_time)
396
420
 
421
+ if post_process_fn:
422
+ result = post_process_fn(result)
423
+
397
424
  if show:
398
425
  result.show()
399
426
 
@@ -168,6 +168,17 @@ class NumpyEncoder(json.JSONEncoder):
168
168
  return super().iterencode(obj, _one_shot)
169
169
 
170
170
 
171
+ class HumanReadableEncoder(NumpyEncoder):
172
+ def __init__(self, *args, **kwargs):
173
+ super().__init__(*args, **kwargs)
174
+ # truncate ndarrays to 10 items
175
+ self.type_handlers[self.is_numpy_ndarray] = lambda obj: (
176
+ obj.tolist()[:5] + ["..."] + obj.tolist()[-5:]
177
+ if len(obj) > 10
178
+ else obj.tolist()
179
+ )
180
+
181
+
171
182
  def get_full_typename(o: Any) -> Any:
172
183
  """We determine types based on type names so we don't have to import
173
184
  (and therefore depend on) PyTorch, TensorFlow, etc.
@@ -33,6 +33,18 @@ def is_png_image(figure) -> bool:
33
33
  return isinstance(figure, bytes)
34
34
 
35
35
 
36
+ def create_figure(
37
+ figure: Union[matplotlib.figure.Figure, go.Figure, go.FigureWidget, bytes],
38
+ key: str,
39
+ ref_id: str,
40
+ ) -> "Figure":
41
+ """Create a VM Figure object from a raw figure object"""
42
+ if is_matplotlib_figure(figure) or is_plotly_figure(figure) or is_png_image(figure):
43
+ return Figure(key=key, figure=figure, ref_id=ref_id)
44
+
45
+ raise ValueError(f"Unsupported figure type: {type(figure)}")
46
+
47
+
36
48
  @dataclass
37
49
  class Figure:
38
50
  """
@@ -55,6 +67,9 @@ class Figure:
55
67
  ):
56
68
  self.figure = go.FigureWidget(self.figure)
57
69
 
70
+ def __repr__(self):
71
+ return f"Figure(key={self.key}, ref_id={self.ref_id})"
72
+
58
73
  def to_widget(self):
59
74
  """
60
75
  Returns the ipywidget compatible representation of the figure. Ideally
@@ -2,6 +2,6 @@
2
2
  # See the LICENSE file in the root of this repository for details.
3
3
  # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial
4
4
 
5
- from .result import ErrorResult, Result, ResultTable, TestResult
5
+ from .result import ErrorResult, RawData, Result, ResultTable, TestResult
6
6
 
7
- __all__ = ["ErrorResult", "Result", "ResultTable", "TestResult"]
7
+ __all__ = ["ErrorResult", "RawData", "Result", "ResultTable", "TestResult"]
@@ -12,14 +12,22 @@ from dataclasses import dataclass
12
12
  from typing import Any, Dict, List, Optional, Union
13
13
  from uuid import uuid4
14
14
 
15
+ import matplotlib
15
16
  import pandas as pd
17
+ import plotly.graph_objs as go
16
18
  from ipywidgets import HTML, VBox
17
19
 
18
20
  from ... import api_client
19
21
  from ...ai.utils import DescriptionFuture
20
22
  from ...logging import get_logger
21
- from ...utils import NumpyEncoder, display, run_async, test_id_to_name
22
- from ..figure import Figure
23
+ from ...utils import (
24
+ HumanReadableEncoder,
25
+ NumpyEncoder,
26
+ display,
27
+ run_async,
28
+ test_id_to_name,
29
+ )
30
+ from ..figure import Figure, create_figure
23
31
  from ..input import VMInput
24
32
  from .utils import (
25
33
  AI_REVISION_NAME,
@@ -34,6 +42,42 @@ from .utils import (
34
42
  logger = get_logger(__name__)
35
43
 
36
44
 
45
+ class RawData:
46
+ """Holds raw data for a test result"""
47
+
48
+ def __init__(self, log: bool = False, **kwargs):
49
+ """Create a new RawData object
50
+
51
+ Args:
52
+ log (bool): If True, log the raw data to ValidMind
53
+ **kwargs: Keyword arguments to set as attributes e.g.
54
+ `RawData(log=True, dataset_duplicates=df_duplicates)`
55
+ """
56
+ self.log = log
57
+
58
+ for key, value in kwargs.items():
59
+ setattr(self, key, value)
60
+
61
+ def __repr__(self) -> str:
62
+ return f"RawData({', '.join(self.__dict__.keys())})"
63
+
64
+ def inspect(self, show: bool = True):
65
+ """Inspect the raw data"""
66
+ raw_data = {
67
+ key: getattr(self, key)
68
+ for key in self.__dict__
69
+ if not key.startswith("_") and key != "log"
70
+ }
71
+
72
+ if not show:
73
+ return raw_data
74
+
75
+ print(json.dumps(raw_data, indent=2, cls=HumanReadableEncoder))
76
+
77
+ def serialize(self):
78
+ return {key: getattr(self, key) for key in self.__dict__}
79
+
80
+
37
81
  @dataclass
38
82
  class ResultTable:
39
83
  """
@@ -41,7 +85,7 @@ class ResultTable:
41
85
  """
42
86
 
43
87
  data: Union[List[Any], pd.DataFrame]
44
- title: str
88
+ title: Optional[str] = None
45
89
 
46
90
  def __repr__(self) -> str:
47
91
  return f'ResultTable(title="{self.title}")' if self.title else "ResultTable"
@@ -115,15 +159,16 @@ class TestResult(Result):
115
159
  name: str = "Test Result"
116
160
  ref_id: str = None
117
161
  title: Optional[str] = None
162
+ doc: Optional[str] = None
118
163
  description: Optional[Union[str, DescriptionFuture]] = None
119
164
  metric: Optional[Union[int, float]] = None
120
165
  tables: Optional[List[ResultTable]] = None
166
+ raw_data: Optional[RawData] = None
121
167
  figures: Optional[List[Figure]] = None
122
168
  passed: Optional[bool] = None
123
169
  params: Optional[Dict[str, Any]] = None
124
170
  inputs: Optional[Dict[str, Union[List[VMInput], VMInput]]] = None
125
171
  metadata: Optional[Dict[str, Any]] = None
126
- title: Optional[str] = None
127
172
  _was_description_generated: bool = False
128
173
  _unsafe: bool = False
129
174
 
@@ -136,6 +181,7 @@ class TestResult(Result):
136
181
  attrs = [
137
182
  attr
138
183
  for attr in [
184
+ "doc",
139
185
  "description",
140
186
  "params",
141
187
  "tables",
@@ -144,6 +190,11 @@ class TestResult(Result):
144
190
  "passed",
145
191
  ]
146
192
  if getattr(self, attr) is not None
193
+ and (
194
+ len(getattr(self, attr)) > 0
195
+ if isinstance(getattr(self, attr), list)
196
+ else True
197
+ )
147
198
  ]
148
199
 
149
200
  return f'TestResult("{self.result_id}", {", ".join(attrs)})'
@@ -164,21 +215,82 @@ class TestResult(Result):
164
215
 
165
216
  return list(inputs.values())
166
217
 
167
- def add_table(self, table: ResultTable):
218
+ def add_table(
219
+ self,
220
+ table: Union[ResultTable, pd.DataFrame, List[Dict[str, Any]]],
221
+ title: Optional[str] = None,
222
+ ):
223
+ """Add a new table to the result
224
+
225
+ Args:
226
+ table (Union[ResultTable, pd.DataFrame, List[Dict[str, Any]]]): The table to add
227
+ title (Optional[str]): The title of the table (can optionally be provided for
228
+ pd.DataFrame and List[Dict[str, Any]] tables)
229
+ """
168
230
  if self.tables is None:
169
231
  self.tables = []
170
232
 
233
+ if isinstance(table, (pd.DataFrame, list)):
234
+ table = ResultTable(data=table, title=title)
235
+
171
236
  self.tables.append(table)
172
237
 
173
- def add_figure(self, figure: Figure):
238
+ def remove_table(self, index: int):
239
+ """Remove a table from the result by index
240
+
241
+ Args:
242
+ index (int): The index of the table to remove (default is 0)
243
+ """
244
+ if self.tables is None:
245
+ return
246
+
247
+ self.tables.pop(index)
248
+
249
+ def add_figure(
250
+ self,
251
+ figure: Union[
252
+ matplotlib.figure.Figure,
253
+ go.Figure,
254
+ go.FigureWidget,
255
+ bytes,
256
+ Figure,
257
+ ],
258
+ ):
259
+ """Add a new figure to the result
260
+
261
+ Args:
262
+ figure (Union[matplotlib.figure.Figure, go.Figure, go.FigureWidget,
263
+ bytes, Figure]): The figure to add (can be either a VM Figure object,
264
+ a raw figure object from the supported libraries, or a png image as
265
+ raw bytes)
266
+ """
174
267
  if self.figures is None:
175
268
  self.figures = []
176
269
 
270
+ if not isinstance(figure, Figure):
271
+ random_tag = str(uuid4())[:4]
272
+ figure = create_figure(
273
+ figure=figure,
274
+ ref_id=self.ref_id,
275
+ key=f"{self.result_id}:{random_tag}",
276
+ )
277
+
177
278
  if figure.ref_id != self.ref_id:
178
279
  figure.ref_id = self.ref_id
179
280
 
180
281
  self.figures.append(figure)
181
282
 
283
+ def remove_figure(self, index: int = 0):
284
+ """Remove a figure from the result by index
285
+
286
+ Args:
287
+ index (int): The index of the figure to remove (default is 0)
288
+ """
289
+ if self.figures is None:
290
+ return
291
+
292
+ self.figures.pop(index)
293
+
182
294
  def to_widget(self):
183
295
  if isinstance(self.description, DescriptionFuture):
184
296
  self.description = self.description.get_description()
@@ -1 +0,0 @@
1
- __version__ = "2.6.10"
File without changes
File without changes