From 5eaed7a4ada92662b9436433f82f59c20413e49f Mon Sep 17 00:00:00 2001 From: John Walz Date: Tue, 14 Jan 2025 11:49:07 -0500 Subject: [PATCH 1/2] feat: adding support for mathjax --- poetry.lock | 36 ++++--------------- pyproject.toml | 1 - .../datasets/credit_risk/lending_club.py | 7 ++-- validmind/html_templates/content_blocks.py | 23 +++--------- validmind/tests/__types__.py | 17 +++++++++ .../data_validation/MutualInformation.py | 1 + .../data_validation/ScoreBandDefaultRates.py | 3 +- .../sklearn/CalibrationCurve.py | 5 +-- .../ClassifierThresholdOptimization.py | 7 ++-- .../sklearn/HyperParametersTuning.py | 9 +++-- .../sklearn/ModelParameters.py | 1 + .../sklearn/ScoreProbabilityAlignment.py | 3 +- .../CalibrationCurveDrift.py | 4 ++- .../ClassDiscriminationDrift.py | 6 ++-- .../ongoing_monitoring/ClassImbalanceDrift.py | 6 ++-- .../ClassificationAccuracyDrift.py | 4 ++- .../ConfusionMatrixDrift.py | 4 ++- .../CumulativePredictionProbabilitiesDrift.py | 4 ++- .../tests/ongoing_monitoring/FeatureDrift.py | 1 + .../PredictionCorrelation.py | 1 + .../PredictionProbabilitiesHistogramDrift.py | 4 ++- .../PredictionQuantilesAcrossFeatures.py | 1 + .../tests/ongoing_monitoring/ROCCurveDrift.py | 5 +-- .../ongoing_monitoring/ScoreBandsDrift.py | 6 ++-- .../ScorecardHistogramDrift.py | 4 ++- .../TargetPredictionDistributionPlot.py | 7 ++-- validmind/utils.py | 36 +++++++++---------- 27 files changed, 105 insertions(+), 101 deletions(-) diff --git a/poetry.lock b/poetry.lock index d30fc2cef..d1d3eb383 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1379,8 +1379,11 @@ name = "docutils" version = "0.18.1" description = "Docutils -- Python Documentation Utilities" optional = false -python-versions = "*" -files = [] +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "docutils-0.18.1-py2.py3-none-any.whl", hash = "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c"}, + {file = "docutils-0.18.1.tar.gz", hash = "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06"}, +] [[package]] name = "entrypoints" @@ -3087,17 +3090,6 @@ requests-toolbelt = ">=1.0.0,<2.0.0" [package.extras] langsmith-pyo3 = ["langsmith-pyo3 (>=0.1.0rc2,<0.2.0)"] -[[package]] -name = "latex2mathml" -version = "3.77.0" -description = "Pure Python library for LaTeX to MathML conversion" -optional = false -python-versions = ">=3.8.1,<4.0.0" -files = [ - {file = "latex2mathml-3.77.0-py3-none-any.whl", hash = "sha256:5531e18a2a9eae7c24e257118b6a444cbba253cd27ff3e81f1bd6c41e88e786e"}, - {file = "latex2mathml-3.77.0.tar.gz", hash = "sha256:e2f501d1878f2e489c3f6f12786bef74c62f712d2770f7f3c837eb20a55d0a1e"}, -] - [[package]] name = "llvmlite" version = "0.41.1" @@ -4132,7 +4124,6 @@ description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83"}, {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, ] @@ -4317,8 +4308,8 @@ files = [ [package.dependencies] numpy = [ {version = ">=1.20.3", markers = "python_version < \"3.10\""}, - {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, {version = ">=1.21.0", markers = "python_version >= \"3.10\" and python_version < \"3.11\""}, + {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -4992,19 +4983,6 @@ files = [ {file = "pyarrow-17.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:392bc9feabc647338e6c89267635e111d71edad5fcffba204425a7c8d13610d7"}, {file = "pyarrow-17.0.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:af5ff82a04b2171415f1410cff7ebb79861afc5dae50be73ce06d6e870615204"}, {file = "pyarrow-17.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:edca18eaca89cd6382dfbcff3dd2d87633433043650c07375d095cd3517561d8"}, - {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c7916bff914ac5d4a8fe25b7a25e432ff921e72f6f2b7547d1e325c1ad9d155"}, - {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f553ca691b9e94b202ff741bdd40f6ccb70cdd5fbf65c187af132f1317de6145"}, - {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0cdb0e627c86c373205a2f94a510ac4376fdc523f8bb36beab2e7f204416163c"}, - {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:d7d192305d9d8bc9082d10f361fc70a73590a4c65cf31c3e6926cd72b76bc35c"}, - {file = "pyarrow-17.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:02dae06ce212d8b3244dd3e7d12d9c4d3046945a5933d28026598e9dbbda1fca"}, - {file = "pyarrow-17.0.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:13d7a460b412f31e4c0efa1148e1d29bdf18ad1411eb6757d38f8fbdcc8645fb"}, - {file = "pyarrow-17.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9b564a51fbccfab5a04a80453e5ac6c9954a9c5ef2890d1bcf63741909c3f8df"}, - {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32503827abbc5aadedfa235f5ece8c4f8f8b0a3cf01066bc8d29de7539532687"}, - {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a155acc7f154b9ffcc85497509bcd0d43efb80d6f733b0dc3bb14e281f131c8b"}, - {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:dec8d129254d0188a49f8a1fc99e0560dc1b85f60af729f47de4046015f9b0a5"}, - {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:a48ddf5c3c6a6c505904545c25a4ae13646ae1f8ba703c4df4a1bfe4f4006bda"}, - {file = "pyarrow-17.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:42bf93249a083aca230ba7e2786c5f673507fa97bbd9725a1e2754715151a204"}, - {file = "pyarrow-17.0.0.tar.gz", hash = "sha256:4beca9521ed2c0921c1023e68d097d0299b62c362639ea315572a58f3f50fd28"}, ] [package.dependencies] @@ -8163,4 +8141,4 @@ r-support = ["rpy2"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<3.12" -content-hash = "aac1de3da168e197391f731d946d203db30ddb24d98ae474689ec15b7563bde9" +content-hash = "dcf7a178278fe9d98b68e3848c39b537d5e088edeb93c53e29a9968ad9346d76" diff --git a/pyproject.toml b/pyproject.toml index 19fb51b10..e993c5266 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,7 +23,6 @@ ipywidgets = "*" kaleido = ">=0.2.1,!=0.2.1.post1" langchain-openai = {version = ">=0.1.8", optional = true} langdetect = "*" -latex2mathml = ">=3.77.0" llvmlite = {version = "*", python = ">=3.8,<=3.11"} matplotlib = "*" mistune = "^3.0.2" diff --git a/validmind/datasets/credit_risk/lending_club.py b/validmind/datasets/credit_risk/lending_club.py index 234b66031..d6bd535b3 100644 --- a/validmind/datasets/credit_risk/lending_club.py +++ b/validmind/datasets/credit_risk/lending_club.py @@ -2,20 +2,19 @@ # See the LICENSE file in the root of this repository for details. # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial +import logging import os import warnings -import logging + import numpy as np import pandas as pd import scorecardpy as sc import statsmodels.api as sm - import xgboost as xgb -import validmind as vm - from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split +import validmind as vm current_path = os.path.dirname(os.path.abspath(__file__)) dataset_path = os.path.join(current_path, "datasets") diff --git a/validmind/html_templates/content_blocks.py b/validmind/html_templates/content_blocks.py index 21d105537..1eeca8f53 100644 --- a/validmind/html_templates/content_blocks.py +++ b/validmind/html_templates/content_blocks.py @@ -112,25 +112,10 @@ """ # FIXME: this is a bit too hacky -math_jax_snippet = """ - +katex_snippet = """ + + + """ failed_content_block_html = """ diff --git a/validmind/tests/__types__.py b/validmind/tests/__types__.py index 0c637afb7..43346c41d 100644 --- a/validmind/tests/__types__.py +++ b/validmind/tests/__types__.py @@ -39,6 +39,7 @@ "validmind.data_validation.LaggedCorrelationHeatmap", "validmind.data_validation.MissingValues", "validmind.data_validation.MissingValuesBarPlot", + "validmind.data_validation.MutualInformation", "validmind.data_validation.PearsonCorrelationMatrix", "validmind.data_validation.PhillipsPerronArch", "validmind.data_validation.ProtectedClassesCombination", @@ -48,6 +49,7 @@ "validmind.data_validation.RollingStatsPlot", "validmind.data_validation.RunsTest", "validmind.data_validation.ScatterPlot", + "validmind.data_validation.ScoreBandDefaultRates", "validmind.data_validation.SeasonalDecompose", "validmind.data_validation.ShapiroWilk", "validmind.data_validation.Skewness", @@ -121,7 +123,9 @@ "validmind.model_validation.ragas.SemanticSimilarity", "validmind.model_validation.sklearn.AdjustedMutualInformation", "validmind.model_validation.sklearn.AdjustedRandIndex", + "validmind.model_validation.sklearn.CalibrationCurve", "validmind.model_validation.sklearn.ClassifierPerformance", + "validmind.model_validation.sklearn.ClassifierThresholdOptimization", "validmind.model_validation.sklearn.ClusterCosineSimilarity", "validmind.model_validation.sklearn.ClusterPerformanceMetrics", "validmind.model_validation.sklearn.CompletenessScore", @@ -134,6 +138,7 @@ "validmind.model_validation.sklearn.MinimumAccuracy", "validmind.model_validation.sklearn.MinimumF1Score", "validmind.model_validation.sklearn.MinimumROCAUCScore", + "validmind.model_validation.sklearn.ModelParameters", "validmind.model_validation.sklearn.ModelsPerformanceComparison", "validmind.model_validation.sklearn.OverfitDiagnosis", "validmind.model_validation.sklearn.PermutationFeatureImportance", @@ -147,6 +152,7 @@ "validmind.model_validation.sklearn.RegressionR2SquareComparison", "validmind.model_validation.sklearn.RobustnessDiagnosis", "validmind.model_validation.sklearn.SHAPGlobalImportance", + "validmind.model_validation.sklearn.ScoreProbabilityAlignment", "validmind.model_validation.sklearn.SilhouettePlot", "validmind.model_validation.sklearn.TrainingTestDegradation", "validmind.model_validation.sklearn.VMeasure", @@ -166,9 +172,20 @@ "validmind.model_validation.statsmodels.RegressionModelSummary", "validmind.model_validation.statsmodels.RegressionPermutationFeatureImportance", "validmind.model_validation.statsmodels.ScorecardHistogram", + "validmind.ongoing_monitoring.CalibrationCurveDrift", + "validmind.ongoing_monitoring.ClassDiscriminationDrift", + "validmind.ongoing_monitoring.ClassImbalanceDrift", + "validmind.ongoing_monitoring.ClassificationAccuracyDrift", + "validmind.ongoing_monitoring.ConfusionMatrixDrift", + "validmind.ongoing_monitoring.CumulativePredictionProbabilitiesDrift", "validmind.ongoing_monitoring.FeatureDrift", "validmind.ongoing_monitoring.PredictionAcrossEachFeature", "validmind.ongoing_monitoring.PredictionCorrelation", + "validmind.ongoing_monitoring.PredictionProbabilitiesHistogramDrift", + "validmind.ongoing_monitoring.PredictionQuantilesAcrossFeatures", + "validmind.ongoing_monitoring.ROCCurveDrift", + "validmind.ongoing_monitoring.ScoreBandsDrift", + "validmind.ongoing_monitoring.ScorecardHistogramDrift", "validmind.ongoing_monitoring.TargetPredictionDistributionPlot", "validmind.prompt_validation.Bias", "validmind.prompt_validation.Clarity", diff --git a/validmind/tests/data_validation/MutualInformation.py b/validmind/tests/data_validation/MutualInformation.py index 6358a5c1b..0f6cfbeb7 100644 --- a/validmind/tests/data_validation/MutualInformation.py +++ b/validmind/tests/data_validation/MutualInformation.py @@ -4,6 +4,7 @@ import plotly.graph_objects as go from sklearn.feature_selection import mutual_info_classif, mutual_info_regression + from validmind import tags, tasks from validmind.vm_models import VMDataset from validmind.vm_models.result import RawData diff --git a/validmind/tests/data_validation/ScoreBandDefaultRates.py b/validmind/tests/data_validation/ScoreBandDefaultRates.py index 567c07279..1f96b12a6 100644 --- a/validmind/tests/data_validation/ScoreBandDefaultRates.py +++ b/validmind/tests/data_validation/ScoreBandDefaultRates.py @@ -2,8 +2,9 @@ # See the LICENSE file in the root of this repository for details. # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial -import pandas as pd import numpy as np +import pandas as pd + from validmind import tags, tasks from validmind.vm_models import VMDataset, VMModel diff --git a/validmind/tests/model_validation/sklearn/CalibrationCurve.py b/validmind/tests/model_validation/sklearn/CalibrationCurve.py index 71739bbb8..0792f62a5 100644 --- a/validmind/tests/model_validation/sklearn/CalibrationCurve.py +++ b/validmind/tests/model_validation/sklearn/CalibrationCurve.py @@ -2,10 +2,11 @@ # See the LICENSE file in the root of this repository for details. # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial -from sklearn.calibration import calibration_curve import plotly.graph_objects as go +from sklearn.calibration import calibration_curve + from validmind import tags, tasks -from validmind.vm_models import VMModel, VMDataset +from validmind.vm_models import VMDataset, VMModel from validmind.vm_models.result import RawData diff --git a/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.py b/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.py index 1cdc62998..0a4d4f442 100644 --- a/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.py +++ b/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.py @@ -6,11 +6,8 @@ import pandas as pd import plotly.graph_objects as go from plotly.subplots import make_subplots -from sklearn.metrics import ( - roc_curve, - precision_recall_curve, - confusion_matrix, -) +from sklearn.metrics import confusion_matrix, precision_recall_curve, roc_curve + from validmind import tags, tasks from validmind.vm_models import VMDataset, VMModel diff --git a/validmind/tests/model_validation/sklearn/HyperParametersTuning.py b/validmind/tests/model_validation/sklearn/HyperParametersTuning.py index 1e9e30acf..dd90a44af 100644 --- a/validmind/tests/model_validation/sklearn/HyperParametersTuning.py +++ b/validmind/tests/model_validation/sklearn/HyperParametersTuning.py @@ -2,9 +2,10 @@ # See the LICENSE file in the root of this repository for details. # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial -from typing import Union, Dict, List -from sklearn.model_selection import GridSearchCV +from typing import Dict, List, Union + from sklearn.metrics import make_scorer, recall_score +from sklearn.model_selection import GridSearchCV from validmind import tags, tasks from validmind.vm_models import VMDataset, VMModel @@ -24,7 +25,9 @@ def _get_metrics(scoring): return ( scoring if isinstance(scoring, list) - else list(scoring.keys()) if isinstance(scoring, dict) else [scoring] + else list(scoring.keys()) + if isinstance(scoring, dict) + else [scoring] ) diff --git a/validmind/tests/model_validation/sklearn/ModelParameters.py b/validmind/tests/model_validation/sklearn/ModelParameters.py index 62983d134..f24d83dd5 100644 --- a/validmind/tests/model_validation/sklearn/ModelParameters.py +++ b/validmind/tests/model_validation/sklearn/ModelParameters.py @@ -3,6 +3,7 @@ # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial import pandas as pd + from validmind import tags, tasks diff --git a/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.py b/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.py index dadb3e974..7246ca573 100644 --- a/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.py +++ b/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.py @@ -4,8 +4,9 @@ import pandas as pd import plotly.graph_objects as go + from validmind import tags, tasks -from validmind.vm_models import VMModel, VMDataset +from validmind.vm_models import VMDataset, VMModel @tags("visualization", "credit_risk", "calibration") diff --git a/validmind/tests/ongoing_monitoring/CalibrationCurveDrift.py b/validmind/tests/ongoing_monitoring/CalibrationCurveDrift.py index 257cf5ff2..872d92238 100644 --- a/validmind/tests/ongoing_monitoring/CalibrationCurveDrift.py +++ b/validmind/tests/ongoing_monitoring/CalibrationCurveDrift.py @@ -2,11 +2,13 @@ # See the LICENSE file in the root of this repository for details. # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial +from typing import List + import numpy as np import pandas as pd import plotly.graph_objects as go from sklearn.calibration import calibration_curve -from typing import List + from validmind import tags, tasks from validmind.errors import SkipTestError from validmind.vm_models import VMDataset, VMModel diff --git a/validmind/tests/ongoing_monitoring/ClassDiscriminationDrift.py b/validmind/tests/ongoing_monitoring/ClassDiscriminationDrift.py index c90a45a79..9e9e62cf4 100644 --- a/validmind/tests/ongoing_monitoring/ClassDiscriminationDrift.py +++ b/validmind/tests/ongoing_monitoring/ClassDiscriminationDrift.py @@ -2,12 +2,14 @@ # See the LICENSE file in the root of this repository for details. # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial +from typing import List + import numpy as np import pandas as pd +from scipy import stats from sklearn.metrics import roc_auc_score from sklearn.preprocessing import LabelBinarizer -from scipy import stats -from typing import List + from validmind import tags, tasks from validmind.vm_models import VMDataset, VMModel diff --git a/validmind/tests/ongoing_monitoring/ClassImbalanceDrift.py b/validmind/tests/ongoing_monitoring/ClassImbalanceDrift.py index a55879ea0..fa59efbf7 100644 --- a/validmind/tests/ongoing_monitoring/ClassImbalanceDrift.py +++ b/validmind/tests/ongoing_monitoring/ClassImbalanceDrift.py @@ -2,12 +2,14 @@ # See the LICENSE file in the root of this repository for details. # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial +from typing import List + import pandas as pd import plotly.graph_objs as go -from typing import List + from validmind import tags, tasks -from validmind.vm_models import VMDataset from validmind.errors import SkipTestError +from validmind.vm_models import VMDataset @tags("tabular_data", "binary_classification", "multiclass_classification") diff --git a/validmind/tests/ongoing_monitoring/ClassificationAccuracyDrift.py b/validmind/tests/ongoing_monitoring/ClassificationAccuracyDrift.py index 819d284be..37bc97119 100644 --- a/validmind/tests/ongoing_monitoring/ClassificationAccuracyDrift.py +++ b/validmind/tests/ongoing_monitoring/ClassificationAccuracyDrift.py @@ -2,10 +2,12 @@ # See the LICENSE file in the root of this repository for details. # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial +from typing import List + import numpy as np import pandas as pd from sklearn.metrics import classification_report -from typing import List + from validmind import tags, tasks from validmind.vm_models import VMDataset, VMModel diff --git a/validmind/tests/ongoing_monitoring/ConfusionMatrixDrift.py b/validmind/tests/ongoing_monitoring/ConfusionMatrixDrift.py index 766c716c0..7579f81dc 100644 --- a/validmind/tests/ongoing_monitoring/ConfusionMatrixDrift.py +++ b/validmind/tests/ongoing_monitoring/ConfusionMatrixDrift.py @@ -2,10 +2,12 @@ # See the LICENSE file in the root of this repository for details. # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial +from typing import List + import numpy as np import pandas as pd from sklearn.metrics import confusion_matrix -from typing import List + from validmind import tags, tasks from validmind.vm_models import VMDataset, VMModel diff --git a/validmind/tests/ongoing_monitoring/CumulativePredictionProbabilitiesDrift.py b/validmind/tests/ongoing_monitoring/CumulativePredictionProbabilitiesDrift.py index 0ad7100b8..32b03db43 100644 --- a/validmind/tests/ongoing_monitoring/CumulativePredictionProbabilitiesDrift.py +++ b/validmind/tests/ongoing_monitoring/CumulativePredictionProbabilitiesDrift.py @@ -2,10 +2,12 @@ # See the LICENSE file in the root of this repository for details. # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial +from typing import List + import numpy as np import plotly.graph_objects as go from plotly.subplots import make_subplots -from typing import List + from validmind import tags, tasks from validmind.vm_models import VMDataset, VMModel diff --git a/validmind/tests/ongoing_monitoring/FeatureDrift.py b/validmind/tests/ongoing_monitoring/FeatureDrift.py index c864903e6..9b3ee571a 100644 --- a/validmind/tests/ongoing_monitoring/FeatureDrift.py +++ b/validmind/tests/ongoing_monitoring/FeatureDrift.py @@ -5,6 +5,7 @@ import numpy as np import pandas as pd import plotly.graph_objects as go + from validmind import tags, tasks diff --git a/validmind/tests/ongoing_monitoring/PredictionCorrelation.py b/validmind/tests/ongoing_monitoring/PredictionCorrelation.py index f8f366ba3..4c5f53c12 100644 --- a/validmind/tests/ongoing_monitoring/PredictionCorrelation.py +++ b/validmind/tests/ongoing_monitoring/PredictionCorrelation.py @@ -4,6 +4,7 @@ import pandas as pd import plotly.graph_objects as go + from validmind import tags, tasks diff --git a/validmind/tests/ongoing_monitoring/PredictionProbabilitiesHistogramDrift.py b/validmind/tests/ongoing_monitoring/PredictionProbabilitiesHistogramDrift.py index d519d5af6..60a435b99 100644 --- a/validmind/tests/ongoing_monitoring/PredictionProbabilitiesHistogramDrift.py +++ b/validmind/tests/ongoing_monitoring/PredictionProbabilitiesHistogramDrift.py @@ -2,12 +2,14 @@ # See the LICENSE file in the root of this repository for details. # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial +from typing import List + import numpy as np import pandas as pd import plotly.graph_objects as go from plotly.subplots import make_subplots from scipy import stats -from typing import List + from validmind import tags, tasks from validmind.vm_models import VMDataset, VMModel diff --git a/validmind/tests/ongoing_monitoring/PredictionQuantilesAcrossFeatures.py b/validmind/tests/ongoing_monitoring/PredictionQuantilesAcrossFeatures.py index ecd3dd926..9d24dfc91 100644 --- a/validmind/tests/ongoing_monitoring/PredictionQuantilesAcrossFeatures.py +++ b/validmind/tests/ongoing_monitoring/PredictionQuantilesAcrossFeatures.py @@ -4,6 +4,7 @@ import plotly.graph_objects as go from plotly.subplots import make_subplots + from validmind import tags, tasks diff --git a/validmind/tests/ongoing_monitoring/ROCCurveDrift.py b/validmind/tests/ongoing_monitoring/ROCCurveDrift.py index 3f783a563..a01b82bfc 100644 --- a/validmind/tests/ongoing_monitoring/ROCCurveDrift.py +++ b/validmind/tests/ongoing_monitoring/ROCCurveDrift.py @@ -2,15 +2,16 @@ # See the LICENSE file in the root of this repository for details. # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial +from typing import List + import numpy as np import plotly.graph_objects as go from sklearn.metrics import roc_auc_score, roc_curve + from validmind import tags, tasks from validmind.errors import SkipTestError from validmind.vm_models import VMDataset, VMModel -from typing import List - @tags( "sklearn", diff --git a/validmind/tests/ongoing_monitoring/ScoreBandsDrift.py b/validmind/tests/ongoing_monitoring/ScoreBandsDrift.py index c820b7e4b..2e9b8f76a 100644 --- a/validmind/tests/ongoing_monitoring/ScoreBandsDrift.py +++ b/validmind/tests/ongoing_monitoring/ScoreBandsDrift.py @@ -2,9 +2,11 @@ # See the LICENSE file in the root of this repository for details. # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial -import pandas as pd -import numpy as np from typing import List + +import numpy as np +import pandas as pd + from validmind import tags, tasks from validmind.vm_models import VMDataset, VMModel diff --git a/validmind/tests/ongoing_monitoring/ScorecardHistogramDrift.py b/validmind/tests/ongoing_monitoring/ScorecardHistogramDrift.py index fe82416eb..09aa43491 100644 --- a/validmind/tests/ongoing_monitoring/ScorecardHistogramDrift.py +++ b/validmind/tests/ongoing_monitoring/ScorecardHistogramDrift.py @@ -2,12 +2,14 @@ # See the LICENSE file in the root of this repository for details. # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial +from typing import List + import numpy as np import pandas as pd import plotly.graph_objects as go from plotly.subplots import make_subplots from scipy import stats -from typing import List + from validmind import tags, tasks from validmind.vm_models import VMDataset diff --git a/validmind/tests/ongoing_monitoring/TargetPredictionDistributionPlot.py b/validmind/tests/ongoing_monitoring/TargetPredictionDistributionPlot.py index c6cce82c7..eab0e8a7c 100644 --- a/validmind/tests/ongoing_monitoring/TargetPredictionDistributionPlot.py +++ b/validmind/tests/ongoing_monitoring/TargetPredictionDistributionPlot.py @@ -2,10 +2,11 @@ # See the LICENSE file in the root of this repository for details. # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial -import plotly.graph_objects as go -import plotly.figure_factory as ff import pandas as pd -from scipy.stats import skew, kurtosis +import plotly.figure_factory as ff +import plotly.graph_objects as go +from scipy.stats import kurtosis, skew + from validmind import tags, tasks diff --git a/validmind/utils.py b/validmind/utils.py index e45325949..618757f06 100644 --- a/validmind/utils.py +++ b/validmind/utils.py @@ -23,13 +23,12 @@ from IPython.core import getipython from IPython.display import HTML from IPython.display import display as ipy_display -from latex2mathml.converter import convert from matplotlib.axes._axes import _log as matplotlib_axes_logger from numpy import ndarray from sklearn.exceptions import UndefinedMetricWarning from tabulate import tabulate -from .html_templates.content_blocks import math_jax_snippet, python_syntax_highlighting +from .html_templates.content_blocks import katex_snippet, python_syntax_highlighting from .logging import get_logger DEFAULT_BIG_NUMBER_DECIMALS = 2 @@ -491,15 +490,14 @@ def display(widget_or_html, syntax_highlighting=True, mathjax=True): ipy_display(HTML(widget_or_html)) # if html we can auto-detect if we actually need syntax highlighting or MathJax syntax_highlighting = 'class="language-' in widget_or_html - mathjax = "$$" in widget_or_html + # mathjax = "$$" in widget_or_html else: ipy_display(widget_or_html) if syntax_highlighting: ipy_display(HTML(python_syntax_highlighting)) - if mathjax: - ipy_display(HTML(math_jax_snippet)) + ipy_display(HTML(katex_snippet)) def md_to_html(md: str, mathml=False) -> str: @@ -510,22 +508,22 @@ def md_to_html(md: str, mathml=False) -> str: )(md) if not mathml: - # return the html as is (with latex that will be rendered by MathJax) return html - # convert the latex to MathML which CKeditor can render - math_block_pattern = re.compile(r'
\$\$([\s\S]*?)\$\$
') - html = math_block_pattern.sub( - lambda match: "

{}

".format(convert(match.group(1), display="block")), html - ) - - inline_math_pattern = re.compile(r'\\\((.*?)\\\)') - html = inline_math_pattern.sub( - lambda match: "{}".format( - convert(match.group(1), display="inline") - ), - html, - ) + # # convert the latex to katex which CKeditor can render + # math_block_pattern = re.compile(r'
\$\$([\s\S]*?)\$\$
') + # html = math_block_pattern.sub( + # lambda match: ''.format( + # match.group(1) + # ), + # html, + # ) + + # inline_math_pattern = re.compile(r'\\\((.*?)\\\)') + # html = inline_math_pattern.sub( + # lambda match: ''.format(match.group(1)), + # html, + # ) return html From 662067b7e8f175501f9c748bff813199a6167ece Mon Sep 17 00:00:00 2001 From: John Walz Date: Tue, 14 Jan 2025 16:09:43 -0500 Subject: [PATCH 2/2] fix: using mathjax instead of mathml --- validmind/html_templates/content_blocks.py | 25 ++++++++++++---- validmind/utils.py | 35 +++++++++++----------- 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/validmind/html_templates/content_blocks.py b/validmind/html_templates/content_blocks.py index 1eeca8f53..9adcab4ac 100644 --- a/validmind/html_templates/content_blocks.py +++ b/validmind/html_templates/content_blocks.py @@ -111,11 +111,26 @@ """ -# FIXME: this is a bit too hacky -katex_snippet = """ - - - +# have to dynamically load mathjax +math_jax_snippet = """ + """ failed_content_block_html = """ diff --git a/validmind/utils.py b/validmind/utils.py index 618757f06..affcc31c3 100644 --- a/validmind/utils.py +++ b/validmind/utils.py @@ -28,7 +28,7 @@ from sklearn.exceptions import UndefinedMetricWarning from tabulate import tabulate -from .html_templates.content_blocks import katex_snippet, python_syntax_highlighting +from .html_templates.content_blocks import math_jax_snippet, python_syntax_highlighting from .logging import get_logger DEFAULT_BIG_NUMBER_DECIMALS = 2 @@ -490,14 +490,15 @@ def display(widget_or_html, syntax_highlighting=True, mathjax=True): ipy_display(HTML(widget_or_html)) # if html we can auto-detect if we actually need syntax highlighting or MathJax syntax_highlighting = 'class="language-' in widget_or_html - # mathjax = "$$" in widget_or_html + mathjax = "math/tex" in widget_or_html else: ipy_display(widget_or_html) if syntax_highlighting: ipy_display(HTML(python_syntax_highlighting)) - ipy_display(HTML(katex_snippet)) + if mathjax: + ipy_display(HTML(math_jax_snippet)) def md_to_html(md: str, mathml=False) -> str: @@ -510,20 +511,20 @@ def md_to_html(md: str, mathml=False) -> str: if not mathml: return html - # # convert the latex to katex which CKeditor can render - # math_block_pattern = re.compile(r'
\$\$([\s\S]*?)\$\$
') - # html = math_block_pattern.sub( - # lambda match: ''.format( - # match.group(1) - # ), - # html, - # ) - - # inline_math_pattern = re.compile(r'\\\((.*?)\\\)') - # html = inline_math_pattern.sub( - # lambda match: ''.format(match.group(1)), - # html, - # ) + # convert the latex to mathjax + math_block_pattern = re.compile(r'
\$\$([\s\S]*?)\$\$
') + html = math_block_pattern.sub( + lambda match: ''.format( + match.group(1) + ), + html, + ) + + inline_math_pattern = re.compile(r'\\\((.*?)\\\)') + html = inline_math_pattern.sub( + lambda match: ''.format(match.group(1)), + html, + ) return html